フロントエンド
カンファレンス
関西2025






まずはクイズ!






MDN に掲載されている CSS プロパティは
全部でいくつあるでしょう?

color, font-size, margin, display...







正解: 532 個







532 個読んできたよっていう話をします




フロントエンドカンファレンス関西2025

このプロパティいつ使うん?

~mdn の CSS リファレンス、全部読んでみた~

yata(@0e2b3c)

自己紹介

  • yata(@0e2b3c)
  • 株式会社 LayerX バクラク勤怠 SWE
  • 2025 年 新卒入社
  • スマブラとヨルシカと礼賛と
    ゆる言語学ラジオが好きです

今回話すこと

  • MDN の CSS プロパティ リファレンスを全部読んできました
  • その中で印象的だったものを 11 個紹介します

FAQ: 本当に全部読んだ??

  • それっぽいのだけピックアップして読むこともできる
    • 適当に最新情報の記事とか読んで集めれば終わるやーん
  • AI 使えばめっちゃショートカットできそう
    • 「カンファレンスでネタになりそうなプロパティを 11 個出して」

自分で全部読みました

  • 備忘録として Notion に全てまとめました

自分で全部読みました

  • 右の QR コードから見れます!
  • スマホだと見づらすぎるので PC がおすすめ
  • #fec_kansai で 5 分くらい遡るのも 🙆‍♂️
    • 1 分前くらいにポストしました

目次

  • いつもの実装をちょっと楽にするプロパティ3選
  • 悪用しても面白いプロパティ3選
  • これからの実装を大きく変え得るプロパティ5選

事前説明:アイコンで分かるブラウザの対応状況

  • プロパティの紹介では隣にアイコンが表記されます
  • これらは Baseline に乗っているか(全てのコアブラウザで実装済みか)を示しています
Limited availability
: 一部のブラウザでしか使えないプロパティ
Newly available
: 全てのコアブラウザで実装済みのプロパティ
Widely available
: 全てのコアブラウザに実装後30ヶ月が経過したプロパティ






1. いつもの実装をちょっと楽にするプロパティ3選

1-1. place-items

上下左右の中央揃えどうやる?

  • display:flex, justify-contents:center, align-items:center
  • position:absolute, top:50%,left:50%, transform: translate(-50%,-50%)
    • inset:0とかもある
  • grid なら2行でできる 🤲

1-1. place-items

概要

  • grid レイアウトの上下左右の配置を制御する
.container {
  display: grid;
  place-items: center;
}
  • align-itemsjustify-items の一括指定プロパティ
    • flexbox では justify-items が無視されるのでインライン方向が中央揃えにならない
  • こだわりが無ければ使ってみると短く済んで良さそうです 🤲

1-2. line-clamp

「長すぎるテキストを途中で省...」ってどうやってる?

  • よくあるやつ:white-space:none;overflow: hidden;text-overflow:ellipsis;
    • 3つも必要だし、1 行しか対応していない...😢
    • 複数行対応するためにはdisplay: -webkit-box;が必要...😢
  • line-clamp を使えば解決 🤲

1-2. line-clamp

概要

  • 指定した数値の行数で省略する

  • 例えば line-clamp: 1;overflow: hidden;を指定すると

めちゃくちゃに長いので1行に表示できない文章です
  • 例えばline-clamp: 2;overflow: hidden;を指定すると
この文章はあまりに長いので、とても2行に
収めて表示することなどできないとされています

1-2. line-clamp

すぐにでも使いたい!

  • まだ Limited Availability、W3C の仕様書を覗いてみると Working Draft
  • -webkit プレフィックス無しでは利用することができない
  • しかも-webkit-line-clampdisplay: -webkit-box;-webkit-box-orient: vertical;に依存してる
    • text-overflow:ellipsis;使った方が行数が少ない!

1-2. line-clamp

当分使えなさそう...

  • プロパティ自体は 2010 年ごろから存在する
    • Apple が Safari に 独自実装し、他のブラウザが追従する形で実装された
  • 標準化しようとしているものの、計算の複雑さや-webkitとの共存の方法が課題
  • csswg-drafts でも overflow の issue の 約 1/4 がline-clampに関するもので絶賛議論中
    • 気長に待ちましょう!

1-3. margin-trim

要素間だけに隙間を開けたい時ってどうしてる?

  • display: flex;gap: 10px;
    • 僕はただ 隙間を開けたい だけなのに...
  • margin-topnth-childで個別対応する?
    • なんか美しくないな...
  • margin-trim を使おう!

1-3. margin-trim

概要

  • コンテナーの端に接している子要素のマージンを切り取る
  • block を指定したら上下が、inline を指定したら左右が対象になる
    • もちろん書字方向による
これら子要素にはmargin-top:10px;が設定されていますが、
親要素にmargin-trim:block;が設定されているので
上下の端のmarginが切り取られています🤲

1-3. margin-trim

これもほぼ使えません

  • まだ Limited Availability
  • Safari のみで実装されているので、試せはするがサービスには投入しづらい 😭






2. 悪用しても面白いプロパティ3選

(おことわり)アクセシビリティなどを完全に無視しています 🙏 ごめんなさい 😭

2-1. hyphenate-character

ハイフネーションって知ってる?

  • (行末の)英単語(など)を(ハイフンなどの)記号で区切る現象の事だよ
    • This is hyphen-
      ation
  • 「ここは語の区切りじゃないよ!」という事を明示的に伝えてあげる必要がある
  • このハイフンを好きな文字に変えられるのが hyphenate-character

2-1. hyphenate-character

「このプロパティいつ使うん?」と思いきや...?

  • 世界にはハイフン以外でハイフネーションする言語がある
  • W3C の TR には(カナディアン・シラビックス・ハイフン, U+1400)を利用する例がある
    • カナダの先住民族が使用するクリー語などで利用される
  • 他にも調べてみるとアルメニア語の֊(アルメニア・ハイフン, U+058A)というものも

2-1. hyphenate-character

悪用してみる: 謎解き作れるんじゃね?

  • "password"を値としてセットすると一定幅になった時にだけ文字が現れる!

2-2. text-emphasis-style

圏点、傍点、脇点...?

2-2. text-emphasis-style

圏点、傍点、脇点...?

  • 文字を強調するこれの事
  • 圏点って実は東アジア圏の言語以外には見られない
    • 確かに英語とかの表音文字だとギチギチになるなぁ...
    • 斜体とか太字にするのが一般的
  • 強調以外にも声調(声のトーン)を表すのにも使ったりする
  • text-emphasis-styleは、この圏点の種類を設定できる

2-2. text-emphasis-style

色々ある圏点

スタンダードな黒丸とか、

居酒屋で見たりするゴマとか、

他にも二重丸もある

2-2. text-emphasis-style

これを悪用して、めっちゃ強調してみよう!

2-2. text-emphasis-style

これを悪用して、めっちゃ強調してみよう!

ペンギンを出したり、

2-2. text-emphasis-style

これを悪用して、めっちゃ強調してみよう!

ペンギンを出したり、

𰻞𰻞 麺を出したり、

2-2. text-emphasis-style

これを悪用して、めっちゃ強調してみよう!

ペンギンを出したり、

𰻞𰻞 麺を出したり、

文字を出して友達や家族を怖がらせましょう 🐬

2-3. list-style-type

概要

  • リストのマーカーを変更する(ul の黒丸や、ol の数字の部分)
  • 大体マーカー消すための list-style:none;でしか使わないイメージ
  • 実はlist-style-type, -image, -position の一括指定プロパティ

2-3. list-style-type

多過ぎんだろ…

2-3. list-style-type

多過ぎんだろ…

  • 76種類!(mozilla拡張まで含めると92種類)

2-3. list-style-type

多過ぎんだろ…

  • 76種類!(mozilla拡張まで含めると92種類)
  • ギリシャ数字

2-3. list-style-type

多過ぎんだろ…

  • 76種類!(mozilla拡張まで含めると92種類)
  • ギリシャ数字
  • 漢数字

2-3. list-style-type

多過ぎんだろ…

  • 76種類!(mozilla拡張まで含めると92種類)
  • ギリシャ数字
  • 漢数字
  • いろは

2-3. list-style-type

多過ぎんだろ…

  • 76種類!(mozilla拡張まで含めると92種類)
  • ギリシャ数字
  • 漢数字
  • いろは
  • 十二支

2-3. list-style-type

多過ぎんだろ…

  • 76種類!(mozilla拡張まで含めると92種類)
  • ギリシャ数字
  • 漢数字
  • いろは
  • 十二支
  • ウルドゥー語

2-3. list-style-type

悪用:炭 ◯ 郎がフリーランスになった時のために LP を作ってあげよう!







3. これからの実装を大きく変え得るプロパティ5選

3-1. view-transition-name

概要

  • 異なる状態間をアニメーションで滑らかに遷移できる
    • Baseline 2025🎉
  • 正確には View Transition API で行われる遷移の紐付けを行うのがこのプロパティ
    • ただ、実装者はほぼこのプロパティだけで実現できるのでここで紹介

3-1. view-transition-name

概要

  • 異なる状態間をアニメーションで滑らかに遷移できる
    • Baseline 2025🎉
  • 正確には View Transition API で行われる遷移の紐付けを行うのがこのプロパティ
    • ただ、実装者はほぼこのプロパティだけで実現できるのでここで紹介
  • 実はみなさんもう既に見ています 🫵

(再掲)最初のクイズ



MDN に掲載されている CSS プロパティは
全部でいくつあるでしょう?

color, font-size, margin, display...

(再掲)最初のクイズ




正解: 532 個

(再掲)最初のクイズ




532 個読んできたよっていう話をします

(再掲)最初のクイズ




532 個読んできたよっていう話をします

↑ これのこと

3-1. view-transition-name

何がすごい?

  • 異なる DOM 間での状態遷移を行うことができるのがすごい!

3-1. view-transition-name

例:marp では別ページ=別 DOM なのにアニメーションができる!

3-1. view-transition-name

やり方:遷移の前後の要素に同じ名前を指定してあげるだけ

// before transition
正解: <span class='vt-sample'>532 個</span>!

//after transition
<span class='vt-sample'>532 個</span>読んできたよっていう話をします
.vt-sample {
  view-transition-name: kimidake-no-saikyo-name;
}

3-1. view-transition-name

なぜだなぜできる伊沢拓司

  • 遷移前後の状態をスナップショットとして取得する
    • :view-transition-old:view-transition-newという2つの擬似要素
  • 前後のスナップショットを比較して、差分を埋めるように描画される
  • あたかも同じ DOM でアニメーションが行われているかの様に見える

3-1. view-transition-name

しかも

  • 異なる DOM 間どころか、異なる Web ページ間でもこの遷移を行える様に...!
  • MPA でも SPA やモバイルの様なシームレスな UX が実現可能になった 🤲
  • なので...
今までのページ
今までのページ
今までのページ
今までのページ
さっきのページ
続いてのページ

3-1. view-transition-name

MPA でこんな感じのページ遷移をやってみても楽しいかもしれません!

  • ぜひ試してみてください 🙌

3-2. counter

概要

  • その名の通り、CSS 内部にカウンターを持つことができる
  • 3種類で操作することができる
    • counter-reset: 初期化
    • counter-increment: 増減
    • counter-set: リセット(MDN には「set がリセットなんて直感に反しているわ!」と警告が書かれている)
  • UI 上に表示したい時は counter 関数で取り出して、content に指定する
content: counter(tekito-name);

3-2. counter

便利な時:複数の ol でネストした時

  1. 最近のフロントエンド系イベント(新しい順)
    1. フロントエンドカンファレンス
      1. 関西
      2. (省略)
    2. TSKaigi
      1. Hokuriku
      2. (省略)
    3. JSConf
<ol>
  <li>
    最近のフロントエンド系イベント(新しい順)
    <ol>
      <li>
        フロントエンドカンファレンス
        <ol>
          <li>関西</li>
          <li>(省略)</li>
        </ol>
      </li>
    </ol>
    ...
  </li>
</ol>
ol {
  /* 全ての階層で同じ名前のカウンターを初期化している...? */
  counter-reset: conference-counter;
  list-style: none;
  li {
    &:before {
      counter-increment: p;
      /* counter"s"...? */
      content: counters(conference-counter, "-") ". ";
    }
  }
}

3-2. counter

なぜ同じ名前のカウンターなのに別々の値を保持できる?

  • counter-reset の際に、親要素に同じ名前があると入れ子のカウンターになる
conference-counter{
  1
  conference-counter{
    2
    ...
  }
}
  • counters関数で同名のカウンターを全て取得し、結合すると階層が表現できる 🤲

3-2. counter

ちなみに...

  • 今回のスライドのセクション番号ですが、実は...

3-2. counter

ちなみに...

  • 今回のスライドのセクション番号ですが、実は...
  • counter を使用していません!
    • foreignObject に阻まれて counter を共有できませんでした...

3-3. offset-path

概要

  • svgpath で描いた線に沿ってアニメーションを動かすことができる
  • 今までは複雑な形に動かそうとすると transform とかでガチャガチャする必要があった
  • これからはパスを書いて、offset-distance0~100%までアニメーションするだけ!
/* パスを指定して */
offset-path: path("M ...);

/* offset-distanceを0~100% */
0% {offset-distance: 0%;} 100% {offset-distance: 100%;}

3-3. offset-path

実例&これなーんだ

3-3. offset-path

正解 is ...

3-3. offset-path

地味すごポイント

  • 矢印の向きが進む方向に沿っている...!?
  • offset-rotate で要素の向きを制御できる
  • auto だと進む方向だけど、90degreverse なども指定できるよ

3-4. animation-timeline

概要

  • アニメーションの進行方法を制御することができる
    • Limited Availability だけど、FireFox 以外ではもう使えます 🎉
  • 簡単にスクロール駆動アニメーションができて便利

3-4. animation-timeline

サンプル ①:自分自身の横スクロール値に合わせて回転する

  • 通常の animationanimation-timeline: scroll(x);を足しただけ
  • 自分自身を参照しているシンプルなパターン

3-4. animation-timeline

サンプル ②:テキストのスクロール値に合わせてプログレスバーが伸びる

  • scroll-timeline と組み合わせると他要素のスクロール値を参照できる
  • バー自体はスクロールしてないのにアニメーションしている...!

3-4. animation-timeline

サンプル ③:テキストのビューポート位置に合わせてプログレスバーが伸びる

  • view-timeline と組み合わせると他要素のビューポート位置を参照できる
  • 参照している要素が表示された瞬間にアニメーションが始まる

3-5. scroll-target-group

概要

  • スクロールスパイを作ることができるプロパティ
    • 今表示されてる場所がハイライトされる目次的なアレ
  • コンテナ内の href を持つ <a/>は自動的にスクロールマーカーとして設定される
  • 現在表示されている要素と紐付く<a/>には:target-current クラスが適用される

3-5. scroll-target-group

サンプル:スクロールに合わせて目次のスタイルが切り替わる

3-5. scroll-target-group

必要なコード

<ol>
  <li><a href="#no1">第1位</a></li>
</ol>
<section id="no1" />
ol {
  /* ol内がscroll-marker-groupになってフラグメント付きの<a/>が検出される */
  scroll-target-group: auto;
}
:target-current {
  /* ハイライトされてる時のスタイルを書く */
}

まとめ

  • MDN の CSS プロパティ リファレンスを全部読みました
  • その中から 11 個のプロパティを紹介しました

まとめ

紹介したもの: ① いつもの実装をちょっと楽にするプロパティ3選

  • place-items: 2行で上下中央揃え
  • line-clamp: 文字列の省略
  • margin-trim: 端の margin を切り取り

まとめ

紹介したもの: ② 悪用しても面白いプロパティ3選

  • hyphenate-character: ハイフネーションの文字列を設定
  • text-emphasis-style: 文字を強調する圏点を設定
  • list-style-type: リストのマーカーを設定

まとめ

紹介したもの: ③ これからの実装を大きく変え得るプロパティ5選

  • view-transition-name: 異なる DOM 間のアニメーションを制御
  • counter: 内部にカウンターを保持
  • offset-path: path を使ってアニメーションを制御
  • animation-timeline: スクロールでタイムラインを制御
  • scroll-target-group: スクロールスパイの紐付けを制御

おわりに:ドキュメントを通読する意義

おわりに:ドキュメントを通読する意義

全部読む意味ある?効率悪くね?

  • 正直コスパは最悪。
    • 1 ページ 平均 5-10 分くらいはかかるので合計 50 時間くらいは使ってそう
  • 今すぐ実務に直接活きる知識がめちゃくちゃ身に付く訳でもないし、
    読んだ後に CSS マスターになれる訳でもない
    • それはそう。国語辞書を全部読んでも現代文の成績が上がるわけではない!

おわりに:ドキュメントを通読する意義

じゃあ意味は無い?

おわりに:ドキュメントを通読する意義

じゃあ意味は無い?

そんなことは
決してない

おわりに:ドキュメントを通読する意義

それはなぜか?

  • 網羅的な知識が、より良い意思決定の地盤になると感じたから

おわりに:ドキュメントを通読する意義

私、こんなことが良くあります

  • レビューで「なんで A じゃなくて B にしたんですか?」と聞かれるがそもそも知らない
  • 実装している時に「これが本当に最適な選択肢なのか?」と確信が持てない

       → 実装の精度、速度が上がらない

おわりに:ドキュメントを通読する意義

でも、もしその分野の網羅的な知識があれば...

  • 比較となる選択肢を知らないということが無くなる
  • 自分の頭の中に最適な選択肢があると確信が持てる

       → 実装の精度、速度が上がる(=エンジニアリングの基礎力?)

おわりに:ドキュメントを通読する意義

思い出した本:「センスは知識からはじまる」

  • 以前 EM に薦められて読んでみた
  • ざっくりとした要約 ↓
    • 網羅的な知識を付けて、何が一般的なのかを知り、
      それとの相対化を行うことでセンスが磨かれていく
  • 自分は今までセンスの元となる網羅的なインプットをサボっていたんだと反省

おわりに:ドキュメントを通読する意義

もしかしたら今の時代に必要なのは一見コスパが悪く見えるインプットかもしれない

  • AI の進化は目覚ましく、技術の変遷はどんどん速くなっている様に感じる
  • それに伴ってどうしてもコスパの良い、効率の良いインプットに目が向きがちになる
  • そんな時代だからこそ、たまに基礎的な部分に立ち返る事も必要かもしれないと感じた






みんなもドキュメント通読しよう!

X (もちろん対面でも)で感想頂けると嬉しいです!

  • notion もぜひ見てください(ついでに拡散も♡)

--- ## 1-2. content-visibility <img class='content-visibility-image' src="./images/newly-available.svg"> ### 「めちゃくちゃ長いページが全然表示できない 😖 」ってことありませんか? - 大量にレンダリングするものがあると中々表示できない - ただ**初期レンダリングでは画面内のものだけ表示しておけば良い** - `content-visibility` を使えば解決できます! --- ## 1-2. content-visibility <img class='content-visibility-image' src="./images/newly-available.svg"> ### 概要 - **要素が描画されるかどうか**を設定します - Baseline 2024🎉 - 初期値 `visible` では通常通り描画、`hidden`では完全に読み飛ばされる - `auto` を指定すると**ビューポートに入るまで\*描画されない** - \* 正確には「ユーザーに関連するかどうか(ページ内検索でのヒット、フォーカスなども含む)」 - DOM には存在するのでページ内検索やタブ移動は可能 --- ## 1-2. content-visibility <img class='content-visibility-image' src="./images/newly-available.svg"> ### 疑問:ビューポート内に入って**描画される度にページ全体の高さが変わる** ...? - 高さ 100px の要素が描画 → ページ全体も 100px 高くなる → めっちゃガタつく? - `contain-intrinsic-size` を使えば大丈夫 🙆‍♂️ - サイズ拘束されている要素の高さを設定できるのでガタつきを抑えられる - 描画されるまでは 300px とかで表示しておいて、描画されたら実際の高さが反映される - めちゃくちゃ高さに幅がある要素だとあまり意味がないかも&設定がめんどくさい - 2 つのプロパティを活用して初期描画を爆速にしよう 🤲

<div style="text-align: center; margin-bottom: 20px;"> <h1>画面の中からパスワードを見つけ出せ!</h1> </div> <div class="hyphenate-target"> pneumonoultramicrosco&shy;picsilicovolcanoconiosis(珪性肺塵症) </div> /* CSSカスタムプロパティで隠しメッセージを定義 */ :root { --hidden-message: ' - [秘密のメッセージ] - '; } .hyphenate-target { /* フォントサイズを大きくし、改行が起きやすくする */ font-size: 30px; line-height: 1.2; padding: 20px; border: 2px solid #333; /* ハイフネーションを有効化(必須) */ hyphens: auto; -webkit-hyphens: auto; -ms-hyphens: auto; /* 悪用の核: ハイフネーション文字に長い文字列を設定 */ /* 注: ブラウザの対応状況によって動作しない可能性があります */ hyphenate-character: '"password"'; /* 初期状態の幅。広すぎるとハイフネーションが起きない */ width: 80%; margin: 20px auto; text-align: center; overflow-wrap: break-word; /* 単語の途中で改行させるための保険 */ } /* 画面幅が600px以下になったら、要素の幅を狭くしてハイフネーションを強制 */ @media (max-width: 600px) { .hyphenate-target { /* 意図的に狭い幅を設定 */ width: 320px; } }

<header> <h1>竈門炭治郎が使える技です!</h1> </header> <main> <section class="techniques"> <ul class="waza-list"> <li> 水面斬り (みなもぎり)</li> <li> 水車 (みずぐるま)</li> <li> 流流舞い (りゅうりゅうまい)</li> <li> 打ち潮 (うちしお)</li> <li> 干天の慈雨 (かんてんのじう)</li> <li> ねじれ渦 (ねじれうず)</li> <li> 雫波紋突き (しずくはもんづき)</li> <li> 滝壺 (たきつぼ)</li> <li> 水流飛沫・乱 (すいりゅうしぶき・らん)</li> <li> 生生流転 (せいせいるてん)</li> </ul> </section> </main> /* Google Fonts - ヘッダーに特徴的なフォントを使用 */ @import url('https://fonts.googleapis.com/css2?family=Train+One&display=swap'); :root { /* 市松模様の色定義 */ --ichimatsu-color1: #000000; /* 黒 */ --ichimatsu-color2: #38761d; /* 緑 */ --ichimatsu-size: 50px; } body { font-family: 'Arial', sans-serif; margin: 0; padding: 0; color: white; /* 全体の文字色を白に */ line-height: 1.6; /* ★ 修正箇所:縦横の市松模様の背景設定 (より確実な方法) */ background-color: var(--ichimatsu-color2); background-image: linear-gradient(45deg, var(--ichimatsu-color1) 25%, transparent 25%), linear-gradient(-45deg, var(--ichimatsu-color1) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, var(--ichimatsu-color1) 75%), linear-gradient(-45deg, transparent 75%, var(--ichimatsu-color1) 75%); background-size: var(--ichimatsu-size) var(--ichimatsu-size); /* ↑ 前々回のコードを再利用し、代わりに以下のように記述します */ /* より確実な縦横市松模様の作り方:1つのグラデーションで実現 */ background-image: repeating-linear-gradient( 45deg, var(--ichimatsu-color1) 0, var(--ichimatsu-color1) 25%, var(--ichimatsu-color2) 0, var(--ichimatsu-color2) 50% ); /* 縦横の市松模様にするための調整 */ background-size: var(--ichimatsu-size) var(--ichimatsu-size); /* ★ 縦横の市松模様にするための決定版 */ background-color: var(--ichimatsu-color2); /* 緑をベースカラーに */ background-image: repeating-linear-gradient(0deg, #000 0%, #000 50%, transparent 50%, transparent 100%), repeating-linear-gradient(90deg, #000 0%, #000 50%, transparent 50%, transparent 100%); background-size: 100px 100px; /* 100px (50px+50px) の正方形を繰り返し */ background-size: calc(var(--ichimatsu-size) * 2) calc(var(--ichimatsu-size) * 2); /* ★ こちらが最も意図に近いシンプルな縦横市松の記述です ★ */ background-color: var(--ichimatsu-color2); background-image: linear-gradient(45deg, var(--ichimatsu-color1) 25%, transparent 25%, transparent 75%, var(--ichimatsu-color1) 75%), linear-gradient(45deg, var(--ichimatsu-color1) 25%, transparent 25%, transparent 75%, var(--ichimatsu-color1) 75%); background-size: var(--ichimatsu-size) var(--ichimatsu-size); background-position: 0 0, calc(var(--ichimatsu-size) / 2) calc(var(--ichimatsu-size) / 2); /* ↑ 前々回と同じく斜めになりますが、正方形のパターンを配置しています */ /* ★ 最終的にこの方法がシンプルで確実です! ★ */ background-color: var(--ichimatsu-color2); background-image: linear-gradient(45deg, var(--ichimatsu-color1) 25%, transparent 25%), linear-gradient(-45deg, var(--ichimatsu-color1) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, var(--ichimatsu-color1) 75%), linear-gradient(-45deg, transparent 75%, var(--ichimatsu-color1) 75%); background-size: var(--ichimatsu-size) var(--ichimatsu-size); /* ここまでが斜め市松模様のコードです。*/ /* --- 縦横の市松模様に修正する最終コード --- */ background-color: var(--ichimatsu-color2); /* 緑色 */ background-image: linear-gradient(45deg, var(--ichimatsu-color1) 25%, transparent 25%, transparent 75%, var(--ichimatsu-color1) 75%), linear-gradient(45deg, var(--ichimatsu-color1) 25%, transparent 25%, transparent 75%, var(--ichimatsu-color1) 75%); background-size: calc(var(--ichimatsu-size) * 2) calc(var(--ichimatsu-size) * 2); background-position: 0 0, var(--ichimatsu-size) var(--ichimatsu-size); /* ------------------------------------- */ } /* その他のスタイルは変更ありません */ header { background-color: rgba(0, 0, 0, 0.8); padding: 20px 0; text-align: center; border-bottom: 5px solid #4CAF50; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.5); } header h1 { font-size: 3em; margin: 0; color: white; letter-spacing: 5px; } main { max-width: 800px; margin: 10px auto; padding: 20px; background-color: rgba(0, 0, 0, 0.7); border-radius: 10px; box-shadow: 0 0 20px rgba(0, 0, 0, 0.9); } .techniques h2 { text-align: center; color: #00BFFF; font-size: 2em; border-bottom: 3px dashed #00BFFF; padding-bottom: 10px; margin-bottom: 10px; } .waza-list { list-style-type:japanese-formal; list-style-position: inside; padding: 0; } .waza-list li { padding: 6px 15px; margin-bottom: 0px; font-size: 1.8em; font-weight: bold; } .waza-list li:hover { background-color: rgba(60, 179, 113, 0.4); } .waza-list li strong { color: #FFD700; font-weight: bold; } footer { text-align: center; padding: 10px 0; margin-top: 30px; background-color: rgba(0, 0, 0, 0.8); color: #aaa; border-top: 1px solid #333; }

<div class="container"> <svg class="bg-text" viewBox="0 0 500 200"> <path d="M90,55 C90,30 75,20 55,20 C30,20 15,45 15,75 C15,105 30,130 55,130 C75,130 90,120 90,95 L70,95 C70,105 65,110 55,110 C45,110 35,95 35,75 C35,55 45,40 55,40 C65,40 70,45 70,55 Z" /> <path d="M120,45 C120,30 135,20 155,20 C175,20 190,30 190,45 L170,45 C170,40 165,35 155,35 C145,35 140,40 140,50 C140,65 190,65 190,95 C190,115 175,130 155,130 C130,130 120,115 120,100 L140,100 C140,110 145,115 155,115 C165,115 170,105 170,95 C170,80 120,80 120,50 Z" /> <path d="M210,45 C210,30 225,20 245,20 C265,20 280,30 280,45 L260,45 C260,40 255,35 245,35 C235,35 230,40 230,50 C230,65 280,65 280,95 C280,115 265,130 245,130 C220,130 210,115 210,100 L230,100 C230,110 235,115 245,115 C255,115 260,105 260,95 C260,80 210,80 210,50 Z" /> </svg> <div class="arrow arrow-c"></div> <div class="arrow arrow-s1"></div> <div class="arrow arrow-s2"></div> </div> <button onClick="changeColor()">ぼたぼたボタン</button> .container { position: relative; width: 500px; height: 200px; margin: 0 auto; border: 1px solid #333; display: flex; justify-content: center; } .bg-text { width: 100%; height: 100%; display: block; } .bg-text path { /* fill: #2c3e50; /* 文字の色 */ fill: #333; } /* 矢印の共通設定 */ .arrow { position: absolute; top: 0; left: 0; width: 30px; height: 20px; background: #e74c3c; /* 矢印の色 */ clip-path: polygon( 0% 20%, 60% 20%, 60% 0%, 100% 50%, 60% 100%, 60% 80%, 0% 80% ); offset-rotate: auto; offset-anchor: center; /* 並列用アニメーション設定:すべての矢印が同時にこのアニメーションを実行 */ animation: run-parallel 5s linear infinite; } /* 個別のパス設定(delayは削除しました) */ /* 1文字目: C */ .arrow-c { offset-path: path( "M90,55 C90,30 75,20 55,20 C30,20 15,45 15,75 C15,105 30,130 55,130 C75,130 90,120 90,95 L70,95 C70,105 65,110 55,110 C45,110 35,95 35,75 C35,55 45,40 55,40 C65,40 70,45 70,55 Z" ); } /* 2文字目: S */ .arrow-s1 { offset-path: path( "M120,45 C120,30 135,20 155,20 C175,20 190,30 190,45 L170,45 C170,40 165,35 155,35 C145,35 140,40 140,50 C140,65 190,65 190,95 C190,115 175,130 155,130 C130,130 120,115 120,100 L140,100 C140,110 145,115 155,115 C165,115 170,105 170,95 C170,80 120,80 120,50 Z" ); } /* 3文字目: S */ .arrow-s2 { offset-path: path( "M210,45 C210,30 225,20 245,20 C265,20 280,30 280,45 L260,45 C260,40 255,35 245,35 C235,35 230,40 230,50 C230,65 280,65 280,95 C280,115 265,130 245,130 C220,130 210,115 210,100 L230,100 C230,110 235,115 245,115 C255,115 260,105 260,95 C260,80 210,80 210,50 Z" ); } /* シンプルな並列動作用キーフレーム */ @keyframes run-parallel { 0% { offset-distance: 0%; } 100% { offset-distance: 100%; } } .white{ fill:white !important } function changeColor() { const bgText = document.getElementsByClassName("bg-text")[0].children; console.log(bgText.length); for(const x of bgText){ console.log(x) x.classList.add("white") } }

<div id="container"> <div id="bar"></div> <div id="deka">全く関係のない場所 </div> <div id="stretcher"><div id="text">途中からスクローーーーーーーーーーーーーーーーール</div></div> <div id="deka">全く関係のない場所 </div> </div> #container { height: 300px; overflow-y: scroll; scroll-timeline: --squareTimeline y; /* Firefox supports the older "vertical" syntax */ /* scroll-timeline: --squareTimeline vertical; */ position: relative; scrollbar-gutter: auto; timeline-scope: --tekitoAnimation; } #text{ font-size: 5rem; writing-mode: vertical-lr; margin: 0 auto; view-timeline-name: --tekitoAnimation; } #bar{ position: fixed; top: 0; left: 0; width: 0; height: 20px; background-color: red; animation-name:progressBar; animation-timeline: --tekitoAnimation; animation-fill-mode: both; } #deka { width:auto; height:730px; background-color: white; font-size: 5rem; writing-mode: vertical-lr; margin: 0 auto; } #stretcher { height: 2000px; background: #dedede; } @keyframes progressBar { from { width:0px; } to { width:100%; } }