CSSの新機能を効果的にうまく使った、新時代のCSSリセット -acab/reset.css
Post on:2022年11月1日
詳細度を0にする:where()
、iOSのSafariで100vhが高さいっぱいにならないを解決できる新しいビューポート単位など、CSSの便利な新機能の各ブラウザでのサポートも完了し、すでに使用されている人も少なくないと思います。
CSSの新機能を効果的にうまく使った、新時代のCSSリセットを紹介します。
CSSリセットとして使用するだけでなく、CSSの勉強にもなるCSSリセットです。
:where()
とか新しいビューポート単位など、CSSの各新機能については以前の記事をご覧ください。
- CSSの新しい疑似クラス:is()と:where() なんだこれ便利すぎる!
- CSSの新しい単位「lvh」「svh」これでiOSのSafariで100vhがビューポートの高さではない仕様に対応できる
- CSSの疑似クラス「:focus-within」が素晴らしい理由
- CSSの:has()疑似クラスの便利な使い方のまとめ
- CSSのボックスモデルにおける古い方法とこれからの方法 -論理プロパティにおける考え方
@acab/reset.cssの特徴
acab/reset.cssは、CSSの最新機能を取り入れたスタイルのリセットです。このCSSリセットを使用することで、より良いベースを提供します。
:where
を使用して詳細度を低く保つように設計されています。カスケードレイヤー対応。color-scheme
による自動ダークモード。system-ui
フォントがあらかじめ適用されています。- アクセシブルで、一貫性のあるフォーカスのアウトライン。
.visually-hidden
が用意されています。
@acab/reset.cssの中身
CSSリセットには他のCSSリセットでお馴染みのルールだけでなく、CSSの新機能を取り入れたルールもたくさんあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; } :where([hidden]:not([hidden='until-found'])) { display: none !important; } :where(html) { -webkit-text-size-adjust: none; color-scheme: dark light; } @supports not (min-block-size: 100dvb) { :where(html) { block-size: 100%; } } @media (prefers-reduced-motion: no-preference) { :where(html:focus-within) { scroll-behavior: smooth; } } :where(body) { block-size: 100%; block-size: 100dvb; line-height: 1.5; font-family: system-ui, sans-serif; -webkit-font-smoothing: antialiased; } :where(input, button, textarea, select) { font: inherit; color: inherit; } :where(textarea) { resize: vertical; resize: block; } :where(button, label, select, summary, [role='button'], [role='option']) { cursor: pointer; } :where(:disabled) { cursor: not-allowed; } :where(label:has(> input:disabled), label:has(+ input:disabled)) { cursor: not-allowed; } :where(button) { border-style: solid; } :where(a) { text-underline-offset: 0.2ex; } :where(ul, ol) { list-style: none; } :where(img, svg, video, canvas, audio, iframe, embed, object) { display: block; } :where(img, picture, svg) { max-inline-size: 100%; block-size: auto; } :where(p, h1, h2, h3, h4, h5, h6) { overflow-wrap: break-word; } :where(h1, h2, h3) { line-height: calc(1em + 0.5rem); } :where(hr) { border: none; border-block-start: 1px solid; color: inherit; block-size: 0; overflow: visible; } :where(:focus-visible) { outline: 2px solid var(--focus-color, Highlight); outline-offset: 2px; } :where(.visually-hidden:not(:focus, :active, :focus-within, .not-visually-hidden)) { clip-path: inset(50%) !important; height: 1px !important; width: 1px !important; overflow: hidden !important; position: absolute !important; white-space: nowrap !important; border: 0 !important; } |
acab/reset.css v.0.5.3(2022/10/24)
@acab/reset.css(コメント付き)
作者のツイートにコメント付きがあったので、意訳してみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
*, *::before, *::after { margin: 0; /* マージンは0に */ padding: 0; /* パディングも常に0に */ box-sizing: border-box; /* もちろん、より直感的なbox-sizingに設定 */ } :where([hidden]:not([hidden='until-found'])) { display: none !important; /* hiddenは非表示を意味します */ } :where(html) { -webkit-text-size-adjust: none; /* iOSのランドスケープでテキストが調整されないようにする */ color-scheme: dark light; /* ユーザーがダークテーマを好む場合、自動的にダークテーマになる */ } @supports not (min-block-size: 100dvb) { :where(html) { block-size: 100%; } } @media (prefers-reduced-motion: no-preference) { :where(html:focus-within) { scroll-behavior: smooth; /* 何かにフォーカスがある場合のみスムーズスクロール */ } } :where(body) { block-size: 100%; /* サファリ以外のブラウザのフォールバック */ block-size: 100dvb; /* 1dvbは動的ビューポートの長さの1%、100dvbで高さいっぱいに */ line-height: 1.5; /* アクセシブルな行の高さ */ font-family: system-ui, sans-serif; /* timeの代わりにシステムフォントを使用 */ -webkit-font-smoothing: antialiased; /* テキストのレンダリングを改善 */ } :where(input, button, textarea, select) { font: inherit; /* フォーム コントロールは親フォントを継承 */ color: inherit; /* カラーも継承 */ } :where(textarea) { resize: vertical; /* テキストエリアの水平リサイズを無効に */ resize: block; } :where(button, label, select, summary, [role='button'], [role='option']) { cursor: pointer; /* インタラクティブなものにカーソルを合わせる */ } :where(:disabled) { cursor: not-allowed; /* フォームコントロール無効時のカーソルを許可しない */ } :where(label:has(> input:disabled), label:has(+ input:disabled)) { cursor: not-allowed; /* ラベルにもカーソルを許可しない */ } :where(button) { border-style: solid; /* ボタンのボーダーのスタイルを設定しやすくする */ } :where(a) { text-underline-offset: 0.2ex; /* 下線の上にスペースを追加する */ } :where(ul, ol) { list-style: none; /* ビュレットを削除、必要に応じて手動で追加する */ } :where(img, svg, video, canvas, audio, iframe, embed, object) { display: block; /* 置換された要素をより予測可能にする */ } :where(img, picture, svg) { max-inline-size: 100%; /* images should never overflow past the available space */ block-size: auto; /* アスペクト比を保持 */ } :where(p, h1, h2, h3, h4, h5, h6) { overflow-wrap: break-word; /* 長い単語は改行 */ } :where(h1, h2, h3) { line-height: calc(1em + 0.5rem); /* 見出しの行の高さを減らす */ } :where(hr) { /* より一貫性のある、スタイリッシュなhr */ border: none; border-block-start: 1px solid; color: inherit; block-size: 0; overflow: visible; } :where(:focus-visible) { /* より一貫性のある、カスタマイズ可能なフォーカスのアウトライン */ outline: 2px solid var(--focus-color, Highlight); outline-offset: 2px; } /* .visually-hiddenは後のカスケードレイヤーを上書きするために!importantを使用 */ :where(.visually-hidden:not(:focus, :active, :focus-within, .not-visually-hidden)) { clip-path: inset(50%) !important; height: 1px !important; width: 1px !important; overflow: hidden !important; position: absolute !important; white-space: nowrap !important; border: 0 !important; } |
作者のツイート
🚨 new css reset 🚨
i was copy pasting the same snippets across many projects so i decided to collect them in an installable package
you'll notice some familiar rules from other resets as well as some new, opinionated ones that i came up with 👀https://t.co/vwaKajJSFt pic.twitter.com/fIvVwcX4gB
— Mayank (@hi__mayank) October 22, 2022
sponsors