jQuery 基本
- IE8以前を切り捨て軽量化した jQuery 2.x が出ているが、IE8はまだ切れないので現状1の最新版(1.11.x)を使用
- 次バージョン:「jQuery 2.x→jQuery 3.0」「jQuery 1.x→jQuery Compat 3.0」に - Publickey
- キャッシュによる高速化が見込めるCDN(Google API or jQuery公式)のものを使用。読み込めない時のフォールバックを用意
- jQuery本体の読み込みタグは静的サイトならbody閉じタグ直前に配置。WordPressはプラグインとの兼ね合いで冒頭に置いた方が無難か?
- 最新版の方が軽くて早いのでなるべく最新版を使いたい (でも古いバージョンのまま放置しているサイトもあるのが現状)
- 古いサイトのメンテで1.9以降切り捨てられたAPIが使われている場合は jQuery Migrate プラグインを入れると良い
- jQuery互換で早くて軽いというZeptoがあるが、リスク(なんか不安、jQueryプラグインが動かない場合があるらしい)を避け使っていない。CSSフレームワークのFoundationやクックパッドスマホ版など実用例はある
- jQueryプラグインは、plugins.js に統合することでHTMLをスッキリさせHTTPリクエストを減らせる。圧縮するとなお良い(plugins.min.js。gulpなどの自動化ツールを使う)
- WordPressで最新版jQueryを読み込む場合。WordPressに元から組み込んであるものは外すこと
wp_deregister_script( 'jquery' );
wp_enqueue_script( 'jquery', '//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js', array(), '20130115', true );
modernizr
- ブラウザの機能サポート状況(HTML5、CSS3)を判定し分岐処理ができる
- HTML5未対応ブラウザにHTML5タグを認識させる HTML5-Shiv を含む
- リサイズ時にドキュメントの幅を取得する機能 (= window.matchMedia()) が付いてる
- 設置場所は headタグ内
- 本家サイトで機能を付け加えたりのカスタマイズができるが、メンテナンスを考えるとデフォルトのものを使うのが良いと思う
- 基本的な使い方:modernizr.js の機能と利用方法 - LIG
- 判定可能な機能(※ハイフン等書き方に注意):Modernizr Documentation
- これも読み込めない時のフォールバックを用意
例1:ブラウザに実装されている機能を判定しクラスを付加
modernizer適用前
<html class="no-js">
modernizer適用後。これでCSS等で分岐処理可能
<html class="js flexbox canvas canvastext webgl no-touch geolocation postmessage websqldatabase indexeddb hashchange history draganddrop websockets rgba hsla multiplebgs backgroundsize borderimage borderradius boxshadow textshadow opacity cssanimations csscolumns cssgradients cssreflections csstransforms csstransforms3d csstransitions fontface generatedcontent video audio localstorage sessionstorage webworkers applicationcache svg inlinesvg smil svgclippaths"
例2:JavaScript中で現在のブラウザが指定の機能を持つか判定して分岐処理
if (Modernizr.geolocation) { //Geolocation API に対応しているかチェック
//対応してる時の処理
}
else {
//対応してない時の処理
}
throttle と debounce
ともに必要以上のイベント発生を抑えるのに使用。scrollやresize時のイベントによく使う。 throttleは、実行間隔をnミリ秒に抑える。例えば、scroll時のイベント発生を◎ミリ秒ごとに抑えるなど debounceは、nミリ秒、繰り返しの呼び出しをさせない(= 入力がストップしてnミリ秒経ったらイベント発生)。例えば、resize操作完了後◎ミリ秒たったらイベント発生させるなど。 Underscore.js の関数か、jquery.ba-throttle-debounce.min.js を使うとシンプルに書ける
自分は便利なメソッドてんこ盛りのUnderscore.jsを標準で入れるようにしたので、Underscore.jsのものを使う
Underscore.js のメソッドを使用
underscore-min.js は 16KB
構文
_.throttle(function, 500);//引数:関数, ミリ秒
_.debounce(function, 500);
実装
適用前
$(window).scroll(function(){
//処理
}
適用後) 例:スクロールイベントで使用時
$(window).scroll(_.throttle(function(){
//処理
}, 500));
jquery-throttle-debounce を使用
jquery.ba-throttle-debounce.min.js は731バイト
-
- 処理回数を見るサンプル:jQuery throttle / debounce » Examples » Throttle
Pure JavaScript で実装するには:JavaScriptでの多発するイベントの間引き処理 - つみきブログ
Underscore.js (JavaScriptのユーティリティライブラリ) に同等メソッド throttle()/debounce() がある
実装
適用前
$(window).scroll(function(){
//処理
}
適用後 (500ミリ秒ごに処理)
$(window).scroll($.throttle(500, function() {
//処理
}));
現在のページTopに戻る & ページ内スムーススクロール
ページ内スムーススクロール & ページ上部へ戻るボタン(要jQuery)
上記のthrottleを使用
横に並んだブロック要素の高さを揃える
自分は Equal Height Blocks in Rows - CSS-Tricks をウインドウリサイズ時にも対応するよう改良したPure JavaScriptのものを使用
jQuery プラグイン
- jquery.tile.js
- jquery.heightLine.js (to-R)、Equal Height
ポリフィル (polyfill) 色々
古いブラウザにモダンブラウザのみで動く機能を追加させる ただし処理が重くなるので極力使用しないことが望ましい
- iscroll, iscroll-lite スマホで position: fixed
- picturefill picture要素やimgのsrcset/sizes属性指定などを使えるように(Chrome, Opera以外)
- PIE_IE9.js, PIE_IE678.js border-radius, box-shadow(insetは非対応), 複数の背景 ,border-image, 背景グラデーション ※IE9は後者2つのみ
- rem.min.js IE8 以下でもフォント単位 rem が使えるように
- respond.min.js IE8以下でレスポンシブ対応させる
- selectivizr (IE8以下でCSS3セレクタ使用できるように)
以下、IE8以下非対応なら不要
- minmax IE6以下でmin-width,max-width, min-height , max-heightを利用可能に。IE6切り捨てるなら不要
- boxsizing.htc IE7以下でbox-sizingを使えるように
- imgSizer (IE7以下で画像の荒れを防ぐ)
- jquery.exfixed IE6で position:fixed
備考:画像遅延ロードの Lazy Load は使わない
- 見えない位置の画像を非表示にしておき、見える位置までスクロールすると表示させる。アクセス時のリクエスト数、読込容量を減らすことができる
- Lazy Load は画像が画像検索にインデックスされないので SEO的に不利と思い自分は不採用 (noscriptタグを使う方法は完全な解決策にならないらしいし、hijax links なる解決法もあるらしいが面倒なので却下)
- 同様のスクリプトに Unveil.js (Lazy Load をエフェクトなどを省き軽くしたもの)、showByScroll、Echo.js (これはPure JavaScript) 等色々
- グーグルのJavaScript理解はまだ発展途上。画像の遅延読み込みは注意 - Web担当者Forum
- Lazy loading and the SEO problem, solved! - Idea R Blog
サンプル:HTML中でのJavaScriptファイル読込み
<!-- * * * * * * * * * * head タグ内に設置 * * * * * * * * * * * * -->
<script src="../js/vendor/modernizr-2.8.3.min.js"></script>
<!-- * * * * * * * * * * body閉じタグ直前に設置 * * * * * * * * * * * * -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="../js/vendor/jquery-1.11.2.min.js"><\/script>')</script>
<script src="../js/plugins.minjs"></script><!-- jQueryプラグイン等を統合したもの -->
<script src="../js/main.min.js"></script><!-- Google Analytics のトラッキングコードも入れること -->
<!-- * * * Polyfils * * * -->
<script>
//Androidの場合のみ iscroll-lite.js を読みこませる
if(/Android/.test(navigator.userAgent)){
$('script').attr('src','../bower_components/iscroll/build/iscroll-lite.js').appendTo('head');
//alert('テスト:iscroll-lite.jsを読み込みました。');
}
</script>
<!--[if IE 9]>
<script src="../js/vendor/PIE_IE9.js"></script>
<script>
/**
* サポート:border-image, 背景グラデーション
*/
$(function() {
if (window.PIE) {
//$('.class_name').each(function() { PIE.attach(this); }); //★★適用させたい要素を指定
}
});
</script>
<![endif]-->
<!--[if IE 8]>
<script src="../js/vendor/selectivizr-min.js"></script>
<script src="../js/vendor/respond.min.js"></script>
<script src="../js/vendor/PIE_IE678.js"></script>
<script>
/**
* サポート:border-image, 背景グラデーション, 複数の背景, border-radius, box-shadow(insetには非対応)
*/
$(function() {
if (window.PIE) {
$('.button, .label, article h2, .pagetop a').each(function() { //★★適用させたい要素を指定
PIE.attach(this);
});
}
});
</script>
<![endif]-->
</body>
</html>