CSSプロフェッショナルのためのTIPS

  • 23
    いいね
  • 0
    コメント

CSS ProtipsというTIPS集があって、これ一応日本語訳が既にあるんだけど、露骨に機械翻訳で何言ってるのか全くわからないので全編戸田奈津子訳した。
あれ、あんまり変わってない気がしてきたぞ。

CSSの便利な小技・テクニックのまとめ Awesome

CSSのプロフェッショナルになりたい人のためのTips集を紹介するよ。

CSS以外のAwesomeリストを探したいときは@sindresorhusをフォローしよう。

目次

テクニック
サポート
翻訳
手伝いたい

テクニック

CSSリセット

異なるブラウザ間でスタイルの一貫性を保つには、CSSリセットが役に立つぞ。
NormalizeのようなCSSリセットのライブラリを使用するか、もっと簡単には以下のように書ける。

    * {
      box-sizing: border-box;
      margin: 0;
      padding: 0;
    }

marginpaddingの余白を削除し、box-sizingはボックスモデルで書けるように設定した。

デモ

注意:box-sizingの継承に従っている場合は、CSSリセットにbox-sizingを含めない方がよいだろう。

box-sizingの継承

box-sizingはhtmlタグで指定しよう。

    html {
      box-sizing: border-box;
    }

    *, *::before, *::after {
      box-sizing: inherit;
    }

box-sizingに異なる動作をさせたいプラグインやコンポーネントが、box-sizingの動作を容易に変更できるようになる。

ナビゲーションの区切りに:not()を使う

borderを指定してからlast-childで最後のborderだけを非表示にする。

    /* add border */
    .nav li {
      border-right: 1px solid #666;
    }

    /* remove border */
    .nav li:last-child {
      border-right: none;
    }

と、このように書くより:not()を使ったほうがシンプルに書ける。

    .nav li:not(:last-child) {
      border-right: 1px solid #666;
    }

もちろん .nav li + li.nav li:first-child ~ li 等を使ってもいい。
しかし、:not() のほうが意図が明確で、意味のわかりやすいCSSセレクタになるぞ。

デモ

bodyline-heightをセット

ph*等の各要素にそれぞれline-heightを割り当てる必要はなくて、単にbodyに追加するだけでいいぞ。

    body {
      line-height: 1.5;
    }

このように、テキスト要素はbodyタグから継承されるぞ。

デモ

インライン要素の上下中央寄せ

縦方向の中央寄せが簡単に作れるぞ。そう、Flexboxならね。

    html, body {
      height: 100%;
      margin: 0;
    }

    body {
      -webkit-align-items: center;  
      -ms-flex-align: center;  
      align-items: center;
      display: -webkit-flex;
      display: flex;
    }

他にも上下、左右、その他に揃えたいのであれば、CSS-Tricks のa nice write-upに色々と例が載ってるぞ。

注意:IE11のFlexboxには バグがあるので気をつけて

デモ

リストをカンマ区切り表示

liのアイテムは簡単にカンマ区切り表示できるよ。

ul > li:not(:last-child)::after {
  content: ",";
}

:not()を使えば最後に不要な,を表示させないようにできるぞ。

注意:アクセシビリティ的にはよくないので気をつけて使おう。

:nth-childに負数を指定

:nth-childにはマイナスも指定できる。

    li {
      display: none;
    }

    /* 最初から3番目まで表示する */
    li:nth-child(-n+3) {
      display: block;
    }

またnot()と組み合わせたりもできる。

    /* 最初から3番目以外を非表示にする */
    li:not(:nth-child(-n+3)) {
      display: none;
    }

とっても簡単だね。

デモ

SVGのアイコン

アイコンにSVGを使わない理由はもはやない。

    .logo {
      background: url("logo.svg");
    }

SVGはIE9以降すべてのブラウザでサポートされている。

注意:buttonをSVGだけで作っている場合は、SVGのロードに失敗したときにもアクセシビリティを保つために、以下のCSSを書いておくとよい。

    .no-svg .icon-only:after {
      content: attr(aria-label);
    }

Lobotomized Owlsセレクタ

変な名前だが、ユニバーサルセレクタ*としぶりんセレクタ+を使用するとパワフルなCSSセレクタになるぞ。

* + * {
  margin-top: 1.5em;
}

この例だと、全てのページの要素にある要素がmargin-top: 1.5emをもらいます。

Owlについて詳しく知りたいなら、Heydon Pickeringの記事を読むといい。

デモ

max-heightでCSSオンリーのスライダー

max-heightoverflow:hiddenだけで簡単にスライダーが作れるぞ。

    .slider {
      max-height: 200px;
      overflow-y: hidden;
      width: 300px;
    }

    .slider:hover {
      max-height: 600px;
      overflow-y: scroll;
    }

max-heightを超えた中身はマウスオーバーで表示されて、それでも入りきらない場合はスクロールする。

テーブルのセルの幅を均等にする

table-layout: fixed;を使うとテーブルの各セル幅が均等になるぞ。

.calendar {
  table-layout: fixed;
}

超簡単。

デモ

Flexboxのマージンを削除

flexboxのマージンを調整したい場合、nth-first-last-childなどを駆使してどうこうしたりしなくても、単にspace-betweenを使うだけでいい。

    .list {
      display: flex;
      justify-content: space-between;
    }

    .list .person {
      flex-basis: 23%;
    }

両端を端に寄せて残りが均等に配置される。

リンクにテキストが無いときはURLを表示

aタグに内容が何もないときにはhref属性値を表示したい。
簡単にできるよ、そうCSSならね。

    a[href^="http"]:empty::before {
      content: attr(href);
    }

便利だね。

デモ

リンクのstyleデフォルト値

デフォルトのstyleを設定できる。

    a[href]:not([class]) {
      color: #008000;
      text-decoration: underline;
    }

CMSなどで後から追加される、classを持たないaタグにスタイルを指定できるし、他のスタイルに影響もしないよ。

縦幅を一括調整

ユニバーサルセレクタ*で縦の間隔を一括調整できるぞ。

    .intro > * {
      margin-bottom: 1.25rem;
    }

縦のリズムこそが、コンテンツを読みやすくするポイントだ。

縦横比固定のボックス

縦横比固定のボックスを作るには、divの上か下にpaddingすればいい。

    .container {
      height: 0;
      padding-bottom: 20%;
      position: relative;
    }

    .container div {
      border: 2px dashed #ddd;
      height: 100%;
      left: 0;
      position: absolute;
      top: 0;
      width: 100%;
    }

paddingを20%にするとボックスの高さが幅の20%になります。
親要素の幅に関わらず、div要素は常に100%:20%、つまり5:1になります。

デモ

リンク切れ画像にCSS指定

リンク切れ画像は見た目がよくないのでスタイルを定義しましょう。

    img {
      display: block;
      font-family: Helvetica, Arial, sans-serif;
      font-weight: 300;
      height: auto;
      line-height: 2;
      position: relative;
      text-align: center;
      width: 100%;
    }

メッセージとURLをユーザに見せるようにもできます。

    img:before {  
      content: "We're sorry, the image below is broken :(";
      display: block;
      margin-bottom: 10px;
    }

    img:after {  
      content: "(url: " attr(src) ")";
      display: block;
      font-size: 12px;
    }

もっと詳しくはIre AderinokunStyling Broken Imagesを読むとよいでしょう。

rememの使い分け

まず最初に基本となるhtml{font-size: 16px;}を指定し、次にテキスト要素のfont-sizeemで指定します。

    h2 {
      font-size: 2em;
    }

    p {
      font-size: 1em;
    }

細かいモジュールのフォントサイズはremで指定します。

    article {
      font-size: 1.25rem;
    }

    aside .module {
      font-size: .9rem;
    }

各モジュールはコンパートメント化され、スタイル設定は簡単になり、保守性と柔軟性が向上しました。

自動再生動画を隠す

こいつはユーザスタイルシートにとって非常にうれしいハックだ。
ページを開いたら勝手に自動再生される動画のうち、音の出るものだけを無かったことにする。
音声をオフにしないかぎり表示させないぞ。

    video[autoplay]:not([muted]) {
      display: none;
    }

ここでもふたたび上記の:notを使っている。

Flexboxで:rootを使う

レスポンシブデザインのフォントサイズを、viewportに従って変更することができる。
viewportの大きさからフォントサイズを算出し、:rootに定義するとよい。

    :root {
      font-size: calc(1vw + 1vh + .5vmin);
    }

各タグや要素のフォントサイズは、:rootの値から相対的に決める。

    body {
      font: 1rem/1.6 sans-serif;
    }

デモ

スマホ向けフォームのfont-size指定

スマホでselectタグのドロップダウンリストを表示したとき、ブラウザが勝手に拡大表示するのを防ぐには、font-sizeを指定する。

    input[type="text"],
    input[type="number"],
    select,
    textarea {
      font-size: 16px;
    }

サポート

最新バージョンのChrome、Firefox、Safari、Opera、Edge、およびIE11で動作するはず。

翻訳

Español
Français
Italiano
日本語
Português do Brasil
Русский
简体中文

感想

便利そうなものも使い道のなさそうなものもいろいろ。
でも最近はもう一からCSS書くとかあんまりしないよね。

Lobotomized Owlsセレクタは並列要素の"最初以外"を選択する便利な書き方なんだけど、日本語での紹介記事があまりにも存在しないのはどういうわけだろう。
例えばナビゲーション区切りの:notは以下のようにも書ける


    // 元のやつ
    nav li:not(:last-child) {
      border-right: 1px solid #666;
    }

    // ↑とだいたい同じ
    nav * + * {
      border-left: 1px solid #666;
    }

全称セレクタは遅い?
今時気にするようなレベルのものでもないだろう。