WebComponentsでデバイスピクセル比を表示するカスタム要素を作った
Chrome 36でWeb ComponentsのHTML Importsが使えるようになり、Web Componentsのすべての要素が普通に使えるようになりました。そこで、Web Componentsのすべての要素(HTML Imports、Template、Shadow DOM、Cuntom Elements)を使ってデバイスピクセル比を表示するサンプルを作ってみました。
まず、コンポーネントの方です。
<template> <style> p { font-size: 3em; } </style> <div> <p>デバイスピクセル比: <span id="devicePixelRatio"></span></p> </div> </template> <script> var ScreenInfoProto = Object.create(HTMLElement.prototype); var ownerDoc = document.currentScript.ownerDocument; var dpr = window.devicePixelRatio; ScreenInfoProto.createdCallback = function() { var shadow = this.createShadowRoot(); var template = ownerDoc.querySelector('template'); template.content.querySelector('#devicePixelRatio').textContent = dpr shadow.appendChild(template.content); }; var ScreenInfo = document.registerElement('screen-info', { prototype: ScreenInfoProto }); </script>
コンポーネントを使う側です。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <title>デバイスピクセル比</title> <link rel="import" href="dpr.html"> </head> <body> <p>p要素</p> <screen-info></screen-info> </body> </html>
使う側は、importするのと<screen-info>タグを書くだけです!
<p>タグは、コンポーネント中のスタイルがカプセル化されていることの確認のためにおいています。コンポーネントの中でp要素の文字サイズを大きくするスタイルを記述していますが、コンポーネントにカプセル化されているため、importする側のスタイルには変更がありません。
Web Componentsは以下のドキュメントが参考になります。(実際これしか読んでいません)
- Shadow DOM
http://www.html5rocks.com/ja/tutorials/webcomponents/shadowdom/
http://www.html5rocks.com/ja/tutorials/webcomponents/shadowdom-201/
http://www.html5rocks.com/ja/tutorials/webcomponents/shadowdom-301/
- Template
http://www.html5rocks.com/ja/tutorials/webcomponents/template/
- imports
http://www.html5rocks.com/ja/tutorials/webcomponents/imports/
- Custom Elements
http://www.html5rocks.com/ja/tutorials/webcomponents/customelements/
2014年7月24日追記
上記のソースと、ドキュメントに記載されていたサンプルを合わせて、GitHubにおいてあります。