section
article
nav
header
footer
time
aside
main
video
audio
canvas
data
etc...
いっぱい要素増えましたね。
これで全てがセマンティクスになって
マシンリーダブルで
アクセシブルで
サーチエンジンオプティマイズドに
ならない
(あたりまえ)
どうすれば...
! ... 新しい要素作ろう
つらい記憶
time
なくなってしまうん?hgroup
ェ...ブラウザの対応も早くなってきましたが、それでも大変
属性があるじゃないか
属性でHTMLを拡張してあれやこれやしよう
W3C内の
Web Accessibility Initiative
が策定した
Accessible Rich Internet Applications
に関する仕様です。
WAI-ARIA 1.0は2014年3月20日勧告、現在はWAI-ARIA1.1がWorking Draft
ウェブコンテンツやアプリケーションの
アクセシビリティを向上する目的で
role="menuitem"
aria-hidden="true"
aria-haspopup="true"
JavaScript
↓aria-*
,role
DOM
↓
アクセシビリティAPI
(アクセシビリティオブジェクトツリー)
↓
支援技術(スクリーンリーダーなど)
role
要素の役割を定義
<ul role="menu">
<li role="menuitem"><a href="#">環境設定</a></li>
<li role="menuitem"><a href="#">アカウント</a></li>
<li role="menuitem"><a href="#">ヘルプ</a></li>
</ul>
読み上げ例:メニュー3項目
aria-*
要素の状態や性質を表す
動的に実装することが多い
setAttribute
そしてsetAttribute
<button id="demo1-button">開くボタン</button>
<p id="demo1-content">そして<code>setAttribute</code></p>
var button = d.getElementById('demo1-button'),
content = d.getElementById('demo1-content');
// 初期化
content.setAttribute('aria-hidden', true);
button.setAttribute('aria-controls', 'demo1-content');
button.setAttribute('aria-expanded', false);
// クリック時
button.addEventListener('click', function(){
content.setAttribute('aria-hidden', false);
this.setAttribute('aria-expanded', true);
});
#demo1-content[aria-hidden="true"] { display: none; }
<div role="button">ボタン</div>
↓
<button type="button">ボタン</button>
既存のHTMLを変更する場合はCSSなどの変更点が多く難しいことがあります。
その時はrole
をつけるだけでも意味があります。
<h2 role="button">Q.見出しを押すと本文が開きますか</h2>
<p>A.本文だよ。見出しを押すと本文は開くよ。</p>
見出しのセマンティクスが上書きされてしまう
↓
<h2><button>Q.見出しを押すと本文が開きますか</button></h2>
<p>A.本文だよ。見出しを押すと本文は開くよ。</p>
HTML5.1から参照しているARIA in HTML(WD)では…
<header role="banner"> ~~ </header>
<main role="main"> ~~ </main>
<footer role="contentinfo"> ~~ </footer>
↓
<header> ~~ </header>
<main> ~~ </main>
<footer> ~~ </footer>
ただし、ARIA in HTMLは、HTML5.1が参照する
Working Draft で少し先の話。
ブラウザによっては、まだmain
がrole="main"
を持ってないケースもあるので、対象ブラウザ次第。
メタ情報なので視覚的にデバッグするのツラい
聴覚(スクリーンリーダー)も慣れてないとツラい
状態と見た目が統一され、デバッグもしやすくなる
[aria-hidden="true"] { display: none; }
.button,
[role="button"] {
~~~~
}
※HTMLとCSSが密結合
※コンポーネント状態がaria-*
で表せる場合に限られる
要件にあればもちろん対象のもので
MacはVoiceOver、WindowsはNVDAが始めやすい
itemscope
でアイテムを作り、itemtype
で語彙を定義し、itemprop
を付与してプロパティを追加していく<div itemscope="itemscope" itemtype="http://schema.org/Person">
<p>私の名前は<span itemprop="name">桝田 草一</span>です。</p>
</div>
↓
schema.orgのPerson語彙を使ってPerson型のitemを作る。
nameプロパティの値は"桝田 草一"
要素内のtextContent
がプロパティの値
<p><span itemprop="name"><a href="/?user=daniel" target="_blank">Daniel</a></span>.</p>
↓
"name": "Daniel"
a
の場合は、href
が、
img
の場合はsrc
が値となる。
<img itemprop="image" src="http://other.site/img/photo.jpg" alt="写真" />
↓
"image": "http://other.site/img/photo.jpg"
data
, meter
はvalue
が
time
ならdatetime
が値となる。
<time itemprop="birthday" datetime="1985-02-07">1985年02月07日</time>
↓
"birthday": "1985-02-07"
なんかいいことあるの?
マシンリーダブル
↓
検索エンジンリーダブルなメタデータ
CTRを向上したり
最近話題のアレ(AMP)にも必要
発表後追記:AMPで必要なのはMicrodataじゃなくてschema.orgをJSON-LDでした。すみません、すみません。
Microdata DOM
APIを使って
ページ内の構造化データを処理
var events = document.getItems('https://schema.org/Event');
参照する仕様を間違えずに目的に合わせて実装する
opeingHours
LocalBusiness
やRestaurant
の営業時間
ざっくり訳すと
営業時間は1週間の範囲の中から指定することができます。営業日は曜日を表す2文字の組み合わせ(Mo, Tu, We, Th, Fr, Sa, Su)をカンマ区切りで指定し、時間は24時間表記で開始時間-終了時間の形式で指定します。
<time itemprop="openingHours" datetime="Tu,Th 16:00-20:00">Tuesdays and Thursdays 4-8pm</time>
time
的にはinvaliddatetime
は一意の時間の指定のみで、曜日の繰り返しは表現できない
data
で<data itemprop="opneningHours" value="Mo-Fr 09:00-19:00">
Monday-Friday: 9:00 am to 7:00 pm</data>
meta
毎日元気に営業中!!!!!!!!!!
<meta itemprop="openingHours" content="Mo-Su" />
<script id="jsonld" type="application/ld+json">
[
{
"@context": "http://schema.org",
"@type": "BlogPosting",
"name": "シンタックスハイライトをgoogle code prettifyからhighlight.jsに変えた",
"url": "http://masup.net/2015/03/change-syntax-highlighter.html",
"datePublished": "2015-03-19T00:37:31+09:00"
}
]
</script>
Microdataの安心
基本的にメタ情報とコンテンツが同一
Microdataの苦労
HTMLの可読性が落ちる。
BEM + angular + Microdataなんて日には
CMSから書き出し前提ならJSON-LDの方が◎
語彙の構造とCMSのデータ構造を同一にすると組みやすい。