Web Component制作におけるcontentタグの使い方について勉強しました。
以下は、Polymerを用いて作成したhoge-hoge
エレメントのソースコード「hoge-hoge.html」と、それを呼び出しているコード「index.html」です。
/* hoge-hoge.html */ <link rel="import" href="bower_components/polymer/polymer.html"> <polymer-element name="hoge-hoge"> <template> <p>おはようございます!</p> </template> <script> Polymer("hoge-hoge", {}); </script> </polymer-element>
/* index.html */ <script src="bower_components/platform/platform.js"></script> <link rel="import" href="hoge-hoge.html"> <body unresolved> <hoge-hoge> <div class="red">赤</div> <div class="yellow">黃</div> <div class="green">緑</div> </hoge-hoge> </body>
ここで、「index.html」を開いたとき、ブラウザには何が表示されるでしょうか?
このときポイントになるのは、これまでに記事で扱ってきた他のコンポーネントと同様に、「hoge-hoge.html」のtemplate
タグの中身("<p>おはようございます!</p>")が、「index.html」のhoge-hoge
タグの中身として反映されるということです。
もし仮に「index.html」のhoge-hoge
タグの中身が空っぽであれば、そのまま「"<p>おはようございます!</p>"」が挿入される感じで納得できると思います。しかし、今回の場合、既にhoge-hoge
タグの中には3つの <div> 要素が存在しています。
最初の問題の正解はこちらです。以下のようにブラウザに文字列が表示されます:
おはようございます!
つまり、hoge-hoge
タグの中には、「index.html」のtemplate
タグの中身である"<p>おはようございます!</p>"」が挿入され、既存の3つの <div> は表面上は無視されたという結果になります。
それでは、hoge-hoge
タグ内にもとからあった3つの <div> を表示させるにはどうしたら良いのでしょうか?
contentタグを使えばよい
「hoge-hoge.html」のtemplate
タグ内で <content> を使って <div> をインポートすることで表示させることができます。<content> にはselect
属性があり、ここで指定したid
やclass
を持つ要素がテンプレート内にインポートされます。例えば以下のようにtemplate
タグを書き換えてあげれば、3つの <div> をすべて表示させることができます。
<template> <p>おはようございます!</p> <content select=".red"></content> <content select=".yellow"></content> <content select=".green"></content> </template>
また以下のように、<content> で明示しない限り非表示であるということを利用して、3つの<div> 要素のうち、特定の1つだけを表示させることも可能なのです。
<template> <p>信号の色が</p> <content select=".red"></content> <p>になりました。</p> </template>
<content> のselect
の値を変更することで、表示内容を動的に変化させるデモ「content tag demo」もつくってみました。ソースコードと見比べながらお試しください。