2020年から2023年までのCSSの変遷を振り返る
https://gyazo.com/c23c7c38e90e271121e3d12fd652d17f
この資料は Meguro.css#9 のLT資料です。
https://gyazo.com/5510d4e88c34b7dc94f91817952946e7
メニューのドキュメントアイコンより「Start presentation」クリックでプレゼンテーションが始まります
自己紹介
yamanoku.icon @ yamanoku
大山奥人, おおやまみちのく a.k.a やまのく
X(旧Twitter)
GitHub
株式会社クラウドワークスにてフロントエンドにまつわる仕事をやっています
得意領域
マークアップ・フロントエンド・UIデザイン・アクセシビリティ
既婚で1児の父と猫🐈🐈🐈と犬🐶の飼い主
Meguro.css復活!!!!!
株式会社オロ様、Nakayaさんありがとうございます(感謝)
Meguro.css#4がエンジニアとしての初登壇イベントでした
今回のテーマ「2020年から2023年までに登場したCSSの変遷を振り返る」
前回のMeguro.cssが2020年1月開催
それまでの間に色々な変化があったと思います
失われた時間とともにCSSの変遷を見てみよう
CSSを振り返る前に…
ブラウザの2020年初期バージョンと現在のバージョンでの比較
フロントエンドにまつわる大きめな出来事とか
2020年から2023年までのブラウザバージョン進捗
Chrome
Chrome 80(2020-02-04リリース)
安定版Chrome 120(2023-12-01現在)
Microsoft Edge
Chromiumベースで安定リリースされたのが2020-01-15
レガシー版のEdgeHTMLは2021/3/9にサポート終了
安定版 v120(2023-12-01現在)
Firefox
Firefox 72(2020-01-05リリース)
安定版 v120(2023-12-01現在)
Safari
macOS Safari 13.0.5(2020-01-28リリース)
iOS Safari 13.1(2020-03-24)
安定版 Safari 17(2023-12-01現在)
IEがサポート終了発表
https://blogs.windows.com/wp-content/uploads/prod/sites/31/2022/06/0068a7bb9c0f730b18bad4d4ea898227.gif
2021/5/19に発表(現地時間)
2022/6/16(日本時間)にサポート終了
IE卒業式も開催されていました
「レガシーブラウザのためのpolyfill」という配慮がなくなってきた
Igaliaという存在
https://gyazo.com/021a2f8298a9417756e310135d99d0e2
ブラウザの新機能をブラウザベンダに代わりクウラウドファンディングにて実装してくれるフリーソフトウェアコンサルタント会社
CSS Gridのクロスブラウザ対応への大きな貢献
Igaliaによるブラウザー新機能実装の実験的クラウドファンディング | フロントエンドBlog | ミツエーリンクス
:focus-visible in WebKit - February 2021
それじゃCSSの進化を振り返っていきましょう
:where() や :is() といった詳細度への疑似クラス
where
囲われたものは詳細度が常に0になる
昔のAstroではスコープしたCSSには:where()がついてた
a:where(.astro-HOGEHOGE)のような感じ
グローバル指定のものに敗北していた
is
要素群をひとまとめに管理できるようになる(省略化)
code:css
section h1,
article h1,
aside h1,
nav h1 {
font-size: 3.6rem;
}
/** 下記のように書けるようになる */
:is(section, article, aside, nav) h1 {
font-size: 3.6rem;
}
まとめられたセレクタ内で一番詳細度が高いものに揃う
この中にid指定のものがあると…
aspect-ratio
アスペクト比率調整
かつてレスポンシブ対応のためpadding-top: 56.25%と指定していたやつ
aspect-ratio: 16/9という風に書ける
aspect-ratio: attr(width) / attr(height);
あるいは属性から持ちよって指定もできる
Flexboxにおけるgap
Gridのみでしか使えなかったプロパティ
code:flex-gap.css
display: inline-flex;
gap: 8px;
Subgrid
Grid指定は直下のものしかグリッドアイテムとして反映されず子要素には影響なかった
JSで調整するとか親子ごとで毎度指定する必要があった
grid-template-rows: subgrid;という指定を使うと親子関でグリッド関係が連動するようになる
例:要素内の高さを親のグリッド関係からもらってきて並べるようにする
https://gyazo.com/d446cc7a1a3081ad5464a60da2e57b52https://gyazo.com/ddad2f3afbf67f96ccfd9a4286d6679c
https://web.dev/articles/css-subgrid?hl=ja
CSSのSubgridが全ブラウザ対応。Gridの入れ子の基本から応用までを完全理解する
Container Queries
要素自体の幅を判定して要素のレイアウトを切り替える
コンテナクエリ @container が全ブラウザ対応。新時代のレスポンシブ対応を完全理解する
ページネーションでの実装で有用そう
feat(spindle-ui): pagination style with container queries by herablog · Pull Request #710 · openameba/spindle · GitHub
code:css
.spui-Pagination {
align-items: center;
container: spui-pagination / inline-size; /** container指定(名前とタイプの一括) */
display: flex;
flex-direction: column;
}
@container spui-pagination (width <= 360px) { /** 360ピクセルより狭い場合 */
.spui-Pagination-item--first,
.spui-Pagination-item--last {
display: none;
}
}
@container spui-pagination (width <= 768px) { /** 768ピクセルより狭い場合 */
.spui-PaginationItem-label {
display: none;
}
}
:focus-visible
キーボードフォーカスしたときのみフォーカスリングが表示されるプロパティ
code:css
:focus-visible { /** 見えるべきフォーカスのための対応 */
outline: 2px solid;
outline-offset: 2px;
}
フォーカスリングについて
Meguro.css#4ではoutline: none;というタイトルで発表しました
:focus-visibleについても紹介
このときはまだクロスブラウザで使えるものではなかった
:focusスタイルの現在について
Chromeで:focus-visibleがUA style sheetのデフォルトになった
2021年1月〜3月に各ブラウザでfocus-visible周りの動きがあったのでまとめた
Intent to Ship: Use :focus-visible in the default UA style sheet
WebKit's html.css: https://trac.webkit.org/browser/webkit/trunk/Source/WebCore/css/html.css?order=name
Chromium's html.css: https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/html/resources/html.css
Firefox' ua.css: https://searchfox.org/mozilla-central/source/layout/style/res/ua.css#166
code:css
/** 以前は以下のような指定が必要だったが今は不要になった */
:focus:not(:focus-visible) { outline: 0 };
論理プロパティ
文章の流れる方向に合わせたプロパティの指定ができるように
アラビア語だと右から左への流れになる
多言語対応とかで活躍してくれそう
以下は横書きモードの想定
margin-inline-[*],
margin-left => margin-inline-start
margin-right => margin-inline-end
margin-block-[*]
margin-top => margin-block-start
margin-bottom => margin-block-end
CSS論理プロパティを理解する | iret.media
accent-color
フォーム要素などのアクセントカラーを変更できる
標準の見た目でブランドカラーを適応する、みたいな形ができそう
code:css
:root { --bland-color: #36465d }
inputtype="checkbox" { accent-color: var(--bland-color) }
現在対応しているHTML要素
<input type="checkbox">
<input type="radio">
<input type="range">
<progress>
さまざまな単位の登場
svw/svh、lvw/lvh、dvw/dvh
ビューポートに関する単位(Small, Large, and Dynamic viewport units)
rex、cap/rcap、rch、ic/ric、lh/rlh
フォントを基準とした単位
数学関数(Math)
端数処理:round()
剰余関数:mod()、rem()
三角関数・逆三角関数:sin()、cos()、tan()、asin()、acos()、atan()
べき乗(累乗):pow()
対数:log()
比較関数:clamp()
scroll-snap
要素内でスクロールしたときにスナップするようにする
code:css
.scroller {
height: 300px;
overflow-y: scroll;
scroll-snap-type: y mandatory;
}
.scroller section {
scroll-snap-align: start;
}
スライド風のレイアウトを組む時に便利そう
scroll-behavior
スムーススクロール挙動をCSSのみで適応させる
html { scroll-behavior: smooth }
細かな指定はできない(直線的な移動のみ、バウンドのような細かな指定はできない)
inset
top, right, bottom, left に対応する一括指定
code:old.css
top: 0;
bottom: 0;
left: 0;
right: 0;
code:new.css
inset: 0;
Fix *-no-redundant-* false negatives for inset shorthand by rayrw · Pull Request #6699 · stylelint/stylelint · GitHub
stylelint側でのルール修正(inset に指定するように強制)
Media Queriesでの範囲指定方法
旧来:@media (min-width: 600px) and (max-width: 799px)
現在:@media (600px <= width < 800px)
これにより「未満」や「より大きい」の表現が可能になった
表現としてもより直接的でわかりやすくなった感じがある
@scopeや@layerの指定
適応の範囲を明確に指定できるようにする
@scope
code:css
@scope (.card) to (.card__content) { /** .card から .card_content までの上限下限を指定 */
img {
border-color: pink;
}
}
@layer
code:css
@layer base, special; /** base, special の順で適応していく */
@layer special {
.item {
color: rebeccapurple; /* colorとしてはspecial layerのほうが勝る */
}
}
@layer base {
.item {
color: green;
border: 5px solid green;
font-size: 1.3em;
padding: 0.5em;
}
}
:has()
引数に特定の要素を含んでいる要素のスタイル指定をできるようになる
code:css
/* img要素を含んでいるa要素を指定 */
a:has(> img) { border: 1px solid red }
/* p要素が隣接しているh1要素を指定 */
h1:has(+ p) { font-style: italic }
Firefoxがまもなく安定版(v121)に搭載されるはず!
CSS Nesting
CSSだけでネスト表現できるように
code:css
.hoge {
.fuga {
color: green
}
}
/** 以下と同等 */
.hoge .fuga { color: green }
code:css
@layer base {
html {
block-size: 100%
& body {
min-block-size: 100%
}
}
}
/** 以下と同等
@layer base {
html { block-size: 100% }
html body { min-block-size: 100% }
}
*/
Sass: Sass and Native Nesting
Sassとの違いについてを公式から解説
ネイティブは:is表現になるので詳細度には留意せよ
ネイティブはアンパサンドでの suffix 表現は使えない
&-hoge みたいなやつ
BEM記法もできない
View Transitions API
トランジション効果のあるアニメーション遷移を実現できる
厳密にはWeb API側やJavaScriptでの操作するもの
code:js
// 関数の実行前後の表示結果間でトランジションする
document.startViewTransition(() => {
// この中で DOM の更新処理を行う
});
code:css
.view-transitions-demo-image {
/* ページ遷移中に共有する要素に名前をつける */
view-transition-name: demo-image;
contain: paint;
}
SPA向けで使える
MPA向けも開発中
おわりに
紹介しきれずにまだ挙げそびれているものはある(はず)
新たに使える技術は増えてきたので活用はしていきたい
そのためにも日々、ブラウザで試してみるなどの素振りを大事に
サポートは最新ブラウザバージョンに追従するといえど使用は慎重に
ユーザーの使用しているOSバージョンでは追えてない可能性がある
@supportのプログレッシブな対応も検討してみる
Thank you for listening !
https://gyazo.com/4c1d0df4903765cc351797c10f903ba1
掲載
2023-12-08のJS: Redux 5.0.0、Vitest 1.0.0、Astro 4.0 - JSer.info
Meguro.css #9 レポート