文字に合ったテキストボックス

HTMLでテキストボックスを表示する方法にinputタグのtype属性にtextを設定する方法があります。

<input type="text">

しかし、文字の大きさや文字数、フォントを変更した際に文字が切れてしまうことがあり、そのような時のためにsize属性があります。入力する文字数が決まっている場合にはsizeを指定してあげることで、文字が切れる心配がなくなります。

<input type="text" size="5" value="5文字表示">

WordPressのCSSと競合しているようで上手く表示されませんが、このように記述することで、文字のサイズとテキストボックスの大きさをそろえることができます。

また、HTML5から利用できるようになったtype属性のnumberがあります。こちらは数値を入力するためのテキストボックスで右端の三角矢印を押すことで、数字を入れることもできます。しかし、こちらにはsize属性を指定することができません。

そこで、若干無理矢理ですが長さの単位にem(エム)を使用することで解決しようと思います。emは一文字分の長さを表す単位です。font-sizeの1pxは、文字の高さが1pxであることを示しています。font-sizeを1pxに設定しても文字の幅は1pxにならないためテキストボックスの横幅は1文字あたり0.67emぐらいに設定してみます。

<input type="number" style="width:4.27em;">


フォントやフォントサイズを変更するたびに横幅を指定し直すことはしたくないので、このような方法を取ることにしました。注意点としましては三角矢印の領域も横幅に含まれるようなので、実際には1〜3文字分程度多めに横幅を指定する必要がありそうです。

また、テキストボックスとは関係ありませんが、emを設定することで画面の大きさに応じて文字サイズを変更するといったこともできます。h1の文字の大きさが画面の大きさに合わせて自動で変わるようにCSSで記述します。

h1 {
  font-size: 3em;
  line-height: 1;
  margin-bottom: 0.5em;
}

html {
  font-size : 75%;
}

/*画面サイズ768px以上の時*/
@media screen and (min-width : 768px){
  html{ font-size : 87.5%;}
}

/*画面サイズ768px以上の時*/
@media screen and (min-width : 1024px) {
  html{ font-size : 100%};
}

この画面の大きさの区分は、スマートフォン、タブレット、PCの画面を基準に設定されています。

———————参考文献———————-
CSSで使用する単位一覧 http://www.tagindex.com/stylesheet/basic/length.html

画面遷移の方法 (HTML/CSS)

HTMLにおける画面遷移の方法には、formタグを使うものとaタグの属性でhref=””を設定する方法があるが、用途の違いを調べました。

formタグを使う場合

<form action="http//yamamoto.arkoak.com" method="get">
  次のページ
</form>

このように記述することで、formタグでくくった中にあるinputタグの値を次のページに引き渡すことができます。また、method属性の値をpostに設定することで、URLに引き渡す値を表示させずに渡すことが可能です。

Aタグ(アンカータグ)を使う場合

<a href="http//yamamoto.arkoak.com">
  次のページ
</a>

アンカータグを使う場合このように記述します。値をリンク先に渡したい場合は、URLの最後に?a=1&b=100などと変数名と値を書くことで、formタグ同様に値を渡すことはできます。

ここで本題であるが、訳あってinputタグのsubmitを使わずにアンカータグにクラス設定をすることで、ボタンにリンクを貼らなくてはいけなくなりました。そのままアンカータグにクラスを指定すれば、同じようなボタンができると考えていたが、なかなか上手くいかなかったので、その解決手法を調べました。

・HTML

<a href="http//yamamoto.arkoak.com" class="btn-link">
  ページ先頭へ
</a>

・CSS

.btn-link {
  text-align: center;
  background: #ccc;
  border:2px solid #333;
  width: 120px;
  height: 50px;
  font-size: 18px;
  color: #000;
}

このようなスタイルシートで示したボタンにリンクを張りたい場合、アンカータグを使うと下のボタンのように下線が出てきたり、文字が上によってしまいます。下線はスタイルシートでtext-decorationプロパティにnoneを設定することで、解消されます。
ページ先頭へ

まず、paddingを使って余白を調節することを考えました。

  padding-top: 20px;

ページ先頭へ

一見上手く行ったように見えるが、ボタンが縦にのびてしまっています。どうすればいいか悩んだあげくマージンを負に設定して隙間を埋めることにしました。上下中央はとりあえずあきらめます。

.btn-link {
  display: block;
  text-decoration: none;
  padding-top: 20px;
  margin-top: -20px;
}

上手く表示されていないかも知れませんが、chromeではちゃんと表示されることを確認しました。とりあえず、このボタンで妥協します。

JavaScriptを使わずに図形を描画

円の描画

HTMLとCSSだけで図形を表示する必要があったのでその覚え書き。円を描画するためには四角形の要素の角に丸みを持たせていくことで描画できる。

・HTML

<div id="circle"></div>

・CSS

#id {
  border: 2px solid #000;
  border-radius: 50%;
  height: 50px;
  width: 50px;
}

表示させると以下のような円が描画される。

 

border-radiusプロパティの値を調整することで、角の丸い四角形を描くことも可能である。

border-radius: 10px;

 

backgroundプロパティの値を変更すれば、図形を塗りつぶすことをできる。

background: #000;

 

このように、border-radiusを使うことでJavaScriptを使わなくても図形の描画ができる。

三角形の描画

三角形の描画には高さと幅のない四角形のborderに幅を持たせることで、描画することが多くあります。図のように対角線のtopの部分だけを表示し、それ以外は透明色を設定しています。

triangle

cssでは以下のように書くことができます。

.triangle {
  width: 0px;
  height: 0px;
  border: 30px solid transparent;
  border-top: 30px solid #0ff;
} 

三角形

塗りつぶされた三角形を表示する場合は、このようにCSSを記述し、divタグなどにクラス設定をすることで描画できます。しかし、枠線だけを表示したい場合は、この方法では捧持することができません。SVGやJavaScriptを使えば容易にできると思いますが、今回は塗りつぶされた三角形に背景色と同じ色の三角形で塗りつぶすことで、枠線だけの三角形を描画したいと思います。

<div class="triangle"></div>
.triangle {
 width: 100px;
 text-align: center;
}

.triangle:before {
  content: "";
  vertical-align: middle;
  width: 0px;
  height: 0px;
  border: 30px solid transparent;
  border-top: 30px solid #0ff;
}

.triangle:after {
  content: "";
  position: relative;
  top: -5px;
  left: 50px;
  width: 0px;
  height: 0px;
  border: 20px solid transparent;
  border-top: 20px solid #222;
}

枠のみの三角形
スクリーンショット 2014-08-28 23.08.01

CSSセレクターなど

今週学習した小ネタ的な物の覚え書き。

ラジオボタン

まず、ラジオボタンのアイテムの設定方法の種類について。ラジオボタンにはプロパティを設定することによって、必ず選択させたり、どれも選択させなかったりなど設定することができる。

必ず選択させる方法

<form>
  <div>
    <label>
      <input type="radio" name="test" value="Item1" required>Item1
    </label>
  </div>
  <div>
    <label>
      <input type="radio" name="test" value="Item2">Item2
    </label>
  </div>
  <div>
    <label>
      <input type="radio" name="test" value="Item3">Item3
    </label>
    <input type="submit" value="button">
  </div>
</form>
何もアイテムを選択せずにボタンを押すと、チップが出てきて入力を促してくれる。requiredを設定することで、この部分のエラー処理を行う必要がなくなりそうで便利だと思った。requiredの部分をdisableに設定することで選択できなくなり、checkedで選択済みになり、multipleで複数選択可能になる。

CSSセレクター

よく使うセレクタをいくつかピックアップして覚えておこうと思う。

1.  *(すべての要素に適用)

* {
  font-size: 15px;
}

2.  .X(指定したクラス名がある要素に適用)

.btn {
  font-size: 15px;
}

3.  #X(指定したID名がある要素に適用)

クラスと違い、IDはhtmlの中で一度しか使用することができない。用途の違いとしてはページのある場所に飛びたい時などに使用される(いくつもあると問題なので)。

#top {
}
<a href="http://yamamoto.arkoak.com/?p=855#top">ページ先頭へ</a>

ページ先頭へ

4.  E   F(子、孫要素に適用)

要素Eの下にあるFに適用される。Fの下にある孫要素にも適用される。

5.  E > F(子要素のみに適用)

要素Eの下にあるFに適用される。Fの下にある孫要素には適用されない。

6.  n-th child()  (n番目の要素に適用)

複数の要素が並んでいるときに、番号を指定して適用させることができる。例えば表で一列目だけ色を変更したい場合は次のように記述する。

・HTML

  <table>
    <thead>
      <td><th>1</th><th></th></td>
    </thead>
    <tbody>
      <td><th>2</th><tr></tr></td>
    </tbody></pre>
 </table>

・CSS

tbody > th:n-th-child(1) {
  background: #999;
}

7.  E:before,  E:after(要素の前後に適用)

指定した要素の前後に適用される。例えば要素の前後に決まった単語などをつけたい時に使うことができる。

・CSS

div > h1:before,
div > h1:after {
  content: "-------------";
}

・HTML

<div><h1>参考文献</h1></div>

このように記述することで、毎回同じ文章を書く手間を省けくことができる。

————-参考文献————-

w3school.comのwebページにてすべてのセレクタが参照できる。http://www.w3schools.com/cssref/css_selectors.asp

 

 

 

CSSでレイアウト

Webアプリケーションの画面のレイアウトをHTML, CSSで作成する際、画面が崩れて嵌ってしまいだいぶ苦戦したのでその覚え書き。

まず、displayプロパティの各値の特徴について。

display

・縦に積まれていく

・幅と高さを指定できる。

・上下、左右にmargin、paddingを指定できる。

・text-alignは要素の中身に使用できる。

・verticle-alignは指定できない(縦に並ぶので)。

inline

・横に並んでいく。

・幅と高さは指定できない。文字の大きさに合わせて変化する。

・左右のみmargin、paddingを指定できる。

・text-alignは親要素に指定することで使用できる。

・verticle-alignを指定できる。

inline-block

・横に並んでいく。

・幅と高さを指定できる。

・text-alignは親要素に指定することで使用できる。

・verticle-alignを指定できる。

inline-blockは高さ、幅を指定できるブロック要素みたいな感じでレイアウトを行う際によく使われる。

CSSでレイアウトを考える際、テキストやボタンなどの部品の固まりを要素として考えるが、単純に要素を並べていくと通常下図左側のように要素が下へ下へと並んでいく。座標を指定して要素を動かすことも可能であるが、画面の大きさやブラウザによって表示され方が異なってくるので推奨されない。

layout

要素を横に並べたい場合には次の2つの方法が考えられる。子要素Aのfloatプロパティでleftを設定する方法と要素をinline-blockとして横並びさせる方法がある。floatを使った場合以下のように記述することができる。

・CSS

parent {
  position:relative;
}

childA-block {
  position: relative;
  float: left;
}

childB-block {
  position: relative;
  float: left;
}

・HTML


<div class="parent-block">
  親要素
  <div class="childA-block">
    子要素A
  </div>
  <div class="childB-block">
    子要素B
  </div>
</div>

この場合float:leftと設定することで自分の要素を左側に追いやって、右側にスペースを作っている。

続いてdisplayプロパティのinline-block要素を使う方法である。inline-block要素に設定することで、inline要素とblock要素の両方の性質を持つことができる。inline要素とは、<a>や<span>など主にブロック要素の内容として扱われる要素で、文章として扱われる。一方、<div>や<form>、<table>などはblock要素と呼ばれ、一つのブロックとして扱われるため、通常同時に改行される。

・css

parent-block {
  position: relative;
}
childA-block {
  position: relative;
  display: inline-block;
}
childB-block {
  position: relative;
  display: inline-block;
}

上記のように記述することで、子要素を横に並べることが可能になる。しかし、子要素同士の高さが異なる場合や複雑なレイアウトでfloatとinline-blockの両方を使う必要があるときなどに画面が崩れる場合がある。下図のようなレイアウトを考える。

layout_rational

まず、子要素A, Bをinline-blockで並べ孫要素は単純に上から並べてみる。

.parent-block {
   width: 150px;
   margin: 10px;
   position: relative;
   background-color: #888;
   display: inline-block;
   border: 1px solid;
}

.childA-block{
   position: relative;
   background-color: #aaa;
   display: inline-block;
   border: 1px solid;
}

.childB-block{
   position: relative;
   background-color: #aaa;
   display: inline-block;
   border: 1px solid;
}

スクリーンショット 2014-08-22 21.20.12

 

子要素の高さが異なる場合、子要素Aは子要素Bの高さに合わせてどんどん下へと移動してしまう。また、原因はよくわからないが子要素A, Bの間に隙間ができてしまった。

HTML上で要素間に改行があった場合に、子要素A,B間に隙間が生じてしまう。これを解決する方法もいくつかあって、最も簡単な方法は改行しないことです。

 


<div class="parent-block">
親要素
<div class="childA-block">子要素A</div><div class="childB-block">子要素B</div>
</div>

それ以外にも改行箇所にコメントを挟むことで、防げるようです。


<div class="parent-block">
  親要素
  <div class="childA-block">
    子要素A
  </div><!--
  --><div class="childB-block">
    子要素B
  </div>
</div>

別の方法として、float:leftを使ってレイアウトしてみる。

.parent-block{
   width: 150px;
   margin: 10px;
   position: relative;
   background-color: #888;
   border: 1px solid;
}

.childA-block{
   position: relative;
   background-color: #aaa;
   float: left;
   border: 1px solid;
}

.childB-block{
   position: relative;
   background-color: #aaa;
   float: left;
   border: 1px solid;
}

スクリーンショット 2014-08-22 21.21.03

 

今度は子要素Aの位置は変わらず、子要素A, Bの間にできていた隙間も生じなくなった。しかし、親要素が高さを失いつぶれてしまっていることがわかる。floatを使用することで、親要素が高さを失ってしまったのである。ここで登場するのがoverflowという収まりきらない領域をどのように処理するかを決めるプロパティである。値にhiddenを設定することにより、フロートした要素の回り込みを防ぐことができて、親クラスに高さが復活するようである(自信なし)。高さを持たせたい親クラスに一行書き足すだけでfloatを解除することができ、他にも方法はあるが現在はこれが主流らしい。

.parent-block{
   width: 150px;
   margin: 10px;
   position: relative;
   background-color: #888;
   border: 1px solid;
   overflow: hidden;
}

スクリーンショット 2014-08-22 21.20.34

 

今回は、floatを使うことにより、この問題を解決した。しかし、より複雑になってきた場合、floatとinline-blockを組み合わせるなど、位置の調整が必要になってくることが考えられるので使えこなせるように勉強していきたい。

 

—————————————参考文献—————————————

display: inline、display: block、display: inline-block をマスターしよう!

http://taneppa.net/display-inline-block/