こんにちは、コーディング・デザイン担当の仁木です。
今回は覚えておくと便利なCSSのTipsを紹介したいと思います。
リストなど同じ要素が連続する時に、最初または最後の要素のみ余白を変えます。
1 2 3 4 5 |
<ul> <li>リスト</li> <li>リスト</li> <li>リスト</li> </ul> |
1 2 3 4 |
/* li要素の直後の兄弟要素が同じli要素の場合 */ li + li { margin-top: 20px; } |
[+]は直後の兄弟要素を指します。
このセレクタだと直前にli要素がない、つまり最初のli要素のみを除外して[margin-top]が適用されます。
1 2 3 4 |
/* ul要素直下のli要素、かつ一番最後のli要素のみ除外する */ ul > li:not(:last-child) { margin-bottom: 20px; } |
ここで使用している[:not]は”( )”[カッコ]内で指定したものを除外する否定の擬似セレクタです。”( )”[カッコ]内にはクラス名や、擬似クラスを指定します。[:last-child]は最後の子要素に適用される擬似セレクタになります。
セマンティックなHTMLでは、要素の中にはテキスト、またはそれに代替するものは必ず入れるべきです。例えばボタンのデザインをされたa要素に対して、テキストでの表示はなくアイコンのみがある場合、ALT属性やWAI-ARIAの[aria-label]属性などを指定して代替テキストを入れておきましょう。
もし、そういったマークアップがされていないものがあった場合に警告文をCSSで表示するようにします。警告文が表示されないようコーディングしましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/* ボタン・リンクに十分な情報(テキスト、aria-labelなど)が含まれていない場合の警告 */ a:empty:not([aria-label]):not([aria-labelledby]):after, button:empty:not([aria-label]):not([aria-labelledby]):after { background-color: red; color: white; content: "警告:このボタンに関する情報が十分ではありません。ボタンの中にテキストを含めてください。"; } /* アンカー・ボタン要素内に画像のみ、かつALT属性やaria-labelなどの代替テキストが含まれていない場合 */ a:not([aria-label]):not([aria-labelledby]) img:only-child:not([alt]), button:not([aria-label]):not([aria-labelledby]) img:only-child:not([alt]) { background-color: red; filter: grayscale(100%); } |
最初のセレクタでは、aまたはbutton要素内にテキスト・画像などが何も含まれていない、かつ[aria-label]、もしくは[aria-labelleby]が設定されていない場合、赤背景に白文字で警告文が表示されます。
次のセレクタでは、aまたはbutton要素内にimg要素しか含まれていない、かつaまたはbutton要素に[aria-label]、もしくは[aria-labelleby]が設定されていない場合、画像をグレイスケールで表示します。
:emptyは要素の中身が空の状態を表します。空の状態とは、テキストや画像などコンテンツとなるものが何も入ってない空タグのことをさします。
幅、高さが可変する要素に対して天地中央に表示する方法です。
1 2 3 |
<div class="box"> <p class="content">天地中央に表示します</p> </div> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
.box { position: relative; width: 100%; height: 300px; } .box .content { position: absolute; top: 50%; left: 50%; -ms-transform: translate(-50%, -50%); /* IE, EDGE */ transform: translate(-50%, -50%); } |
幅、高さが固定の要素に対しては以下も有効です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
.box { position: relative; width: 100%; height: 300px; } .box .content { position: absolute; top: 0; bottom: 0; left: 0; right: 0; margin: auto; width: 80px; height: 80px; } |
テキストをドラッグした際、テキスト色と背景色が反転されますが、その色をカスタマイズします。
1 2 3 4 5 6 7 8 |
::selection { background: orrange; /*背景色*/ color: white; /*文字色*/ } ::-moz-selection { background: orrange; /*背景色*/ color: white; /*文字色*/ } |
コンテンツを全て表示させずボックス内でスクロールさせるような場合、スクロールバーをカスタマイズできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
.box { height: 300px; overflow-y: scroll; } /*スクロールバーエリア*/ .box::-webkit-scrollbar { width: 5px; } /*スクロールバーの表示エリア*/ .box::-webkit-scrollbar-track { border-radius: 10px; background-color: #eee; box-shadow: inset 0 0 6px rgba(0, 0, 0, .1); } /*スクロールバーの動く部分*/ .box::-webkit-scrollbar-thumb { background-color: rgba(29, 33, 139, 0.7); border-radius: 10px; box-shadow:0 0 0 1px rgba(255, 255, 255, .7); } |
:hoverはカーソルが要素の上にのっている状態を表します。カーソルがのっているのみで、クリックされた場合は別の:activeの擬似クラスが適用されます。
:focusは要素が選択された状態を表します。<input>要素でテキストを入力する時など:focusが適用されています。
:focus-withinは要素自身、またはその要素の子孫の要素が選択された状態を表します。
これは具体的には、<form>タグ内の<input>要素などが選択されている時、<form>タグにもアクティブな状態をCSSでデザインする場合に有効です。
:activeは要素が「クリックされてから離されるまで」の間のみ適用されます。
:first-childは最初の子要素に適用されます。
:nth-of-type()は”( )”[カッコ]内で指定したものに当てはまる要素に適用されます。「2」を指定した場合2番目の要素に適用されます。
また番号ではなく、偶数・奇数の要素や3の倍数の要素など、複雑なルールを設けて複数の要素に適用することも可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/* ul内の2番目のli要素 */ ul li:nth-of-type(2) { font-weight: bold; } /* 偶数の要素 */ ul li:nth-of-type(even) { font-weight: bold; } /* 3の倍数の要素 */ ul li:nth-of-type(3n) { font-weight: bold; } /* 4,7,10,13,16.....(3n+1)の要素 */ ul li:nth-of-type(3n+1) { font-weight: bold; } |