いよいよ、初めてのカスタムエレメント作りに挑戦します。
前回開発の準備をした<my-signboard>
タグを作製する過程を紹介します。<my-signboard>
タグは観光地などでよく見る以下のような案内看板の(かなりシンプルな)イラストを提供します。
上高地で撮った上記写真を見ると、案内看板には、
- 場所の名前(日本語)
- 場所の名前(英語)
- 距離
- 建造物区分
が記されていることがわかります。これまでのウェブページ作成方法では、これらの情報は<div>
タグの中にその他のタグをネストさせながら、内部に直接記述していたと思います:
<style> ... </style> <div id="signboard"> <center> <div id="top">河童橋 1.1km</div> <div id="bottom">Kappa-bashi Bridge</div> </center> </div>
この記述方法には、ざっと以下のような問題点が考えられます。
id
を見ないと<div>
が何を表しているのかわからない。- "signboard"という
id
は同じHTMLファイル中で二度と使えない。 - 実際に表示される4つの情報以外に興味はないのに、
<div id="top">
や<div id="bottom">
などの内部構造を知らなくてはいけない。個人的には結構苦痛^^; - 「河童橋」の情報を「大正池」のものに変更する際に、間違えて変なところを変更してしまい、レイアウトがメチャクチャになるかもしれない。
そこで、Web Componentsの出番です!
これからつくる案内看板コンポーネント<my-signboard>
を使えば、前述した<div id="signboard">...</div>
は以下のように書くことができます。
<my-signboard ja="河童橋" en="Kappa-bashi" km=1.1 classname="Bridge"> </my-signboard>
先ほどはタグの内部に直接記述していた4つの案内情報を、ここではそれぞれタグの属性(attribute)として記述することができます。そしてタグの内部はカラッポっでOKなのです。タグの属性は以下の情報を保持しています。(念のため紹介します。)
ja
:場所の名前(日本語)en
:場所の名前(英語)km
:距離classname
:建造物区分
つくりはじめます
作業中は「Ctrl
+ S
」キーを押して適宜上書き保存してください。
index.htmlを編集しよう
Chrome Dev Editorの左パネルのファイルリストで、前回の記事で準備したindex.html
をクリックして開きます。
初期状態でいろいろ書いてありますが、今回はほとんど使わないため、とりあえず、すべて消してしましましょう。そして、以下のコードをコピーしてindex.html
にペーストしてください。
<!doctype html> <html> <head> <title>my-signboard</title> <script src="../platform/platform.js"></script> <!-- (1) --> </head> <body unresolved> <!-- (2) --> </body> </html>
案内看板コンポーネント用のフォルダとファイルをつくろう
まずは、フォルダをつくります。エディタの左パネルの「▼ my-signboard」を右クリックして、表示されるメニューから「New Folder...」をクリックします。
ポップアップウィンドウが開きフォルダ名を聞かれるので、「my-signboard」と入力して「CREATE」をクリックします。
続いてコンポーネント用のファイルをつくります。いま作った「my-signboard」フォルダを右クリックして、表示されるメニューから「New File...」をクリックします。
ポップアップウィンドウが開きファイル名を聞かれるので、「my-signboard.html」と入力して「CREATE」をクリックします。
これで、「my-signboard」フォルダの中に「my-signboard.html」が生成されました。
my-signboard.htmlを編集しよう
エディタの左パネルのファイルリストで、「my-signboard.html」をクリックして開きます。何も記述されていないと思いますので、以下のコードをコピー/ペーストしてください。
<link rel="import" href="../bower_components/polymer/polymer.html"> <polymer-element name="my-signboard" attributes="ja en km classname"> <template> <style> #signboard { width: 300px; background-color: #814022; color: #FFF; padding: 10px; margin: 20px; margin-bottom: 40px; font-family: Meiryo; border-radius: 4px; box-shadow: 0px 10px #5A281D; } #top { font-size: 30pt; } #bottom { font-size: 18pt; margin-top: -10px; } </style> <div id="signboard"> <center> <div id="top"> {{ja}} {{km}}km </div> <div id="bottom"> {{en}} {{classname}} </div> </center> </div> </template> <script> Polymer("my-signboard", {}); </script> </polymer-element>
ソースコード中にはWeb Componentsのキーワードである<link rel="import"...>
や<template>
、またPolymerフレームワークで重要な役割を担うPolymer
関数が見つかると思います。これらの挙動に関しては今後記事にする予定です。
ふたたび、index.htmlを編集しよう
これが最後のステップです。「index.html」を開いてください。最初のステップでペーストしたコードが表示されます。そのなかの<!-- (1) -->
、<!-- (2) -->
を以下のようにそれぞれ書き換えてください。
<!-- (1) -->
↓
<link rel="import" href="my-signboard/my-signboard.html">
<!-- (2) -->
↓
<my-signboard ja="河童橋" en="Kappa-bashi" km=1.1 classname="Bridge"></my-signboard>
最終的には、index.htmlは以下のようになっていると思います。かなりシンプルですね!
<!doctype html> <html> <head> <title>my-signboard</title> <script src="../platform/platform.js"></script> <link rel="import" href="my-signboard/my-signboard.html"> </head> <body unresolved> <my-signboard ja="河童橋" en="Kappa-bashi" km=1.1 classname="Bridge"></my-signboard> </body> </html>
上書き保存して完成です。
表示しよう
エディタの左パネルのファイルリストで、「index.html」を右クリックして、メニューから「Run」をクリックしてください。
Chromeのタブが開き、ウィンドウに以下のような案内板が表示されたら大成功です。<my-signboard>
タグでは文字の色や大きさ、看板の色などのstyle情報を一切書いていないのに、しっかり看板らしく表示できるという点がポイントです。
お疲れ様でした^^v
おまけ課題
課題
「河童橋」の看板の下に「大正池」の看板を表示してください。「大正池」の情報は以下の写真を参考にしてください。
課題の答え
index.htmlの<body>
タグの中身を以下のように書き換えて、「Run」します。
<my-signboard ja="河童橋" en="Kappa-bashi" km=1.1 classname="Bridge"></my-signboard> <my-signboard ja="大正池" en="Taisho-ike" km=2.5 classname="Pond"></my-signboard>
このように表示されたでしょうか
一度コンポーネントを作ってしまえば、後は大量に看板を生産できますね!