CSS

横幅のサイズによってタブのサイズを変える方法

スマートフォンのサイトに限った話では無いですが、横幅(表示領域)によって要素の長さを変えたい時はあると思います。
今回は、横幅によってタブのサイズを変える必要が有ったのでその時の実装メモです。

flexible tabs – jsdo.it – share JavaScript, HTML5 and CSS

初期表示時と画面がリサイズ(スマートフォンの場合は、縦表示→横表示など)された際に、javascriptでタブのサイズを変更するようにしています。
※スマートフォン用に作成したので、IEなどのブラウザではうまく動かないかもです。。。

flexible tabs – jsdo.it – share JavaScript, HTML5 and CSS

CSSで最後の要素以外に適用させる書き方

擬似要素の:not:last-childを組み合わせて指定します。

html

<ul>
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
</ul>

css

ul
{
    list-style-type:   none;
    text-align:        center;
}
li
{
    display:           inline;
}
li:not(:last-child):after
{
    content:           ' |';
}

:last-childで最後の要素を指定し:notで指定された要素以外を指定します。
つまり、最後の要素以外というセレクターができます。

2012-02-04 1st – jsdo.it – share JavaScript, HTML5 and CSS

擬似要素 before after についての解釈

擬似要素:before:afterはその名前から、要素外側の前と後と解釈してしまいがちですが、実際は要素内側の前と後になります。

図で表すとこんな感じです。

一番使用するケースとしては、floatした要素の高さを出すために擬似要素にclearfixするという事が多いと思います。

例えば、ul、liタグでパンくずリストを作る場合、

<nav class="nav-topicpath">
    <ul>
      <li><a title="Home" href="/">Home</a></li>
      <li>Page1</li>
    </ul>
</nav>
ul, ol {
    list-style: none outside none;
}
a {
    color: #333333;
}
.nav-topicpath {
    background-color: #ffffff;
    font-size: 12px;
    padding: 3px 10px;
}
.nav-topicpath ul:after {
    content: ".";
    display: block;
    height: 0;
    clear: both;
    visibility: hidden;
}
.nav-topicpath li {
    float: left;
}
.nav-topicpath li + li:before {
    content: ">";
    margin: 0 3px;
}
.nav-topicpath li a {
    padding: 3px 0;
}

※clearfixはスマートフォン用のものです。

topicpath – jsdo.it – share JavaScript, HTML5 and CSS

この場合、

<nav class="nav-topicpath">
    <ul>
      <li><a title="Home" href="/">Home</a></li>
      [[[ここに擬似要素afterが入る]]]
      <li>Page1</li>
    </ul>
</nav>

となります。
擬似要素は、要素のCSSも継承します。

clearfixのために空の要素を作ったり剃る必要が無いので、イイですね!

ブラウザとOS別に適用するCSSのクラスを指定できるJSのご紹介

ひょんな事から、スマートフォンサイトのHTMLコーディングを最近しております。

スマートフォンサイトはバリバリHTML5が使えるので楽しいですね。

スマートフォンサイトのコーディングする際は、webkit系のブラウザかiOSシュミレーターのsafariである程度確認してから、実機で確認という流れで表示確認してたのですが、Windowsのsafariでもズレがないようにコーディングして下さいと上から申し出がありました。
※本当に対応する必要があったかは謎ですが。。。

Windowsのsafariでずれる原因はfontが”メイリオ”になってしまい、”ヒラギノ角ゴ”などと比べるとline-heightが高いので、水平に配置しても微妙にずれがでてしまってました。

他に影響が出ないようにと、工数が少ない中だった事もあり、今回はCSS Browser Selector.を使って、Windowsのsafariだった場合のスタイルを定義して対応しました。

これはホント便利ですね。

強制的にポインタを指カーソルにするCSS

IE6等でアンカーの中に文字列以外のタグ等を設定すると指カーソルが出ない場合が有ります。

そういう場合はCSSで強制的に指カーソルを表示するようにします。

style="cursor:pointer;cursor:hand"

文字色と背景色のコントラスト

文字の色と、その背景色のコントラスト(色の差、明度差)が十分でないと、文字の視認性が低下してしまいます。

W3Cで公開されている計算式を利用すると適切なコントラストにする事が出来ます。

明朗度を求める計算式

結果が「125」以上となれば基準を満たす

((R×299)+(G×587)+(B×114))÷1000

色の差を求める計算式

結果が「500」以上となれば基準を満たす

(max(R1,R2)-min(R1,R2))+(max(G1,G2)-min(G1,G2))+(max(B1,B2)-min(B1,B2))

サンプル

明度差/色の差が共に不足
  • 文字色:#3366ff(51:102:255)
  • 背景色:#33cccc(51:204:204)
  • 明度差:54
  • 色の差:153
明度差/色の差が共に基準を満たしている
  • 文字色:#3333ff(51:51:255)
  • 背景色:#ffff00(255:255:0)
  • 明度差:152
  • 色の差:663
色の差が不足
  • 文字色:#ff0000(255:0:0)
  • 背景色:#ffff00(255:255:0)
  • 明度差:150
  • 色の差:255
明度差が不足
  • 文字色:#ffff00(255:255:0)
  • 背景色:#00ffff(0:255:255)
  • 明度差:47
  • 色の差:510

チェックサイト

http://www.kanzaki.com/docs/html/color-check

CSSの優先順位

CSSにはスタイルが適用される優先順位があります。
大きなサイトになればなるほど、スタイルが競合して適用されないといったケースが出てきますので注意が必要です。

CSSのスタイル適用順を決定する要素

CSSの提供元による優先順位
  1. Webページ制作者が作成したCSS[制作者スタイルシート]
  2. Webブラウザのユーザーが作成したCSS[ユーザースタイルシート]
  3. Webブラウザがデフォルトで適用するCSS[デフォルトスタイルシート]
個別性による優先順位
個別性の高いものが優先される
記述位置による優先順位
後から出てきたものが優先される
!importantルール
!important宣言の付いたスタイルが最優先される

  1. ユーザースタイルシート(!important宣言付き)
  2. 制作者スタイルシート(!important宣言付き)
  3. 制作者スタイルシート
  4. ユーザースタイルシート
  5. デフォルトスタイルシート

 

個別性による優先順位(個別性の計算ルール)

個別性は最大4ケタの正数値で表現され、より大きい値のスタイル程、個別性が高いと判断され優先される。計算方法は以下のようになる。

1,000の位(a)
(X)HTML文書内に、style属性がある場合は、1をカウント
100の位(b)
セレクタに含まれているid属性の数をカウント
10の位(c)
セレクタに含まれているid以外の属性と、疑似セレクタの数をカウント
1の位(d)
セレクタに含まれている要素、疑似要素の数をカウント

計算例

記述例 a b c d 個別性
* 0 0 0 0 0
li 0 0 0 1 1
li:first-line 0 0 0 2 2
ul li 0 0 0 2 2
ul ol+li 0 0 0 3 3
p[class=”memo”] 0 0 1 1 11
ul ol li.menu 0 0 1 3 13
li.menu.service 0 0 2 1 21
#example 0 1 0 0 100
div#example 0 1 0 1 101
style=”” 1 0 0 0 1000

最近、(X)HTMLやHTML5の勉強をしております。