ラベル HTML5 の投稿を表示しています。 すべての投稿を表示
ラベル HTML5 の投稿を表示しています。 すべての投稿を表示
2014/11/28

exif-js と ios-imagefile-megapixel でスマホからの画像アップロードのプレビュー表示に対応する

画像アップロードするときにプレビュー欲しいよね〜
プレビューするとたまに画像が回転されてるよね〜
スマホだと画像選択するアプリで EXIF 情報を見て回転させて表示しているから
プレビューが横向きとかになってておかしいと思われがちだよね〜

そんな問題を解決するのが exif-js です。

exif-js

jseidelin/exif-js

使い方は https://github.com/jseidelin/exif-js/blob/master/example/index.html を見てください。
例えば、アップロードされたファイルに対して Orientation を取得する場合は以下のように記述します。
$('#jsFileInput').on("change",function(){
    var file = $(this).prop("files")[0];
    EXIF.getData(file, function(){
        var orientation = file.exifdata.Orientation;
    });
});
EXIF 情報を取得するメソッドが提供されていて、
EXIF.getTag(file, "Orientation") で Orientation を取得できるようだけど
取得できないこともあるみたい?で file.exifdata.Orientation で直接取得してしまっています。
よくわからないので動作確認してもらえればと思います。

さて Orientation は取れましたが、どうやって画像を回転しましょう。
そんな時は megapix-image.js が便利でした。

megapix-image.js

stomita/ios-imagefile-megapixel

iOS とか入っていますが気にしなくても大丈夫です。
megapix-image.js は大きな画像を表示する際に便利なライブラリですが、
回転もやってくれるので表示は全部任せてしまいましょう。
スマホからだと数 MB 〜 十数 MB の画像が平気でアップロードされるので
普通にプレビューさせようとするとブラウザごとメモリ不足で落ちることがあるのでが
megapix-image.js を使えば、そういったことが少なくなります。
(※直接は見たことないが、画面が真っ暗になるなどの報告を受けたことがあるので銀の弾丸ではない?)

さきほどの exif-js と組み合わせて使うには以下のようにします。
$('#jsFileInput').on("change",function(){
    var file = $(this).prop("files")[0];
    EXIF.getData(file, function(){
        var orientation = file.exifdata.Orientation;
        var mpImg = new MegaPixImage(file);
        mpImg.render($("#jsPreviewImage")[0], { orientation: orientation });
    });
});

まとめ

これで回転している大きな画像をプレビュー表示することができるようになったと思います。
まれに表示できないこともあるらしいので、もっと良い方法があれば教えて下さい。
2014/04/06

かずー氏アイコンジェネレータをHTML5で作ってみた

HTML/CSS/JavaScriptを駆使した画像の重ね方 | DevAchieveという記事、
かずー氏クラスタアイコンの作り方の記事を1年前くらいに書いていました。
そこで Canvas を使用してかずー氏 (@kazoo04)のアイコン背景と
@wada811 のアイコンを合成できていたので
ユーザーがアップロードした画像を読み込んで
同じように Canvas に表示してあげて合成すれば
かずー氏アイコンジェネレータになるのではないか
というのがこのプロジェクトの始まりでした。

そして、途中で開発が止まるなど紆余曲折がありましたがついに完成しました!
かずー氏アイコンジェネレータ

わずか 3STEP で、かずー氏アイコンを作成できるという優れものです。
(本当はページ開いた瞬間にファイル選択が出て、選択したら自動ダウンロードということもできます。)
今回サーバいらずで、クライアントサイドの技術のみでかずー氏アイコンを生成することができます。
この手のちょっとしたネタサイト作るためにサーバの用意とかお金かけるとかしたくない人におすすめです。

技術的な話

Drag and Drop API

実は画像をドラッグ・アンド・ドロップでアップロードすることが可能です。
デザイン上、ドラッグ・アンド・ドロップができるとわかるようになっていないので
何かいい感じのデザインになる Pull Request を待っています。

Drag and Drop API 機能の実装は簡単で、ドラッグ・アンド・ドロップ系のイベントを適切に処理するだけです。
<canvas id="jsKazoo04Icon"></canvas>
$(document).ready(function(){
    // ...
    addDropListener('jsKazoo04Icon');
});

function addDropListener(id){
    var jsDropBox = document.getElementById(id);
    document.addEventListener('dragover', dropNone);
    document.addEventListener('drop', dropNone);
    jsDropBox.addEventListener('dragover', dropCopy);
    jsDropBox.addEventListener('drop', drop);
}
ブラウザに画像ファイルをドロップすると画像をそのまま表示してしまうので処理を止めています。
document.addEventListener('dropover', dropNone); 
document.addEventListener('drop', dropNone);
function dropNone(event) {
    event.stopPropagation(); // イベントのバブリング(親要素への伝搬)を停止する
    event.preventDefault(); // ブラウザのデフォルトの処理(画像の表示)を防ぐ
    event.dataTransfer.dropEffect = 'none'; // D&D中のファイルにアイコンがつかないようにする
}
ドロップを受け付ける要素に addEventListener でリスナーを登録します。
jsDropBox.addEventListener('dragover', dropCopy);
jsDropBox.addEventListener('drop', drop);
function dropCopy(event) {
    event.stopPropagation(); // イベントのバブリング(親要素への伝搬)を停止する
    event.preventDefault(); // ブラウザのデフォルトの処理(画像の表示)を防ぐ
    event.dataTransfer.dropEffect = 'copy'; // D&D中のファイルにプラスアイコンがつくようにする
}

function drop(event){
    // 画像ビューアとして開かないようにする
    dropCopy(event);
    // ドロップされたファイルを取得
    var file = event.dataTransfer.files[0];
    if(file.type !== 'image/png'){
        alert('PNG画像のみを受け付けています。');
        return;
    }
    handleFile(file);
}

参考
[HTML5] Drag & Drop API おさらい 「ファイルの DnD」 | Developers.IO

JavaScript から参照する要素には js プレフィックスをつけたほうがいいよという話。
CSSのセレクタ部分(IDやCLASS)にハイフンとか使われるの好きじゃないなー。ボクはあまり好きじゃないなー - latest log

File API

input[type="file"] で画像アップロードを受け付け、
アップロードされた画像をプレビュー表示する際に使用しました。
<input type="file" id="jsUpload" class="upload" onchange="upload(this.value)" accept="image/*" />

まず、画像のみを受け付けるためには accept="image/*" を指定します。
参考
HTML5時代のinput要素のaccept属性について | 富永日記帳
4.10.5.1 States of the type attribute — HTML Standard

input[type="file"] で画像アップロードした際のイベントを取得するには onchange="upload(this.value)" を指定します。
今回は fileName は未使用ですが、何かに使えるかも?
スマホの場合はセキュリティのためダミーのパスが入るので使えないかも?
function upload(fileName){
    var files = document.getElementById('jsUpload').files;
    var file = files[0];
    handleFile(file);
}
File API で画像を読み込みます。
function handleFile(file){
    var fileReader = new FileReader();
    fileReader.readAsDataURL(file);
    // ファイル読み込み失敗時
    fileReader.onerror = function(e){
        alert('画像の読み込みに失敗しました。');
    };
    // ファイル読み込み完了時
    fileReader.onload = function(event){
        var image = new Image();
        image.src = event.target.result;
        image.onload = function(){
            // 画像が読み込み完了したら Canvas に描画
            var canvas = document.getElementById('jsKazoo04Icon');
            var ctx = canvas.getContext('2d');
            ctx.drawImage(image, 0, 0);
        };
    };
}

参考
Using files from web applications | MDN

Canvas を toDataURL で Data URL 形式の画像に変換する

解説はしていないがHTML/CSS/JavaScriptを駆使した画像の重ね方 でもできていたもの。
Canvas の描画内容を Data URL に変換して画像タグを貼り付けるだけです。
function generateKazoo04Icon(){
    var canvas = document.getElementById('jsKazoo04Icon');
    var ctx = canvas.getContext('2d');

    var dataURL = canvas.toDataURL('image/png');
    var imgTag = '<img src="' + dataURL + '" width="' + canvas.width + '" height="' + canvas.height + '" alt="かずー氏背景合成画像">';
    $('#jsKazoo04Icon').after(imgTag).remove();
    // ...
}

Data URL 形式の画像を Blob に変換して Blob URL 形式に変換

Canvas に toBlob もあるのですが、ほとんどのブラウザで実装されていないようです。
仕方ないので dataURL から Blob に変換する関数をかませて
window.URL.createObjectURL で Blob URL 形式に変換します。
function generateKazoo04Icon(){
    // ...
    var blob = Base64toBlob(dataURL);
    window.URL = window.URL || window.webkitURL;
    $('#jsDownload').attr("href", window.URL.createObjectURL(blob));
}

function Base64toBlob(_base64){
    var i;
    var tmp = _base64.split(',');
    var data = atob(tmp[1]);
    var mime = tmp[0].split(':')[1].split(';')[0];

    //var buff = new ArrayBuffer(data.length);
    //var arr = new Uint8Array(buff);
    var arr = new Uint8Array(data.length);
    for (i = 0; i < data.length; i++) {arr[i] = data.charCodeAt(i);}
    var blob = new Blob([arr], { type: mime });
    return blob;
}

参考
Canvasの画像(スクリーンショット)をローカルダウンロードします。 - jsdo.it - Share JavaScript, HTML5 and CSS
Base64をblobオブジェクトに変換します。 - jsdo.it - Share JavaScript, HTML5 and CSS
URL.createObjectURL - Web API Interfaces | MDN

だいたいオッケー、でも…

Drag and Drop による画像アップロードがわかりにくい点、
読み込んだ画像を移動、回転、拡大・縮小できない点がユーザー的に微妙ですね!
さぁあなたの Pull Request を待っています!

ちなみに「読み込んだ画像を移動、回転、拡大・縮小できない点」は
Fabric.js Javascript Canvas Libraryというものを使えば解決できます。

まだ時間をかければ実装はできますが、とりあえずリリースすることが大事ってばっちゃが言ってた。
2013/07/16

郵便番号フィールドにinput[type="number"]を使ってはいけない

スマホサイトを制作したのだがフォームにフォーカスを当てた際に出るキーボードを
数字キーボードにしたいという要望があったので
input[type="number"] や input[type="tel"] を使えば良いと聞いていた俺は
それぞれ郵便番号と電話番号のフィールドの type を text から変更したのだけど
input[type="number"] には罠があったので共有します。
input[type="number"] というよりは iOS の Safari にある罠です。

iOS の Safari は input[type="number"] のフィールドで入力値がゼロ始まりの数値の場合、頭のゼロを自動で除去する

この仕様…あのおせっかいな Excel を思い出す仕様だぜ…ギリッ…

例えば皇居の郵便番号 100-0001 は分割された郵便番号フォームの後ろの部分が以下のように頭ゼロになります。
-
表示上は iOS でも全く問題ないのだけれど POST するタイミングで iOS の Safari は 0001 を 1 に変換します。
ベーシックなバリデーションで郵便番号 7 桁とか判定して 7 桁入力してくださいとかエラー出すと
ユーザーは 7 桁入力したのにとなるので確実にクレームものです。
iPhone を普段使いしていない僕は完全に油断してやられました。
iOS のみで起こり、input[type="number"] でゼロ始まりの数値を POST した時にようやく分かるバグです。
全く油断もすきもありません。

とりあえず対処として input[type="text"] に戻しました。
input[type="tel"] に変えるのも一瞬考えましたが
電話番号でないフィールドに input[type="tel"] を適用するのも
またろくでもないことになりそうだったのでやめておきました。
2013/03/30

HTML/CSS/JavaScriptを駆使した画像の重ね方

いわゆる、かずー氏クラスタアイコンの作り方

Way to cover an image with another image
サンプルページへはこちらのリンクまたは画像をクリック!

@wada811のアイコンが、
他の人のかずー氏クラスタアイコンのように
全体サイズになっていないのは
重ねるのが簡単すぎて
重ねたい画像が同じサイズの特殊事例にしか
対応できないように見えるため
あえて小さく重ねています。

方法としては6つもありました!
正直自分でも驚きです。
  1. background: absolute; で絶対配置で重ねる方法
  2. 背景画像を指定した div に img タグを置いて重ねる方法
  3. 2の方法を擬似要素 :after の content: url() で重ねる方法
  4. 3の方法で content ではなく背景画像に指定して重ねる方法
  5. CSS3 の複数画像の背景指定で重ねる方法
  6. Canvas で複数画像を読み込んで重ねる方法

background: absolute; で絶対配置で重ねる方法は安心安定の指定方法。

HTML の記述量が多くなるので繰り返しが多い部分には使いたくないが、
ワンタイムのページでいちいち CSS ファイルを編集するのがめんどくさい時には便利。

背景画像を指定した div に img タグを置いて重ねる方法はプログラムで使いやすい。

背景画像をプログラムなどで差し替えたいときや、
状態判定してカバー画像をかける、かけないというの場合分けなどで便利。

2の方法を擬似要素 :after の content: url() で重ねる方法は IE7 以下で使えない。

今回は transform: scale(); で無理やり画像を小さくしているので
IE8 で画像が小さくならなくて背景画像をはみ出てしまう。
使うときはちゃんとサイズの合った画像を使おう。

3の方法で content ではなく背景画像に指定して重ねる方法は IE8 以下で使えない。

CSS3 の background-size を使っているので IE8 以下は画像が小さくならなくて切れてしまう。
使うときはちゃんとサイズの合った画像を使おう。

CSS3 の複数画像の背景指定で重ねる方法は IE8 以下で表示すらできない。

background-image が CSS3 で複数枚の画像を指定できるようになっている。
この使い方では微妙だが、サイトの画像をコンポーネント化できるので微妙に違う画像が多い時は便利かも?
スマホなら background-image の複数画像指定をサポートしているはずなので
画像を色んな組み合わせで一つの画像として表示したいときに使えるかも。
キャッシュされればそれぞれ早くなりそうな気がする。

Canvas で複数画像を読み込んで重ねる方法は IE8 以下では使えない。

IE8 以下でも Canvas を使えるようにするライブラリもあるようだが完全ではないようです。
参考: HTML5 CanvasをIEにも対応させる魔法excanvasの使い方 | DECONCEPTER
複数の画像を合成した画像を Data URI スキームで表現できるので
サンプルページにあるように Canvas で作った画像を画像タグで置換することもできる。

最後に

目的に合わせていろいろな方法を使いこなせるようになろう。
Canvas を使って面白そうなことができるのでやってみたい。

@kazoo04のアイコン素材を使わせて頂きました。
この場を借りて感謝します。ありがとうございます。
2013/03/24

Retinaディスプレイ対応のマルチサイズfaviconの作り方と指定方法

前にDon't Forget About Favicons on Retina Screens
Retina ディスプレイ用の favicon を作らなきゃなぁと思っていたのだけどすっかり放置していた。
ググってみるとちょうどいい記事を発見した。
Retinaディスプレイに対応できるマルチサイズのファビコンの作り方。 | オレっち.com
Bradicon! でマルチサイズ favicon が作れる。
Bradicon! - converting icons since... LITERALLY FOREVER
include large icons にチェックして Browse で favicon にしたい画像を選択したら生成されるまで待つだけ。
生成されたら画像をクリックすればダウンロードできる。
ico ファイル が 1 ファイルだけなんだなぁと思ったらマルチサイズに対応していて、複数入っていて驚き!

後はコレを以下のように指定すれば良いらしい。
<link rel="shortcut icon" href="http://www.your-domain.com/favicon.ico">
HTML5 だと shortcut はいらなくて icon だけで良いらしい。Favicon(ファビコン)に纏わる色々 | 10press
<link rel="icon" sizes="16x16 32x32 48x48 128x128 256x256" href="http://www.your-domain.com/favicon.ico">
HTML5 から sizes 属性を指定できる。スペース区切りで指定すれば良い。4.12 Links — HTML 5.1
MIME タイプは ico ファイルなら指定しなくても良いかも?
どうせ IE が ico ファイルしか対応していないっぽいし。Favicon - Wikipedia, the free encyclopedia
2012/09/10

[書評]日経ソフトウエア 2012年 06月号

日経ソフトウエア 2012年 06月号 [雑誌]
日経BP社
発売日:2012-04-24
ブクログでレビューを見る»
矢野りんのデザイン業務レポート、
プログラミングでコレがやりたい!40選、
初めて作るスマホアプリ、Androidのここに注意!、
深津貴之の使いやすいiPhoneアプリの作り方。
付録は「HTML5逆引きポケット事典」という小冊子。
日経ソフトウエア ダウンロード - 2012年:ITpro

矢野りんのデザイン業務レポート

上から順にやってもらう場合、リスト型のUIだとユーザーが何をすればいいのか戸惑うかもしれない。
リスト型の UI は階層構造をイメージさせるのでどこかに「飛んで」いく場合には向いてないかも。
「飛んで」いくならボタンなどがいい。ちゃんとした説明文とわかりやすい文言のボタンが良い。

プログラミングでコレがやりたい!40選

「ナンプレを解くプログラムを作りたい」というトピックは深さ優先探索を使っていて参考になった。
「迷路の最短経路を発見したい」というトピックは幅優先探索が使われていてAtCoderで解くときに役立ちそう。
すごく雑多で微妙。

初めて作るスマホアプリ iPhoneアプリを1時間で作る

難しいことを一切解説せずに3分クッキングやりましたな感じ。InterfaceBuilder の使い方だけ学べる。

Androidのここに注意! セキュリティ対策のツボ

対象読者のレベルが上ったり下がったりしたのは気のせいだろう。
そういえばAndroid Security 安全なアプリケーションを作成するためにをまだ読めてない。
今回のAndroid特集はセキュリティ特集とかマニアックな感じのネタが多かったような。

深津貴之の使いやすいiPhoneアプリの作り方

iPhoneアプリ設計の極意 ―思わずタップしたくなるアプリのデザインの訳者であり、
iPhoneアプリ開発者として有名な@fladdictさんの記事。
アプリ開発者はPCの電源を切ってペーパープロトタイピングしよう!という話。
ピグマサインペン 0.5mmで輪郭を描き、コピックというマーカーで面を塗るらしいです。
紙は75×50mmのポストイットがiPhoneの画面と全く同じサイズ(!)でいいんだそう。
アイディアをメモして、画面も作れるし、貼れるので一覧もできるし画面遷移もわかりやすくていいらしい!
1ページの記事だったけどどの記事よりも価値のある記事だと思った。

おまけ

「インターン女子C#を学ぶ」が終わってしまい、「マンガでスキルアップC#プリミティブ」が始まりました。
妖精さんにいろんな物をさらっと教える感じで「インターン女子」と比べると浅く感じたのは気のせいか。
付録の小冊子は「HTML5逆引きポケット事典」で、表紙に何故か栃木のアイドルユニットがいるという謎。
HTML5のタグの解説というより、広義のHTML5で Canvas API, Web Storage API, Geolocation API,
Drag and Drop API, File API, Text Selection API, Web Messaging API,
Web Worker API, Offline Web Applicaitons の解説とサンプルコードがあって結構いい感じ。当たりの付録です。

日経ソフトウエア 2012年 06月号 [雑誌]
日経ソフトウエア 2012年 06月号 [雑誌]
2012/08/26

HTML5で追加されたinput要素のtype属性の属性値dateを使ってみた

日付をフォームに入力させてJavaScriptでゴニョゴニョすることがあったのだけど
JavaScriptでnew Date()に渡すことのできる日付のフォーマットが
ブラウザごとに異なっていたのでサンプルページ作って試してみたら全部普通に動いた。

YYYY/MM/DD hh:mm:ss形式でDate生成できたのはChromeだけで
FirefoxはYYYY/MM/DD形式、IEはYYYY-MM-DD形式だった。ここまでは許せる。
Safariはアメリカ方式でMM/DD/YYYY形式じゃないとダメだったから
ガガッとサンプル作ったのに…。どういうことなの…。
参考:JavaScript new Date() Returning NaN in IE or Invalid Date in Safari | BIOSTALL

違いといえばその現象が起きたのでXHTMLで、サンプルはHTML5で作ったってことくらい。関係無さそう。謎。

ってことでブラウザ毎の差異は忘れて入力用に作ったフォームで使った<input type="date" (...) />について書く。
W3C:4.10.7.1 States of the type attribute — HTML5
WHATWG:4.10.7.1 States of the type attribute — HTML Standard
<input type="date">-HTML5タグリファレンス
仕様をちゃんと見なきゃと思うけどもなかなかきついのでHTML5リファレンスにお世話になる。

見てるとHTML5から追加されたアレコレが魅力的すぎて早く全部のブラウザで使えるようになって、
サイト制作に使えるようになってほしい。
type="date"は現在ChromeとOperaでしか使えないけど
他のブラウザではおそらくtype="text"を指定したとみなされて?普通のテキストフォームになるので
プログレッシブ・エンハンスメントとして使っちゃうこともできる。

少しショボイ方がOperaで、リッチな方がChrome。
年、月を変えるボタンとドロップダウンになってる年月表示。
自動で入るプレースホルダー(薄い字のヒント)もある。
いい加減コードとサンプルサイト晒します。HTML5 input date sample page
<section class="row center">
  <table class="center" role="presentation">
   <tr>
    <td><label for="begin">開始日</label></td>
    <td><input type="date" id="begin" name="begin" value="" /></td>
   </tr>
   <tr>
    <td><label for="end">終了日</label></td>
    <td><input type="date" id="end" name="end" value="" /></td>
   </tr>
   <tr>
    <td colspan="2">
     <input type="button" class="btn btn-primary" value="jQueryで計算" onclick="getPeriod_jQuery()" />
     <input type="button" class="btn btn-primary" value="JavaScriptで計算" onclick="getPeriod_JavaScript()" />
    </td>
   </tr>
   <tr>
    <td><label for="period">期間(日)</label></td>
    <td><input type="text" id="period" name="period" value="" /></td>
   </tr>
  </table>
  <script><!--
   function getPeriod_jQuery(){
    var begin = $('#begin').val();
    var end = $('#end').val();
    var beginDate = new Date(begin);
    var endDate = new Date(end);
    var period = ( endDate.getTime() - beginDate.getTime() ) / ( 1000 * 60 * 60 * 24 );
    $('#period').val(period);
   }
   function getPeriod_JavaScript(){
    var begin = document.getElementById('begin').value;
    var end = document.getElementById('end').value;
    var beginDate = new Date(begin);
    var endDate = new Date(end);
    var period = ( endDate.getTime() - beginDate.getTime() ) / ( 1000 * 60 * 60 * 24 );
    document.getElementById('period').value = period;
   }
  --></script>
 </section>
適当に日付を入力させて期間をJavaScriptで計算して出すだけの簡単なもの。
このときのnew Dateがブラウザ毎に受け取れる値が異なるから作ったのに普通にYYYY/MM/DDで全部できた。
動きが見たい人はサンプルページへどうぞ

tableタグのrole="presentation"という見慣れない文字列について

tableタグは表以外に(レイアウト目的で)使ってはいけないと思われているが別に禁止されていない(らしい)。
本当はCSSでレイアウトを調整することが推奨されているのだけど面倒なのでtableタグで実装した。
普通に組んだんじゃ良くないのでWAI-ARIAのrole="presentation"つけた。アクセシビリティ的にも良いらしい。
WAI-ARIA(ウェイ・アリア:Web Accessibility Initiative-Accessible Rich Internet Applications)って
流行らなそうだけど必要な人にはとことん必要なものなので知っておきたいですね。
4.9 Tabular data — HTML Standard
The Roles Model | Accessible Rich Internet Applications (WAI-ARIA) 1.0
HTML5のtable要素が表なのかレイアウト目的なのかを示す属性やら要素について調べてみた。
role="presentation"の役割は凄い。【WAI-ARIA】 - E-riverstyle Vanguard
レイアウトテーブルの使用は禁止されていない。 - E-riverstyle Vanguard
WAI-ARIA(日本語訳):日立のユニバーサルデザイン
HTML5 + WAI-ARIA: 入門篇 – terkel.jp
アクセシビリティを加速するWAI-ARIA

jQuery版とJavaScript版の日付差分取得

jQueryはいいね。ジョンの生み出した文化の極みだよ。
document.getElementByIdなんて長い文を書かなくていいんだ。
あとはJavaScript標準のDateオブジェクトを生成してgetTime()でUNIXTIMEからの経過時間をミリ秒を取得して
差分を日単位になるまで割ればオッケー☆フォームに代入しちゃおう♡

フォームにidを指定しなくてもいいんだ。そう、jQueryならね。

function getPeriod(){
 var begin = $('input[name="begin"]').val();
 var end = $('input[name="end"]').val();
 var beginDate = new Date(begin);
 var endDate = new Date(end);
 var period = ( endDate.getTime() - beginDate.getTime() ) / ( 1000 * 60 * 60 * 24 );
 $('input[name="period"]').val(period);
}
$('input[name="begin"]')はinput要素のname属性がbeginな要素を指定している。
だいたい同じ値をidとnameに指定していて、重複した感じが嫌だったのでこれは嬉しいね。

長々書いたけどサンプルページは試してみてくれたかな?大したものじゃないけどまだの人はぜひ!
HTML5 input date sample page
2012/06/24

IE対応済み!今すぐコピペして使えるHTML5テンプレート

HTML5が流行り始めて結構経ちました。
個人的にもHTML5でサイト制作したいなーと思っていたので
まずはHTML5のテンプレートを用意しました。
最近のサイト制作ではjQueryを使うことが多いようなので
jQueryも対応しています(ハイライト部分)
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title></title>
    <meta name="author" content="">
    <meta name="description" content="">
    <meta name="viewport" content="width=device-width">
    <link rel="stylesheet" href="css/style.css">
    <!--[if lt IE 9]>
        <script src="js/html5shiv.js"></script>
    <![endif]-->
</head>
<body>
    <!--[if lt IE 7]>
        <p class="ie_fuck">お使いのブラウザは<strong>古い</strong>ため、表示が崩れることがあります。
        <a href="http://browsehappy.com/">他のブラウザ</a>を使うか、<a href="http://www.google.com/chromeframe/?redirect=true">Google Chrome Frame</a>をインストールすることで正しく表示することができます。</p>
    <![endif]-->

    <!-- page content -->

    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
    <script>window.jQuery || document.write('<script src="js/libs/jquery-1.7.2.min.js"><\/script>')</script>
    <script src="js/script.js"></script>
  </body>
</html>

解説

<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
Google Chrome Frameという色々な制限によってアップデート出来ない環境にあるIEのためのプラグインです。
ユーザーがGoogle Chrome Frameを入れている場合に対応するためのmetaタグです。
Chrome Frame: Developer Guide - The Chromium Projectsによるとchrome=1では常にChromeとして表示し、
Chrome=IE6と指定するとIE6以下だけChromeとして表示し、それ以外のブラウザではそのまま表示するそうです。
参考:Google Chrome Frame FAQ - The Chromium Projects
Google Chrome Frame plugin - Google Chrome ヘルプ

<meta name="viewport" content="width=device-width">
iOSでページ幅と初期倍率などを設定する場合に指定します。
詳しい指定の仕方はSafari HTML Reference: Supported Meta Tagsを参照。

<!--[if lt IE 9]>
    <script src="js/html5.js"></script>
<![endif]-->
まず、11, 13行目はバージョン ベクタと言ってIE判別に使うコードです。
12行目はIEでもHTML5の新要素に対応するためのJavaScriptです。
他にも印刷で崩れないようにしたり、新要素のデフォルトのスタイルを指定したりしているようです。
html5shiv - HTML5 IE enabling script - Google Project Hostingからダウンロードすることができます。
設置場所は<body>より前(例えば<head>内)でなければならず、パフォーマンス上CSSの後がオススメだそうです。
参考:CSSでIEの特定バージョンだけに対応する簡単な方法 | 某氏のたわごと NEXT
[CSS]IE9対応、IEの各バージョンごとに異なるスタイルシートを適用する方法のまとめ | コリス
HTML5入門-html5.jsでIE対応-|mayy

追記(2012/06/28 7:27)

html5.jsはZIPをダウンロードしてdist/html5.jsを使ったほうが良いとされていましたのでコードを変更しました。
理由はコチラが詳しいです→IE対応でよく利用するhtml5shivの使用方法変更について|Blog|Skyward Design

<!--[if lt IE 7]>
    <p class="ie_fuck">お使いのブラウザは<strong>古い</strong>ため、表示が崩れることがあります。
    <a href="http://browsehappy.com/">他のブラウザ</a>を使うか、<a href="http://www.google.com/chromeframe/?redirect=true">Google Chrome Frame</a>をインストールすることで正しく表示することができます。</p>
<![endif]-->
つまり何が言いたいかってのはクラス名の通り。むしろ[if IE]でもいいんじゃないですかね。
IEだけCSSがちゃんと動かないとかIEのためのCSSハックとかファックですよね。
個人的には切り捨てちゃうんだけど仕事だとそんな事言ってられないので工数いっぱい欲しいですね。

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/libs/jquery-1.7.2.min.js"><\/script>')</script>
Initializr - Start an HTML5 Boilerplate project in 15 seconds!で生成されるHTML5テンプレートにあった書き方。
23行目でCDN(コンテンツデリバリネットワーク - Wikipedia)から読み込んでいる。
CDNはなんか最適化されていて高速らしいし、ブラウザのキャッシュが効くのでロード時間の短縮が期待できるとか。
24行目で読み込めているかチェック&読み込めてなかったら自分のを読み込む処理を書いているらしい。
参考:jQueryをロードする際のナイス!と思った書き方

一応これで今すぐ使えるはず。HTML5/CSS3対応のリセットCSSやノーマライズCSSについては今度まとめたい。

追記(2012/06/30):<meta name="format-detection" content="telephone=no">について

アドバイスを頂いたのですが知らなかったのでググってみました。
iPhoneのSafari用のメタタグで、電話番号リンクに自動変換するのを制御するものだとか。
この電話番号への自動変換が結構アホの子らしくてIPアドレスとか小数が誤認識されるので付けたほうがいいみたいです。
参考:iPhone向けSafari、HTML拡張属性を使いこなす | 株式会社シンメトリック公式ブログ - 携帯開発から生まれる技術情報

タグ(RSS)