コンピュータクワガタ

かっぱのかっぱによるコンピュータ関連のサイトです

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においてあります。

https://github.com/kuwalab/WebComponentsSample