Svelte Accessibility on 2025-10-24
https://gyazo.com/614817a6bfe60c1525fe86a85a4910f4
この資料は Svelte Japan Offline Meetup #5 のLT資料です。
https://gyazo.com/a6d28b60f6d8d7af63407708ad65cebf
メニューのドキュメントアイコンより「プレゼンテーションを開始」クリックでプレゼンテーションが始まります
自己紹介
yamanoku.icon @ yamanoku
大山奥人, おおやまみちのく a.k.a やまのく
X(旧Twitter)
GitHub
会社員
一児の父と猫🐈🐈🐈と犬🐶の飼い主
明日のVue Fes Japan 2025で喋ってきます
https://gyazo.com/fc104e5740b8583c80a6931600053618 https://vuefes.jp/2025/speaker/yamanoku
https://gyazo.com/a4bc4bfef5495844d5fe54b27a67afba
どうやら今日同じ時間帯で発表する人がこの会場にいるっぽいです
そんなことあるんだ
Svelteとyamanoku.icon
Svelteでデジタル時計コンポーネントを作る
2021年
Svelteでミニアプリを作ってみた
Svelteいいねyamanoku.icon
2025年、現在Rune APIで動くようにしてます
あなたの推しコンパイラは?私はSvelteです | yamanoku Advent Calendar 2023
2023年
コンパイラとしてSvelteが好きな話をしました
Svelte Japan Offline Meetup #2
2024年
Svelte Accessibility Warningsで登壇・発表させてもらいました
https://gyazo.com/89fb567058cfece9847d4fe2f9c23579
Svelte Japan Offline Meetup #5
2025年
NOW!
今日は2025-10-24時点でのSvelteとアクセシビリティの話をします
前回(2024-02-21)発表から差分があったところ
Compiler Warningの項目変化
https://svelte.jp/docs/svelte/compiler-warnings
Svelte Accessibility warnings 補足資料(2024-02-21)と比較
a11yルールは現時点で42個
前回発表時点で32個なので10個増加
新しく増えた項目
a11y_consider_explicit_label
ボタンとリンクにはテキストを含めるか、aria-label、aria-labelledby、またはtitle属性を設定する必要ルール
a11y_role_supports_aria_props_implicit
暗黙のroleがあるものに対してサポートされていないARIAを使用してはならない
ARIAの属性値を細かくチェックする
a11y_incorrect_aria_attribute_type_boolean
a11y_incorrect_aria_attribute_type_id
a11y_incorrect_aria_attribute_type_idlist
a11y_incorrect_aria_attribute_type_integer
a11y_incorrect_aria_attribute_type_token
a11y_incorrect_aria_attribute_type_tokenlist
a11y_incorrect_aria_attribute_type_tristate
a11y-structureが廃止
a11y_figcaption_indexとa11y_figcaption_parentに分離
https://gyazo.com/63f90eb0db47eae50ac1da939df1fc3b
前回の発表で突っ込んでたところ
ルール名がハイフンからアンダースコアに変わった
旧:a11y-check
新:a11y_check
useId相当のAPIが追加された
SSRでも使用できる一意のIDが使える機能
React.js、Vue.js、SolidJS、Preactには搭載されている
v5.20.0から同梱された
feat: $props.id(), a SSR-safe ID generation by adiguba · Pull Request #15185 · sveltejs/svelte
code:svelte.html
<script>
const uid = $props.id();
</script>
<form>
<label for="{uid}-firstname">First Name: </label>
<input id="{uid}-firstname" type="text" />
<label for="{uid}-lastname">Last Name: </label>
<input id="{uid}-lastname" type="text" />
</form>
用途
ラベルとフォームの紐づけ
aria-labelledbyの関連付け
CSS Anchor Positioningの紐づけなど
code:html
<button type="button" id="anchor">Anchor</button>
<div anchor="anchor">Tooltip</div>
一意のID付与、AIエージェントでは意図的にやってくれないのでAGENTs.mdなどに使うように指示しておきましょう
prefersReducedMotion
https://svelte.dev/docs/svelte/svelte-motion#prefersReducedMotion
svelte/motionの中にあるAPI
v5.7.0から同梱
svelte/reactivityのMediaQueryを使用
アニメーションを削除したり縮小するOS側の設定があった場合に適用される
prefers-reduced-motion: reduceがあればtrueを返す
sample
HTMLの自己完結型タグをSvelteでどう扱うかの話
Svelte parses HTML all wrong · Issue #11052 · sveltejs/svelte · GitHub
SvelteKitでのmetaやlinkといった空要素に終了タグが加わっている問題から派生して、Svelteでどう扱うかの議論への発展
Richは<div />こんにちはを<div></div>こんにちはになると思っていたが
実際は<div>こんにちは</div>と解釈されてしまうことに気づいた
HTMLのみの話、SVGやSvelteコンポーネントは関係なし
Svelte parses HTML all wrongについてまとめる
npx svelte-migrate self-closing-tagsでマイグレーションできるようにした
個人的によかったところ
Richが真に問題として上げていることは、人々が不完全なHTMLをSvelteに貼り付けて異なる動作を経験することよりも、逆のことを上げている。
つまり、有効なSvelteのスニペットをHTMLのコンテキストに持っていき、そこで壊れる経験をする人々のことを懸念している
今のままのSvelteを提供することは人々に壊れたコードを書いていくことにつながるので、非常に悪いことだと考えている
HTMLに真摯なRich Harrisが改めて好きになりましたyamanoku.icon
Thank you for listening !
https://gyazo.com/4c1d0df4903765cc351797c10f903ba1