来年ブラウザ各社がそろえるCSSの候補と今から使える範囲

つくば市のホームページ制作会社

新しいCSSの機能を見つけて試してみたものの、Chromeでしか動かず結局使わなかった。制作の現場では、こうした経験がめずらしくありません。ブラウザごとの対応のずれは、新機能を実案件に入れるかどうかを決めるうえで、いちばん大きな壁になってきました。

そのずれを計画的に埋めていく取り組みとして、主要なブラウザの開発元が共同で進めている「Interop」があります。いま来年分にあたるInterop 2027の対象選びが進んでおり、どの機能が入るかによって、来年の制作で安心して使えるCSSの範囲が変わります。CSSの解説で知られる開発者のJosh Comeau氏が、自分が投票した候補を10件紹介する記事を10月下旬に公開していたので、それを手がかりに、候補の中身と今から使えるかどうかを整理してみます。

ブラウザの足並みをそろえるInteropという仕組み

InteropはGoogle、Apple、Microsoft、Mozillaの各社に、Igalia、Bocoupを加えた体制で進められている年単位の取り組みです。毎年「重点分野」を決め、各ブラウザがその分野の自動テストにどれだけ合格しているかを公開の集計画面で追いかけます。Comeau氏によると、重点分野に入った機能は、1年ほどで主要ブラウザすべての対応がほぼ100%に届くことが多いとされています。

わかりやすい例が、Gridレイアウトを入れ子の要素にも引き継げるサブグリッド(subgrid)です。Firefoxは2019年に実装していましたが、ほかのブラウザでは何年も動きがありませんでした。それがInterop 2023の対象に入ると、その年の終わりには主要ブラウザで広く使える状態になりました。今年のInterop 2026に入ったスクロール連動アニメーションも、すでに全ブラウザで実装済みとされ、要素を別の要素に結びつけて配置するアンカー配置も、広く使える段階に来ています。

「いつか全部のブラウザで使えるようになる」を待つのではなく、「この機能はこの年に進む」という見通しが立てやすくなった点が、制作側にとってInteropのいちばんありがたいところだと感じます。

候補の選ばれ方と開発者の声の入り口

web.devでRachel Andrew氏が9月3日に公開した告知によると、Interop 2027の提案受付は9月23日までで、その後、決められた手順に沿って全候補が検討されます。提案の条件として挙げられているのは、仕様が安定していること、どのブラウザの開発元からも反対が出ていないこと、そして合否の判定に使える十分なテストがそろっていることです。過去の対象は、少なくとも1つのブラウザで実装済みのものが多かったとも書かれています。

つまりInteropは、まったく新しい機能を生み出す場ではなく、標準化の手続きを終えたものを全ブラウザで同じように動かすための場です。今年の対象の多くは、The State of CSSのような開発者アンケートで要望の多かった機能や、開発者の要望を集めたリポジトリで上位に入った機能だったとも説明されています。

Comeau氏の記事によると、今回はMozillaのチームが候補に投票できる順位づけの仕組みを用意しており、その結果を来年の対象選びに使う予定とのことです。告知の時点でも、提案一覧に「いいね」やコメントを付けて重要だと思うものを後押ししてほしいと呼びかけられています。海外の取り組みですが、日本の制作者が投票や意見で関われる窓口が開いているのは知っておいてよい点です。

角と枠の形を変えるcorner-shapeとborder-shape

ここから候補の中身を見ていきます。Comeau氏が挙げた機能の多くは、10月時点でChrome 155とEdge 154では動き、Firefox 157とSafari 27ではまだ動かない、という状態です。

見た目への効き方がわかりやすいのがcorner-shapeです。border-radiusは角を四分の一の円で丸めますが、corner-shapeではその角のつなぎ方を、角を斜めに落とすbevel、内側にえぐるscoop、切り欠きのnotch、なめらかな角丸のsquircleなどから選べます。これまでもclip-pathやマスクで近い形は作れましたが、corner-shapeは要素の枠の形そのものを変えるため、枠線やアウトライン、影も変えた形に沿って描かれるのが大きな違いです。

その一段下の仕組みとして提案されているのがborder-shapeで、直線や円弧、ベジェ曲線を組み合わせて枠の形を自分で描けます。こちらも枠そのものの形が変わるので、枠線や影がきちんと追従し、形どうしをアニメーションでつなぐこともできるそうです。

Comeau氏は、corner-shapeは対応していないブラウザでは普通の角丸に戻るだけなので、今から段階的な強化として使ってよいと書いています。ボタンやカードの角を少し個性的にしたい、という中小企業サイトの小さな演出なら、未対応のブラウザで崩れる心配がほとんどない使い方です。

書き方を短くする自作関数と継承の調整

Comeau氏がいちばん期待を寄せているのが、CSSの中で関数を定義できる@functionです。引数を受け取り、resultで返す値を書くという、JavaScriptに近い書き方で、たとえば「指定した色から透明へ向かうグラデーション」をひとつの関数にまとめ、各所では色だけを渡して呼び出す、といった使い方ができます。サイト全体で似た指定を何度も書いている場合、修正の手間を減らせる仕組みです。ただしこれは、未対応のブラウザでは指定自体が効かなくなる種類の機能なので、全ブラウザでそろうまでは、見た目の土台になる部分には使いにくいと考えておくのが無難です。

まだどのブラウザにも実装されていない段階の提案として、inherit()関数も紹介されています。親の値をそのまま受け継ぐinheritキーワードと違い、受け継いだ値をcalc()で加工できるものです。角丸の箱を入れ子にするとき、内側の丸みを少し小さくしたい、といった場面で役立ちます。Comeau氏自身も、今回の対象に入る可能性は高くないとみています。

Gridのすき間に線を引ける「すき間の装飾(gap decorations)」も候補です。Gridではセルが空だと線を引く要素がなく、区切り線を入れるのに工夫が必要でしたが、ruleという枠線に似た指定で、行や列のあいだに直接線を引けるようになります。料金表や会社概要の表組みを、Gridで組んでいる現場には便利な機能です。

動きと状態を読み取る指定

開閉式の見出し、いわゆるアコーディオンを作るとき、高さを0からautoへなめらかに動かせないことに悩んだ人は多いはずです。interpolate-sizeとcalc-size()は、このautoのようなキーワードの値どうしのあいだでアニメーションできるようにするものです。Chromeでは2024年から実装されていて、Comeau氏は今から段階的な強化として使えるとしています。ただし、未対応のブラウザでは開閉にわずかな遅れが出るため、@supportsで対応を確かめてから動きを付けるよう注意を添えています。

スクロールに関しては、指定した位置まで来たときにアニメーションを1回走らせる「スクロールで始まるアニメーション」も候補です。今はIntersectionObserverを使ってJavaScriptで書くのが一般的ですが、CSSだけで書けるようになれば、スクロール連動のものと使い分けられます。

状態を読み取る系では、position: stickyの要素が画面上端に貼り付いたかどうかを判定できる「スクロール状態のコンテナクエリ」があります。貼り付いたときだけ見出しの背景や下線を変える、といった指定がCSSだけで書けます。スクロールできる余地が上下に残っているかも判定できるので、続きがあることを示すぼかしの表示にも使えます。アンカー配置の拡張として、ツールチップが上下どちらに反転したかを判定できるコンテナクエリも挙げられていました。

見た目の並びと操作の順番をそろえるreading-flow

アクセシビリティの面で意味が大きいのがreading-flowとreading-orderです。GridやFlexboxで、パソコンとスマホとで並び順を大きく変えるのはよくある作りですが、Tabキーでの移動や支援技術での読み上げの順番は、HTMLに書いた順のままです。その結果、画面幅によっては、見た目の順番と操作の順番が食い違ってしまいます。

reading-flowは、この操作の順番をGridの行の順など見た目の並びに合わせるよう指定できるもので、細かく決めたい場合はreading-orderで個別に順番を付けられます。Comeau氏は、この提案を進めてきたのが先ほどの告知を書いたRachel Andrew氏であることにも触れています。キーボードだけで操作する人や、読み上げを使う人にとって迷いにくいサイトにする指定なので、全ブラウザでそろえば、レスポンシブデザインの組み方の自由度も上がります。

今回の候補を見渡すと、多くはまだChromeとEdgeでしか動かず、日本で利用の多いiPhoneのSafariには届いていません。そのため実案件では、角の形や開閉の動きのように、効かなくても表示が崩れない部分から試し、関数やすき間の装飾のように土台に関わるものは、来年の対象が決まって各ブラウザの対応が進むのを見てから取り入れる、という分け方が現実的だと考えています。どれが選ばれるかはまだ決まっていませんが、来年の制作で何が使えるようになりそうかを知っておくと、デザインの提案やコーディングの方針を、少し先回りして考えられるはずです。

Safariの新版で選択欄の装飾とGrid Lanesの指定名が改まる

つくば市のホームページ制作会社

10月26日、AppleのWebKitチームがSafari 27.2の新機能をまとめた記事を公開しました。今回は大きな新機能の追加というより、すでに入っている機能の仕上げが中心です。とはいえ、セレクトボックス(プルダウン)の見た目を整える仕組みと、石積み風のレイアウトを作るGrid Lanesのプロパティ名に変更が入っており、実際にコードを書く側には見逃せない内容になっています。

あわせて、アクセシビリティやメディア、CSSなどにまたがる20件の不具合修正も含まれています。順番に見ていきます。

セレクトボックスの表示部分をCSSだけで整えられる

セレクトボックスを自由に装飾できる「カスタマイズ可能なselect」は、Safari 27.0で入った機能です。その後も標準化の議論で細部が詰められていて、各ブラウザの実装もそれに合わせて更新されているとのことです。

これまで、選んだ項目をボタン部分にどう表示するかを細かく指定するには、<selectedcontent>という要素をボタンの中に置く書き方が用意されていました。今回のSafari 27.2では、新しい疑似要素::field-contentが加わり、この要素を書かなくても、ページ上に表示される選択中の文字をCSSから装飾できるようになりました。つまり、昔ながらの<select>と<option>だけのHTMLのままでも、表示部分の見た目に手を入れられるということです。

既存サイトのフォームは、CMSやフォーム系のプラグインが出力したHTMLを触りにくいことが多いものです。HTMLを書き換えずにCSSの側だけで調整できる余地が増えるのは、制作の現場ではかなりありがたい変化だと感じます。

既定の見た目も細かく直された

appearance: base-selectを指定したときの既定のスタイルにも手が入っています。ボタン内の文字が上下中央により安定してそろうようになり、選択中の文字は<select>に指定したtext-overflowを引き継ぐようになりました。長い項目名を省略記号で切りたいときに、指定が素直に効くようになるわけです。

開閉の印である::picker-iconも描き方が変わり、位置合わせのために負のマージンを使う必要がなくなったと説明されています。ボタン側の余白の取り方も変わり、<selectedcontent>を使わない書き方でも印が常に見えるように整えられました。

大きな選択肢一覧が画面からはみ出さなくなった

項目の多いセレクトボックスでは、開いたときの一覧が画面の外に一部はみ出すことがありました。Safari 27.2では、配置にsafeの考え方を当てはめることで、一覧が画面内に収まるようになっています。

これはセレクトボックスだけの修正ではなく、CSSの配置の仕様そのものの変更から来ています。絶対配置や固定配置の要素では、safeを指定すると元の包含ブロックの中に収まるように扱われるようになりました。また、safeやunsafeのキーワードをnormalの配置と組み合わせて書けるようになったとのことです。ポップアップやツールチップのように、はみ出しが起きやすい部品を作るときに覚えておきたい点です。

関連して、モーダルの<dialog>の中にアンカー配置を使った要素を置いたとき、ページをスクロールすると画面外に配置されて見えなくなる不具合も直っています。

Grid Lanesのflow-toleranceはfit-toleranceへ

Grid Lanesは、高さのそろわないカードを隙間なく詰めて並べる、いわゆる石積み風のレイアウトをCSSで作るための仕組みで、Safariでは今年3月の26.4から使えるようになっていました。その後、CSSの標準化を担う作業部会で、flow-toleranceというプロパティ名を、役割がより伝わるfit-toleranceに改めることが決まりました。Safari 27.2はこの新しい名前に対応しています。

古い名前もしばらくは非推奨の別名として動きますが、WebKitチームは早めの書き換えをすすめています。Safariの開発者ツール(Web Inspector)が、書き換えが必要な箇所に印を付けて知らせてくれるそうです。試作や検証でGrid Lanesを使っている場合は、今のうちに検索して置き換えておくと後で慌てずに済みます。

fit-toleranceは何を決めるのか

このプロパティは、次の項目をどの列に置くかを選ぶときの「こだわり具合」を決めるものです。許容幅がなければ、ブラウザは中身がいちばん上で終わっている列を厳密に探してそこに置きます。fit-toleranceを指定すると、その幅の中に収まる差の列は同じ高さとみなされ、先頭の列が選ばれます。既定値は1emです。

記事では、許容幅を大きくすると、続く項目がとなりの列に並びやすくなり、わずかな高さの差を追ってページの左右を行ったり来たりしなくなると説明しています。キーボードで項目を順に移動しながら画面を見ている利用者にとって、フォーカスの動きが追いやすくなるという利点があり、多くの場合はこの値をかなり大きめにするのがよいとのことです。どこまで上げるかは、中身の大きさやばらつき次第です。

見た目の整い方だけでなく、操作の順番まで考えて値を決めるという視点は、事例紹介や商品一覧をカード型で並べることの多い中小企業のサイトでも参考になります。Grid Lanesを本番で使うかどうかは対応ブラウザの広がりを見ながらの判断になりますが、名前が固まりつつある今は、手元で触って感覚をつかんでおくにはよい時期だと思います。

アコーディオンの開閉アイコンは下向きの山形がいちばん迷わせない

つくば市のホームページ制作会社

スマートフォン向けのメニューやよくある質問のページで、項目をタップすると中身が開くアコーディオンはすっかり定番の部品になりました。ただ、その項目の右端に付ける小さなアイコンを何にするかは、案件ごとになんとなく決めていることが多いのではないでしょうか。Smashing Magazineに、このアイコン選びと、ナビゲーションでよく見かける「分割メニュー」の扱いを整理した記事が載っていました。調査会社NN/gの利用者調査をもとにした内容で、見た目の好みの話ではなく、利用者がどう受け取りどこをタップするかという観点でまとめられています。

アイコンがないと利用者はページへ移ると考える

記事によると、項目にアイコンが何も付いていない場合、利用者はタップすると別のページへ移動すると予想する傾向があるとされています。つまり、開閉するつもりで作った項目でも、アイコンがなければリンクとして受け取られやすいということです。独自にデザインした凝ったアイコンも、開閉の合図としては伝わりにくいと指摘されています。

もうひとつ興味深いのが、タップされる場所の話です。多くのアイコンでは、文字の部分とアイコンの部分がほぼ同じくらいの割合でタップされていたそうです。アイコンは目印であると同時に、押される場所そのものでもあるということになります。例外は下向きの山形(キャレット)で、このアイコンのときはアイコン側がより多くタップされていたとされています。

記事はリンクについての目安もはっきり示しています。押すと別のページへ移るものなら、矢印などは付けずに下線を引くだけでよいという考え方です。地味ではあるものの、確実に伝わるという点では下線に勝るものはない、という主張です。

文字とアイコンで動きを分ける作りは避けたい

記事がもっとも強く注意を促しているのが、分割メニューです。項目の文字を押すとカテゴリのページへ移り、右端のアイコンを押すと下の階層が開く、という作りを指します。サービス紹介の下に個別のサービスが並ぶようなメニューで、ページへの導線と下の階層の両方を一つの行に持たせたいときに採られがちな形です。

しかし先ほどのとおり、利用者は文字とアイコンを同じくらいの割合で押します。そのため、開くつもりで文字を押してページが変わってしまったり、ページを見たいのにアイコンを押して開いてしまったりと、意図しない動きが起きやすくなります。記事では、項目全体を押せば下の階層が開くようにし、カテゴリのページへのリンクは開いた中に「一覧」や「概要」のような項目として置く方法を勧めています。実例として、ドイツの物流会社DHLのサイトが、余計な矢印を付けず、分割もせず、各階層の中に概要へのリンクを置いている形が紹介されていました。

状態に応じて上下左右さまざまな向きの矢印を出し分けるデザインについても、やや複雑にしすぎていると記事は見ています。カテゴリのページへのリンクであることを矢印で示す必要は、たいていの場合ないという整理です。

プラスと矢印は伝わるが別の意味にも取られる

開閉の合図として、プラスとマイナスや、下向きと上向きの矢印もよく使われます。記事によると、これらも多くの場合は問題なく理解されるとされています。ただし、どちらも意味を背負いすぎている記号でもあります。プラスは、あとで見るために保存する、カートに入れる、拡大するといった操作にも使われるため、階層の深いメニューで複数の段が同時に開いている場面では特に紛らわしくなりやすいそうです。

矢印も同様で、スクロールや横へのスライド、次の検索結果への移動、ページ内の特定の位置への移動など、さまざまな操作を連想させます。調査では、矢印の付いた項目について新しいページへ移ると予想した人が一定数おり、アイコンなしの場合はさらに多かったとされています。

こうした比較から記事が出している結論は明快です。閉じた状態では下向きの山形を表示し、開いたら上向きか横向きの山形に変えるのが無難な選択で、代わりを使うならプラスとマイナスもおおむね機能する、というものです。検索結果の折りたたみに下向きの山形を使っている例として、学術情報の検索サービスLens.orgも挙げられていました。

中小企業のサイトで見直すときの手がかり

制作の現場では、スマートフォンのメニューを作るときに、親のページにも行けるようにしてほしいという要望を受けて、文字はリンク、右端のアイコンで開閉という形にすることがよくあります。WordPressのテーマやメニュー用のプラグインでも、この分割型が標準の動きになっているものは珍しくありません。要望自体はもっともなので、今回の記事のように、開いた中の先頭に親ページへのリンクを置く形を提案すると、導線を残したまま押し間違いを減らせそうです。

既存のサイトを見直す場合は、まずスマートフォンでメニューやよくある質問の部分を触ってみて、文字とアイコンの押した結果が違わないか、アイコンの向きが状態とちぐはぐになっていないかを確かめるところから始められます。凝ったアイコンを差し替えるだけでも伝わり方は変わるかもしれません。派手さのない話ですが、問い合わせや資料請求のページへたどり着くまでの小さなつまずきを減らすという意味では、手間に見合う見直しだと感じます。単純なほうがうまくいくことが多い、という記事の締めくくりは、部品選びで迷ったときの判断の軸としても覚えておきたいところです。

表の見出しと左端の列を同時に固定できるCSSがChromeに届いた

つくば市のホームページ制作会社

料金表やスペック比較表のように横に長い表をスマートフォンで見せるとき、見出し行と左端の列の両方を画面に残したい、という場面は制作の現場でよくあります。ところが、これまでのCSSでは片方しか固定できず、JavaScriptで補ったり見出しを二重に用意したりするのが定番の回避策でした。10月に安定版になったChrome 156で、この古い悩みをCSSだけで片付けられる仕組みが使えるようになっています。

片方しか固定できなかった理由

横に長い表は、レイアウトを崩さないよう overflow-x: auto を指定した囲みに入れるのが一般的です。そのうえで見出し行に position: sticky; top: 0;、左端の列に position: sticky; left: 0; を指定すれば、両方が残りそうに見えます。

実際には、横スクロールでは左端の列が残るものの、ページを縦にスクロールすると見出し行はそのまま流れて消えてしまいます。Chromeの開発者向け広報を担当するBramus氏の解説によると、原因は overflow の仕様にあります。片方の軸に auto や scroll を指定すると、もう片方の軸も自動的にスクロールする扱いになり、囲みが縦横両方の基準になってしまうためです。見出し行は縦にはスクロールしない囲みに貼り付こうとするので、結果として固定が効きません。

この問題はCSSの仕様を検討する作業部会に2017年から要望として上がっていた、かなり息の長いテーマでした。

片方の軸だけをスクロールさせる指定

今回の変更は、overflow にスクロールする値と clip を組み合わせて書けるようにするものです。Googleの技術者が公開している解説文書によると、これまでも overflow: scroll clip のような書き方自体はできましたが、clip は自動的に hidden に置き換えられていました。新しい挙動では clip がそのまま残り、その軸ではスクロールの基準にならなくなります。

表の例に当てはめると、囲みの指定は次のようになります。

.table-wrapper {
  overflow: auto clip;
}
.table-wrapper thead {
  position: sticky;
  top: 0;
}
.table-wrapper td:first-child {
  position: sticky;
  left: 0;
}

横方向は囲みの中でスクロールし、縦方向は clip で切り離されます。こうすると左端の列は囲みを基準に、見出し行はページ全体のスクロールを基準に、それぞれ別々に貼り付きます。ここで overflow-x: auto だけを書くと縦も auto に計算されて元の状態に戻ってしまうので、clip を明示するのがポイントです。

解説文書では、スクロールを片方に絞ったカルーセルで scrollIntoView() を呼んだときの挙動も改善点として挙げられています。hidden で隠した軸はスクリプトから動かせてしまい、利用者には戻す手段がありませんでしたが、clip にすればその軸は動かなくなります。

使いどころと気をつけたい点

中小企業のサイトでも、料金プランの比較、製品の仕様一覧、営業時間や時刻表など、横に長い表を載せる機会は少なくありません。スマートフォンで横にスクロールしているうちに、どの列が何の項目か分からなくなるのはよくある不満なので、見出しと項目名の両方が残るだけで読みやすさはかなり変わります。

一方で、現時点で対応しているのはChromium系のブラウザだけです。Bramus氏の記事の対応状況では、FirefoxとSafariは未対応とされています。ブラウザ間の互換性をそろえる取り組みであるInteropでも、2027年の重点分野の候補として提案が出たばかりで、WebKitとMozillaの立場表明はまだ保留の段階です。未対応のブラウザでは従来どおり片方だけが固定される表示になるため、見出しが流れても表として読める作りにしておくのが無難です。対応の有無は @supports named-feature(single-axis-scroll-container) で判定できるとされているので、対応ブラウザにだけ指定を足す書き方もできます。

もうひとつ、既存のサイトへの影響にも目を向けておきたいところです。これまで clip が hidden に読み替えられていたのを前提に組まれたページでは、挙動が変わる可能性があります。Chromeは公開前に互換性の調査を行ったとしていますが、もし表示が変わった場合は clip を hidden に書き換えれば以前の挙動に戻せると案内されています。手元で管理しているサイトに overflow: scroll clip や overflow: auto clip の指定が残っていないか、一度検索してみると安心です。

JavaScriptに頼っていた部分を減らせる

表の見出しを固定するために、スクロール位置を監視して位置を合わせ直すスクリプトを入れている案件は意外と多いはずです。解説文書でも、スクリプトによる再現は電池を消耗し、保守しにくく、スクロールとの同期も完全にはならないと指摘されています。CSSの指定ひとつで済むなら、表示のずれやちらつきの心配も減り、更新時に壊れる箇所も少なくなります。

他のブラウザがそろうまでは段階的な導入になりますが、表をよく使うサイトなら、まずは対応ブラウザで見出しが残る仕上がりを試しておくと、全ブラウザで使えるようになったときにすぐ切り替えられます。長年の回避策を少しずつ手放していける変更として、覚えておいて損はない機能です。

値の揺らぎをCSSだけで作れるrandom関数がChromeにも届く

つくば市のホームページ制作会社

背景に散らした水玉の位置を少しずつずらしたい、カードを机に置いたように不ぞろいに傾けたい。そんな「ちょっとした揺らぎ」を出すために、これまではJavaScriptで乱数を作ってstyle属性に書き込むか、あらかじめ手で値をばらして書いておくのが定番でした。CSSに乱数を生む random() 関数が入り、Safariに続いてChromeでも使えるようになりつつあります。

Chromeのベータ版で有効になった

random() は、指定した範囲から数値をひとつ選んでくれるCSSの関数です。もともとSafariが先行して実装し、WebKitの開発者ブログで星空や写真の山積み、ルーレットといったデモ付きで紹介されていました。CodePenのブログでChris Coyier氏も、Safariが先導したこの機能がChromeにも来ることを歓迎する記事を書いています。

あるブラウザ対応状況を自動で追っている公開リポジトリの記録によると、CSS.supports() での判定がChromium 153では未対応、Chrome 156のベータでは対応に変わったとのことです。同じ記録では、Chrome 156の安定版の公開は10月20日の予定とされています。一方、MDNの解説ページではまだ主要ブラウザの一部で動かない機能という扱いで、Polypaneの検証記事でもSafari 26.2以降は部分対応、Firefoxは未対応と書かれています。全員の画面で同じように動く段階ではない、という前提で付き合うのがよさそうです。

書き方の基本と、値を共有する仕組み

いちばん簡単な形は random(最小値, 最大値) です。たとえば top: random(0%, 100%); と書けば、要素ごとに縦位置がばらけます。三つ目に刻み幅を足すと random(2px, 10px, 1px) のように端数のない値だけが選ばれます。最小値と最大値は同じ種類の値にそろえる必要があり、random(0, 100%) のように数値と割合を混ぜると無効になる点はPolypaneの記事でも注意されていました。

少しつまずきやすいのが、カスタムプロパティとの組み合わせです。--size: random(50px, 20vmin); と書いて幅と高さの両方に使っても、二つは別々の値になります。カスタムプロパティは結果を保存する変数ではなく、呼び出した場所に式をそのまま差し込む仕組みだからです。幅と高さをそろえて正円にしたいときは、最初の引数に共有の範囲を指定します。MDNによると、element-scoped は同じ要素の中で値を共有し、property-scoped は全要素で同じプロパティの値を共有します。--particle-size のような独自の名前を付けて共有範囲を決めることもでき、@property で登録したカスタムプロパティなら計算済みの値が保持されるとのことです。

仕様の言葉は途中で変わっている

一年ほど前のWebKitの記事では、全要素で共有する指定に element-shared という語が使われていました。今のMDNでは前述の element-scoped や property-scoped といった語で整理されています。検索で見つかる古いサンプルをそのまま写すと動かないことがあるので、書き方は最新の資料で確かめるのが安全です。

中小企業のサイトで使うなら

実務で使いやすいのは、なくても困らない装飾の部分です。背景の粒の配置、ホバーしたときの写真のわずかな傾き、紙吹雪のような演出などは、対応していないブラウザでは揺らぎのない固定の見た目に戻るだけで済みます。WebKitのルーレットのデモでも、先に固定の値を書き、その次の行で random() を書いて上書きする形が取られていました。@supports で対応を判定して出し分ける方法もMDNの例に載っています。

逆に、文字色や背景色のように読みやすさに関わる値を乱数に任せるのは避けたほうが無難です。MDNのアクセシビリティの項でも、ランダムな文字色が背景と見分けにくくなるおそれが指摘されています。色を揺らすなら、明るさは固定して色相だけを動かすなど、範囲をしぼる工夫が要ります。また、ページを読み込むたびに見た目が変わるため、表示崩れの報告を受けたときに再現しにくい点も、制作側としては頭に入れておきたいところです。

これまでJavaScriptや手作業の値のばらしで支えてきた小さな演出が、スタイルシートの数行に収まるようになります。全ブラウザでそろうまでにはまだ時間がかかりそうですが、まずは自社サイトの装飾の一部から試し、崩れない作り方の勘所をつかんでおく価値はありそうです。

Firefoxの直近の版で使えるようになったCSSと画像まわりの変更

つくば市のホームページ制作会社

Firefoxは9月29日に157、10月13日に158を公開しました。MDNの開発者向けリリースノートを読むと、派手さはないものの、サイト制作の現場で効いてきそうな変更がいくつか並んでいます。ここでは、ふだんのサイト制作や運用に関わりそうなものを順に拾ってみます。

その1 JPEG XL画像が既定で表示されるようになった

Firefox 158で、JPEG XL形式(image/jxl)の画像が既定で表示されるようになりました。JPEG XLは使用料のかからない画像形式で、非可逆と可逆の両方の圧縮、透過、アニメーション、HDRに対応しています。既存のJPEGを画質を落とさずに変換し直せる点も特徴とされています。

あわせて、画像を取りにいくときの既定のAcceptヘッダーにimage/jxlが加わり、AVIFの次、WebPの前という並びになりました。サーバー側でAcceptヘッダーを見て配信する形式を切り替えている場合は、この並びの変化が判定に影響しないか一度確かめておくと安心です。

その2 単位の違う値どうしをcalc()で割れる

158では、CSSの型付き算術(typed arithmetic)に対応しました。calc()などの中で、同じ種類の値であれば単位が違っても割り算ができ、その結果は単位のない数になります。この数をほかの種類の値に掛け直すことで、たとえば画面幅と要素の幅の比率から文字の大きさや余白を決める、といった関係づけをCSSだけで書けるようになります。

これまでJavaScriptで寸法を測って計算していた処理の一部が、CSS側に移せる可能性があります。ほかのブラウザの対応状況を見ながら、段階的に取り入れていく類いの機能です。

その3 スクロールの受け渡しだけを許すchain

157では、overscroll-behaviorとその個別プロパティにchainという値が加わりました。内側のスクロール領域の端まで来たときに外側へスクロールを引き継ぐ一方で、ブラウザ標準の跳ね返るような動きは起こさない、という指定です。

モーダルやドロワーメニューの中にスクロール領域があるページでは、端での挙動が気になる場面が少なくありません。既存のautoやcontainと比べて、中間の選択肢が増えたと考えるとわかりやすいと思います。

その4 アットルールの対応を@supportsで確かめる

同じく157で、@supportsの中でat-rule()関数が使えるようになりました。@supports at-rule(@scope) のように書くと、そのアットルールにブラウザが対応しているかを条件にできます。@importのsupports()の中でも使えます。

@scopeのように新しいアットルールを取り入れるとき、対応していないブラウザ向けの書き方を切り分ける手段がこれまで限られていました。条件分岐が素直に書けるようになるので、新しい指定を試すときの心理的な負担が少し下がりそうです。

その5 通知をクリックしたときの移動先を指定できる

158では、Notification()やServiceWorkerRegistration.showNotification()にnavigateという指定が加わりました。通知をクリックしたときに開くURLをあらかじめ渡しておけるので、ページを開くだけのためにクリック時の処理を書く必要がなくなります。157では試験的な扱いでしたが、158で正式に使えるようになっています。

その6 安全でない差し込み方でもjavascript:のURLを外せる

HTMLを安全に差し込むためのHTML Sanitizer APIにも手が入りました。158では、setHTMLUnsafe()のような安全確認を緩めた方法で差し込む場合でも、既定の設定ではhref=”javascript:…”のような属性が取り除かれるようになりました。setHTML()のような安全な方法では、これまでどおり常に取り除かれます。

試験的に入った機能にも目を向けておく

既定では無効ですが、158にはCSSのrandom()関数、角の形を変えるcorner-shape、必要になるまでモジュールの実行を遅らせるimport deferなども試験的に入っています。Speculation Rules APIでは、リンクに少しのあいだカーソルを重ねると先読みを始める段階の指定も試せるようになりました。

どれもすぐ実案件で使うものではありませんが、主要ブラウザの足並みがそろってきた機能から順に、中小企業のサイトでも使える場面が増えていきます。リリースノートを数か月おきに眺めておくだけでも、次の改修で何が使えそうかの見当がつけやすくなります。

主要ブラウザすべてで使えるようになった小さな機能たち

つくば市のホームページ制作会社

Googleのweb.devが毎月まとめている「ウェブプラットフォームの新機能」の9月版が公開されました。9月はChromeとFirefoxが隔週リリースに移った最初の月で、Chrome 153と154、Firefox 155から157、そしてSafari 27が安定版として出ています。とくにSafari 27の登場で、Chrome、Firefox、Safariの三つがそろって対応した機能、いわゆる「Baseline Newly available」に入ったものが一気に増えました。

派手な新機能というより、これまで回避策で書いていた部分がそのまま書けるようになる、という種類のものが多い印象です。ここでは中小企業のサイト制作で出番がありそうなものを選んで紹介します。

その1 遅延読み込み画像のsizesを自動にできる

loading="lazy" を付けた画像で、sizes 属性に auto を指定できるようになりました。ブラウザが実際に表示される幅を見て、srcset の候補から適切な画像を選んでくれます。Chrome、Firefoxに続いてSafari 27が対応したことで、三つのブラウザがそろいました。

レスポンシブ画像の sizes は、レイアウトを変えるたびに書き直しが必要で、正直なところ正確に保守されていない現場も多いはずです。WordPressのように画像の表示幅がテーマやブロックによって変わる環境では、とくに恩恵がありそうです。

その2 読んでいる途中で画面がずれにくくなる

Safari 27でスクロールアンカリングが有効になり、overflow-anchor プロパティにも対応しました。スクロールアンカリングとは、見えている範囲より上で要素が増えたり減ったりしたときに、スクロール位置を自動で補正して、読んでいる場所が飛ばないようにする仕組みです。

広告枠や後から読み込まれる埋め込み、Cookie同意の帯などで本文がずれる問題は、スマートフォンでよく起きます。Safariが加わったことで、iPhoneの利用者にも同じ補正が効くようになりました。特定の要素を補正の基準から外したいときは overflow-anchor: none を指定します。

その3 ダークモードで画像も切り替えられる

light-dark() 関数は、これまで色の値にしか使えませんでした。今回、背景画像やグラデーションといった画像の値も指定できるようになり、Safari 27の対応で三つのブラウザがそろっています。ロゴや装飾の背景を、明るい表示と暗い表示で出し分けたい場合に、メディアクエリを書き分けずに済みます。

関連して、Firefox 157では alert() や confirm() のダイアログ、日付や色の選択画面、フォームの入力候補の一覧が、ページの明暗の設定に合わせて表示されるようになりました。ダークモード対応のサイトで、ブラウザ標準の部品だけ白く浮いてしまう違和感が少し減りそうです。

その4 色の透明度だけを変えるalpha関数

CSS Color 5の alpha() 関数も、Firefox 155とSafari 27の対応で三つのブラウザがそろいました。元の色をそのままに、透明度だけを変えた色を返す関数です。たとえば、サイトのブランドカラーを変数で持っておき、半透明の重ね色として使いたいときに、別の色の値を用意しなくて済みます。

配色を変数で管理しているテーマなら、色の追加や変更があっても半透明の派生色が自動で追従するので、手直しの手間が減ります。

その5 直前の指定だけを取り消すrevert-rule

CSS全体に使えるキーワードとして revert-rule が加わり、こちらもSafari 27で三つのブラウザがそろいました。いま書いているルールがなかった場合の値に戻す、という働きをします。既存の revert はブラウザ標準などの段階まで戻し、revert-layer は一つ前のカスケードレイヤーまで戻すので、それよりも細かい単位で取り消せるわけです。

他社が作ったテーマや、プラグインが出力するCSSの上から調整をかけるとき、上書きの上書きを重ねるより見通しのよい書き方ができるかもしれません。

使い始める前に確かめておきたいこと

「Baseline Newly available」は、主要ブラウザの最新版がそろって対応したという意味で、古い端末やOSの更新が止まったiPhoneでは動かないことがあります。上で挙げた機能の多くは、対応していないブラウザでは単に無視されるだけなので、見た目が多少変わる程度で済むものから取り入れるのが無難です。sizesの自動指定や overflow-anchor はその代表で、既存のサイトに足しても壊れにくい部類に入ります。

web.devのまとめには、このほかSafari 27でのカスタマイズ可能な <select> への対応や、ベータ版に入ったCSSの新機能なども並んでいます。毎月の一覧を眺めて、手元のサイトで書いている回避策が不要になっていないか確かめる習慣は、地味ですが効き目があります。

更新のたびに横へずれる数字はCSSの指定ひとつで止まる

つくば市のホームページ制作会社

料金表や集計の画面を作ったとき、データもレイアウトも正しいのに、なぜか数字の並びが落ち着かないと感じたことはないでしょうか。金額の列の右端がそろわない、カウンターの値が変わるたびに行全体が少し横に揺れる。海外のフロントエンド制作者が公開している記事で、この見慣れた違和感の正体と直し方があらためて整理されていました。

原因はCSSでもデータでもなく、フォントが標準で出してくる数字の形にあるそうです。多くのフォントでは数字が文字と同じように幅を変えて並び、1は0より細く詰められます。文章の中ではこれが自然ですが、縦にそろえたい表や、その場で値が切り替わる表示では、桁の幅が毎回変わるため列が崩れたり数字が踊ったりします。

フォントに眠っている別の数字を呼び出す

解決策は font-variant-numeric: tabular-nums; の指定です。MDNの解説によると、これはOpenTypeの tnum に対応する値で、すべての数字を同じ幅にそろえます。字形そのものは変わらず、同じ大きさの枠に一つずつ収まるので、金額の列は右端がきれいに並び、タイマーや在庫数のように刻々と変わる値も横に動かなくなります。記事の著者は、表や数値のパネル、カウンターに入る数字にはとりあえず付けておく、という使い方を勧めていました。

同じ記事では、ほかの切り替えも紹介されています。文章中の数字を小文字のように上下に出入りさせて行になじませる oldstyle-nums、「1/2」と打った文字を本物の分数の形にする diagonal-fractions、ラベルを太さを保ったまま小さな大文字にする font-variant-caps: small-caps です。分数の指定は日付のような斜線の入った数字まで巻き込むので、分数の部分だけを span で囲んで適用するのがよい、という注意も添えられていました。

ブラウザの対応についての心配はほとんどありません。MDNでは font-variant-numeric は2020年1月から主要ブラウザで使える状態とされています。一方で落とし穴もあり、著者によるとGoogle Fontsで配信される可変フォントの多くは、容量を減らすために旧来の数字の形や分数などを省いているとのことです。指定しても見た目が変わらないときは書き方の誤りではなく、フォントのファイルにその字形が入っていない可能性があります。字形が無い場合も普通の数字で表示されるだけなので、表示が壊れることはありません。

日本語のサイトでは、本文の数字が和文フォントの字形で表示されることも多く、フォントによって効き方が変わります。中小企業のサイトでも、料金表や営業時間、実績の数値を並べたページは意外と多いものです。見出しや本文を変えずに数字の部分だけ整えられるので、既存サイトの手直しのついでに、使っているフォントで tabular-nums が効くかを一度確かめておくと、表まわりの印象が少し締まるはずです。

リンクの下線の長さをCSSだけで整えられるようになった

つくば市のホームページ制作会社

9月22日に安定版が出たChromeの新版には、見た目の小さな調整に効く機能がいくつか入りました。先日このブログで取り上げた、埋め込みのiframeが中身に合わせて伸びる仕組みもそのひとつですが、今回はその陰に隠れがちなCSSの追加に目を向けます。中心になるのは、下線や打ち消し線の始まりと終わりの位置を調整できる text-decoration-inset というプロパティです。あわせて、スクロールで切り替わる表示につける目印の振る舞いを選べるようになった変更と、ポップオーバーやダイアログの閉じ方の改善も紹介します。

下線の端を内側にも外側にもずらせる

これまで、文字につける下線(underline)や上線、打ち消し線は、表示された文字列とまったく同じ長さで引かれていました。デザインの都合で「下線を少し短くしたい」「左右に少しはみ出させたい」と思っても、text-decoration 側にはその手段がありませんでした。

Chrome for Developersの解説によると、text-decoration-inset は線の始点と終点を文字列の端から調整するためのプロパティです。値には auto、長さ、パーセンテージを指定でき、ひとつの値で両端をまとめて、ふたつの値で始点と終点を別々に指定できます。たとえば次のように書くと、両端が10pxずつ内側に寄ります。

a {
  text-decoration: underline;
  text-decoration-inset: 10px;
}

正の値は線を内側に縮め、負の値は外側に伸ばします。始点と終点に違う値を入れれば、線を左右どちらかに寄せることもできます。見出しの下に短いアクセント線を引く、ボタン風のリンクで線の両端を少し余らせる、といった細かな調整が、線そのものの設定だけで済むようになります。

背景のグラデーションで描いていた下線の置き換え

制作の現場では、マウスを乗せたときに下線が左から伸びてくる演出がよく使われています。従来は、本物の下線ではなく background-image のグラデーションを細く敷いてその幅を動かしたり、::after の疑似要素で線を作ってアニメーションさせたりするのが定番でした。

公式の解説でも、このプロパティを使えば背景のグラデーションや追加の要素に頼らず、文字の装飾線そのもので「線が現れる」効果を作れると説明されています。本物の下線のまま扱えるので、線の太さや色、文字からの距離といった既存の指定と組み合わせやすく、複数行にまたがるリンクでも装飾線として素直に振る舞うことが期待できます。

一方で、今回の情報源はChrome側の発表で、ほかのブラウザでの対応状況は別に確かめる必要があります。対応していないブラウザでは通常の長さの下線になるだけなので、見た目の上乗せとして段階的に取り入れるのが無理のない使い方でしょう。既存サイトの疑似要素による実装を急いで書き換えるより、新しく作るパーツから試すほうが安全です。

スクロールの目印をタブとしても扱える

もうひとつのCSSの変更は、横スクロールのカルーセルなどで使う scroll-marker-group の拡張です。このプロパティは、スクロール領域の前後に目印のまとまりを自動で作るもので、新版ではその振る舞いを links と tabs のふたつから選べるようになりました。

リリースノートによると、既定の links では目印のまとまりがナビゲーション、個々の目印がリンクとして扱われ、Tabキーで順に移動できます。tabs を選ぶと、まとまりがタブの一覧、目印がタブ、中身がタブパネルとして扱われ、Tabキーで止まるのは選択中の目印だけになり、目印の間は矢印キーで移動します。選ばれていないパネルの中身は支援技術からも隠れます。

タブ切り替えのUIを自前で作ると、キー操作や役割の付与まで含めた実装はそれなりに手間がかかります。見た目だけでなく操作の約束事までCSSの指定で選べるのは、アクセシビリティの面でも意味のある変更だと感じます。ただしこちらも対応ブラウザは限られるため、当面はJavaScriptで作った既存のタブを置き換えるより、検証環境で挙動を確かめておく段階だと考えています。

外側を押すと閉じる動作の取りこぼしが減る

同じ版では、ポップオーバーやダイアログの外側をクリックして閉じる動作も見直されました。判定に使うイベントが、押した瞬間と離した瞬間の組み合わせから、クリックのイベントに変わっています。これにより、タッチ画面でのスクロール操作や右クリックで、意図せずポップオーバーやダイアログが閉じてしまうことがなくなるとされています。

スマートフォンでメニューを開いたまま中身をスクロールしようとして閉じてしまう、という問い合わせは小さな会社のサイトでも起こりがちです。ブラウザ側の変更なので制作側の作業は要りませんが、標準のポップオーバーやダイアログを使っている部分は、今後こうした改善が自動的に届く側に回ります。下線の長さのような細部も含めて、手作りしていた部分を少しずつ標準の機能に寄せていくと、保守の手間が軽くなっていくはずです。

スクロールバーの色指定を標準側に寄せる頃合い

つくば市のホームページ制作会社

サイトの一部に横スクロールの表や、高さを決めたお知らせ欄を置くと、スクロールバーの色をデザインに合わせたいという話がよく出ます。そのとき長く使われてきたのが、::-webkit-scrollbar で始まる一連の擬似要素です。9月15日に公開されたFirefox 156では、この古い書き方の扱いが少し変わりました。目立たない変更ですが、既存サイトのCSSを見直すきっかけになりそうなので紹介します。

Firefox 156で変わった判定の結果

MDNの開発者向けリリースノートによると、Firefox 156では @supports selector(::-webkit-scrollbar) という条件が、すべてのサイトで偽を返すようになりました。反対に @supports not (selector(::-webkit-scrollbar)) は真になります。

背景には、Firefox 155で入った仕組みがあります。設定で指定された一部のドメインに限って、Firefoxは ::-webkit-scrollbar の指定を実際に反映しています。156でもその反映自体は続きますが、対応しているとは答えなくなりました。リリースノートの説明では、多くのサイトがこの判定を関連する擬似要素一式が使える合図として扱っている一方、Firefoxは -thumb や -track といった仲間の擬似要素には対応していないため、とされています。

結果として、標準のスクロールバー指定を @supports not (selector(::-webkit-scrollbar)) の中に書いていたサイトでは、Firefoxでもその指定が適用されるようになります。

標準の指定はすでに主要ブラウザで使える

標準側の手段は、scrollbar-color と scrollbar-width の二つのプロパティです。MDNの scrollbar-color のページでは、2025年12月から主要ブラウザの最新版でそろって使える機能(Baseline 2025)として扱われています。

書き方は単純で、scrollbar-color に色を二つ並べると、最初がつまみ(サム)、二つ目が溝(トラック)の色になります。ルート要素に指定すれば、ページ全体のスクロールバーにも効きます。一方の ::-webkit-scrollbar はどの標準にも含まれない独自仕様で、つまみや上下のボタンまで細かく作り込めるかわりに、ブラウザによって効いたり効かなかったりします。

注意したいのは両者の優先関係です。MDNによると、ある要素の scrollbar-color や scrollbar-width の計算値が auto 以外だと、ブラウザはその要素の ::-webkit-scrollbar 系の指定を無視します。しかも scrollbar-color は継承されるため、親要素に色を指定しただけで、子の要素に書いた独自スクロールバーが効かなくなることがあります。その要素で scrollbar-color: auto を指定し直せば、独自の見た目が戻るとされています。

既存サイトで確かめておきたい書き方

MDNが紹介している代替の書き方は、まず @supports (scrollbar-color: auto) で標準プロパティが使えるかを確かめ、使えないブラウザに向けてだけ @supports selector(::-webkit-scrollbar) の中に独自の擬似要素を書く、という二段構えです。標準を先に置き、古い書き方を補助に回す形なので、今回のFirefoxの変更とも食い違いません。

見直しの対象になりやすいのは、以前に作ったテーマやページ単位の追加CSSで、Firefoxだけを別扱いにするつもりで ::-webkit-scrollbar の判定を分岐に使っているケースです。判定の前提が変わったので、Firefoxで見た目が変わっていないか一度開いて確認しておくと安心です。スクロールバーを display: none で消している箇所があれば、ブラウザごとに同じように消えているかもあわせて見ておきたいところです。

色を変える前に考えたいこと

MDNは、スクロールバーの見た目はなるべく既定のままにしておくよう勧めています。見慣れた形から離れると、使い勝手が損なわれやすいためです。変える場合は、つまみと溝の色の差を十分にとること(コントラスト比3対1が目安)、独自に作り込むなら指で触れる大きさを確保することが挙げられています。なお、ハイコントラスト表示のような強制カラーモードでは、scrollbar-color は自動的に auto に戻ります。

中小企業のサイトでも、ブランドカラーに合わせてスクロールバーまで塗りたいという要望は珍しくありません。色を合わせる程度なら、今は標準の二つのプロパティで十分に届きます。細かな作り込みは古い擬似要素に任せるとしても、土台を標準側に置いておくほうが、今回のようなブラウザ側の変更にも振り回されにくくなるはずです。