[dev: html5/css3/js] modern web note @2014. #html #css #js
オライリー「モダンWeb」のまとめ。
モバイル(スマートフォン等)のネイティブアプリケーションにも注目が集まっているが、ネイティブなアプリを窓口に、Web上のサービスとの連携が前提になっているため、現在のアプリケーション開発はまだまだWebアプリケーション全盛と言ってよい。
「フロントエンド開発」という範疇を超えて、HTML5はもはや【プラットフォーム】という新しいコンテキストを獲得している。HTML5/CSS3/JS(ES6) の習得はインタラクティブなWebフロントエンド開発だけでなく、Webアプリケーション開発者の必修科目と言ってよい時代に突入した。
<p id="foo" data-id="123">yamada</p> //idデータ123の山田さん
document.querySelector('p#foo').dataset['id']
でとれる<section itemscope="itemscope" itemtype="http://schema.org/Person">
<a href="~" aria-haspopup="true">popup!</a>
<input type="checkbox" checked>
<input type="checkbox"> ↓と同義
<input type="checkbox" checked="false">
<!DOCTYPE html>
<html lang="ja>
<head>
<meta charset="utf-8">
<title></title>
<link href="foo.css" type="stylesheet">
<script src="foo.js" defer></script>
<!-- type指定は省略可能に -->
</head>
<body>
<header>
<h1></h1>
<nav></nav>
<section>
<div role="search"></div>
</section>
</header>
<main>
<article>
<h2></h2>
</article>
<aside></aside>
</main>
<footer</footer>
</body>
</html>
<!-- 本/著者のリスト -->
<section itemscope itemtype="http://schema.org/Book">
<h1>本の情報</h1>
<span itemprop="name">Ruby入門</span>
<p itemprop="description">本の説明</p>
<div itemprop="author" itemscope itemtype="http://schema.org/Person">
<p itemprop="name">著者名</p>
<p itemprop="email">author@abc.efg</p>
</div>
</section>
<!--ホーム>パソコン>Macノートのパンくずリスト-->
<ol itemscope itemtype="http://schema.org/BreadcrumbList">
<li itemprop="itemListElement" itemscope
itemtype="http://schema.org/ListItem">
<a itemprop="item" href="https://example.com/home">
<span itemprop="name">ホーム</span></a>
<meta itemprop="position" content="1" />
</li>
<li itemprop="itemListElement" itemscope
itemtype="http://schema.org/ListItem">
<a itemprop="item" href="https://example.com/home/pc">
<span itemprop="name">パソコン</span></a>
<meta itemprop="position" content="2" />
</li>
<li itemprop="itemListElement" itemscope
itemtype="http://schema.org/ListItem">
<a itemprop="item" href="https://example.com/home/pc/macnote">
<span itemprop="name">Macノート</span></a>
<meta itemprop="position" content="3" />
</li>
</ol>
<meta property="og:title" content="EXAMPLE.COM">
<meta property="og:url" content="http://example.com/">
<meta property="og:description" content="EXAMPLE.COMは~~"。>
<meta property="og:image" content="http://example.com/img/logo.png">
<meta property="og:type" content="website">
<!-- jQueryは1.x系じゃないとだめよ-->
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/><!--互換モード最新に-->
<!--[if lt IE 9]>
<script src="path/to/html5shiv.js"></script><!--html5タグ対応-->
<script src="path/to/respond.js"></script><!--メディアクエリ対応-->
<![endif]-->
</head>
HTML5のForm要素は、HTML5 の基準になった Web Applications1.0 の仕様を引き継ぎ多くの拡張がなされている。
<input type="email"></input>
など
form="form-id"
で連携可能にvar mq = window.matchMedia('screen and (min-width: 800px)');
if (mq.matches) { ... } else { ... }
document.getElementsByClassName('foo'); 何気にHTML5から
document.querySelector('.foo'); //classList利用なモダンな記述法
scriptタグでJSを呼ぶと、そのタイミングでブラウザがDOM解析・レンダリングをストップさせ、JS解析に移ってしまい低速回線では表示に時間がかかってしまう。そのためscriptタグはbody終了タグの直前に置くのが定石だった。HTML5ではscriptタグにdefer属性(真偽値)を記述すると「HTMLを読み終わってから読込→実行」してくれる。
<head>
<script src="foo.js" defer></script>
</head>
scriptタグにasync属性を記述すると、HTMLの読み込みを中断しないまま非同期でJSを読込するようになる(実行された場合は当然レンダリングは中断されちゃうがね)。
ローカル環境にサンドボックス化したファイルシステムを作成して操作できる。
dataTransfer.files
など
// 現在位置情報の取得
var geo = navigagtor.geolocation,
lcn_success = function(where) {...},
lcn_error = function() {...};
geo.getCurrentPosition(lcn_success, lcn_error);
// 3次元空間上でのデバイスの方向、位置変化を検出
window.addEventListener('deviceorientation', function(orientData) {
//doSomething
}
// フルスクリーン表示を要求
if (document.fullScreenEnabled) {
var el = document.querySelector('.target');
el.addEventListener('click', function() {
el.requestFullScreen();
});
}
デバイスの振動機能にアクセス
デバイスのバッテリー情報にアクセス
通信回線、ネットワーク接続情報へのアクセス
Cookieでは小さなデータしか保存できない。 より大きなデータのデバイス保存には、WebストレージAPIが便利。 ブラウザが閉じるとデータが消えるのが【セッションストレージ】。 ローカルにデータを保存できるのが【ローカルストレージ】。 ちなみにどちらも構文は同じらしい。 旧名称はDOM Storage。
// localStrage.gorilla = 'ゴリラ';
sessionStorage.gorilla = 'ゴリラ';
// sessionStorage.clear();
sessionStorage.removeItem('gorilla');
非同期でKeyValue形式でローカル(ブラウザ)にデータを保存し、インデックス機能やトランザクション機能も備えている。WebStorageとくらべてとっても大容量(ブラウザによるが50MBくらい)かつバイナリ保存も対応。性能優秀ぽい。 https://developer.mozilla.org/ja/docs/Web/API/IndexedDB_API
このIndexedDBを通常のRDBMSのように扱えるGoogle製のライブラリ「lovefield」ってのもある。http://qiita.com/ryo-ma/items/33386ec4b4c3b0261ce3
// ドラッグ&ドロップによる動作
var target = document.getElementById('target');
target.addEventListener('dragover', function(e) {
e.preventDefault(); //デフォルト動作の抑止
}, false);
target.addEventListener('drop', function(e) {
e.dataTransfer.setData('text/plain', e.currentTarget.textContent);
}, false)
実験段階の仕様、低コスト版HTTPプロトコル的な通信規格...ラッパーなのか?クライアントに情報を配信するための簡単なAPIと、クライアントからWebサーバへ情報を送信するための簡単なAPIを提供するらしい。 https://developer.mozilla.org/ja/docs/Web/API/WebSocket
音声関係は WebAudioAPI
や StreamAPI
で利用可能。
http://150217-html5sound.fnobi.com/
WebRTC
というUDPベースのリアルタイム双方向通信でチャットとかビデオチャットとかファイル通信できる的なAPIらしいがあんま流行ってない。 https://developer.mozilla.org/ja/docs/Web/API/WebRTC_API / https://html5experts.jp/mganeko/19728/
あとは FileAPI
で画像や映像なんかをこれから取る、みたいなカメラ起動アクションに対応できるぽい。http://cartman0.hatenablog.com/entry/2015/06/20/021402
HTML5技術でネイティブアプリケーションを作る(=ハイブリッドアプリ)ためのラッパーフレームワーク。Cordva, Electronなど。
ビットマップ描画API。SVGと違いオブジェクトではなく画面上のピクセルに対して直接描画する仕様らしい。
ベクター描画API。Canvasと違いオブジェクトとしてDOMツリーに組み込まれる。その分DOMツリーが重くなるが、JSなどでアクセスしやすくなる。
3D描画API。興味ないのであんま調べてないけど色々できるぽい。
<audio src="foo.oga" controls></audio>
<video src="bar.ogv" controls></video>
<audio src="foo.oga" preload="auto"></audio>
<video src="bar.ogv" autoplay muted></video>
<video src="bar.ogv" width="360" height="240"></video>
<video>
<source src="foo.ogv" type="video/ogg"></source>
<source src="foo.webm" type="video/webm"></source>
<source src="foo.mp4" type="video/mp4"></source>
</video>
<video>
<source src="foo.ogv" type="video/ogg"
media="(device-aspect-ratio: 16/9) and (min-devicewidth: 1920px)">
</source>
<source src="foo.webm" type="video/webm"></source>
</video>
mp4 は Microsoft と Apple が大好きな有償ライセンス ogg は Mozilla Opera が mp4 に対抗して開発 webm は Google が無償ライセンスで最近発表→普及しつつある
現在mp4が最も強い (IEやSafari含む多くが対応だがFireFox, Opera非対応) Chrome, FireFox, Android は ogg, webm 対応
W3Cによって標準化されている webVTTファイル
や TTMLファイル
による字幕・キャプションの埋め込みが可能になっている。https://goo.gl/37irmY
// video
<video src="foo.ogv">
<track kind="captions" label="English" src="captions_en.vtt" srclang="en"></track>
<track kind="captions" label="Japanese" src="captions_jp.vtt" srclang="ja" default></track>
</video>
// webVTT
1
00:00:05.000 --> 00:00:08.000
<v 太郎>はい、太郎です。</v>
2
00:00:08.000 --> 00:00:13.000 line:63% position:72% align:start
<v 花子>花子です。久しぶり。</v>
// TTML
<?xml version='1.0' encoding='UTF-8'?>
<tt xmlns='http://www.w3.org/ns/ttml' xml:lang='en' >
<body>
<div>
<p begin="00:00:01.567" end="00:00:03.987" >こんにちは。</p>
<p begin="00:00:10.098" end="00:00:13.214" >やあ。<br/>久しぶり!</p>
</div>
</body>
</tt>