ブログなどで記事をスクロールしたら、追いかけてくる広告などがあります。
今回はWordpressで、そんなスクロールに追従してくるサイドバーウィジェットを作る方法です。
photo by Kyle Mahaney
目次
ウィジェットの登録
まずはfunctions.phpにウィジェットを登録します。
register_sidebars関数を用いて、以下のように書きます。
register_sidebars(1, array( 'name'=>'スクロール追従領域', 'id' => 'sidebar-scroll', 'description' => 'サイドバーで下にスクロールすると追いかけてくるエリアです。', 'before_widget' => '', 'after_widget' => '', 'before_title' => '<h4>', 'after_title' => '</h4>', ));
こう書くことで、「外観→ウィジェット」に以下のような設定項目が表示されるようになります。
ここに広告(AdSenseはNG)など、注目を集めたいものをウィジェットとして放り込みます。
スクロール追従領域を作る
sidebar.phpにスクロール追従領域を作ります。
<!--スクロール追従領域--> <div id="sidebar-scroll"> <?php dynamic_sidebar('sidebar-scroll');?> </div>
以下のようにサイドバーの範囲内に収まるように書きます。
<div id="sidebar"> <!-- コード省略 --> <!--スクロール追従領域--> <div id="sidebar-scroll"> <?php dynamic_sidebar('sidebar-scroll');?> </div> </div><!-- /#sidebar -->
jQueryの登録
今回、サイドバーに追従領域を作るのには、jQueryを利用します。
なので、jQueryを使っていないテーマを利用している場合は、jQueryを利用できるように設定する必要があります。
header.phpの<head></head>の中wp_head();関数の前に、以下を記入してください。
<?php wp_enqueue_script('jquery'); ?>
こんな感じになります。
<?php wp_enqueue_script('jquery'); ?> <?php wp_head(); ?>
WordPressに内包されているjQueryが呼ばれます。
既にテーマ内で、jQueryが呼ばれている場合は記入必要はありません。
JavaScriptを書くファイルを作成する
スクロールに追従するコードを書くためにJavaScript用のファイルを作成します。
テーマに既にJavaScriptコード用のファイルがある場合は、それを使用してもOKです。
今回は、テーマフォルダ内にjavascript.jsというファイルを作成しました。
このファイルを、先程のjQuery呼び出しのあとに呼び出します。
呼び出すコードはこれ。
<script src="<?php echo get_template_directory_uri(); ?>/javascript.js"></script>
先程記入したのも合わせると、こんな感じになります。
<?php wp_enqueue_script('jquery'); ?> <?php wp_head(); ?> <script src="<?php echo get_template_directory_uri(); ?>/javascript.js"></script>
JavaScriptを記入する
最後に、スクロール追従動作をさせるJavaScriptコードをjavascript.jsに記入します。
今回は、@Hamachiya2さんの以下のコードを、ほとんどまんま利用させてもらいました。
参考 ライブドアみたいにスクロールしたらサイドバーの広告を固定する – ぼくはまちちゃん!(Hatena)
WordPressで利用するために↑にあるコードの$をjQueryに置換してjavascript.jsに記入します。
///////////////////////////////// //スクロール追従 ///////////////////////////////// (function(jquery) { jquery(document).ready(function() { /* Ads Sidewinder by Hamachiya2. http://d.hatena.ne.jp/Hamachiya2/20120820/adsense_sidewinder */ var main = jQuery('#main'); // メインカラムのID var side = jQuery('#sidebar'); // サイドバーのID var wrapper = jQuery('#sidebar-scroll'); // スクロール追従要素のID if (main.length === 0 || side.length === 0 || wrapper.length === 0) { return; } var w = jquery(window); var wrapperHeight = wrapper.outerHeight(); var wrapperTop = wrapper.offset().top; var sideLeft = side.offset().left; var sideMargin = { top: side.css('margin-top') ? side.css('margin-top') : 0, right: side.css('margin-right') ? side.css('margin-right') : 0, bottom: side.css('margin-bottom') ? side.css('margin-bottom') : 0, left: side.css('margin-left') ? side.css('margin-left') : 0 }; var winLeft; var pos; var scrollAdjust = function() { sideHeight = side.outerHeight(); mainHeight = main.outerHeight(); mainAbs = main.offset().top + mainHeight; var winTop = w.scrollTop(); winLeft = w.scrollLeft(); var winHeight = w.height(); var nf = (winTop > wrapperTop) && (mainHeight > sideHeight) ? true : false; pos = !nf ? 'static' : (winTop + wrapperHeight) > mainAbs ? 'absolute' : 'fixed'; if (pos === 'fixed') { side.css({ position: pos, top: '', bottom: winHeight - wrapperHeight, left: sideLeft - winLeft, margin: 0 }); } else if (pos === 'absolute') { side.css({ position: pos, top: mainAbs - sideHeight, bottom: '', left: sideLeft, margin: 0 }); } else { side.css({ position: pos, marginTop: sideMargin.top, marginRight: sideMargin.right, marginBottom: sideMargin.bottom, marginLeft: sideMargin.left }); } }; var resizeAdjust = function() { side.css({ position:'static', marginTop: sideMargin.top, marginRight: sideMargin.right, marginBottom: sideMargin.bottom, marginLeft: sideMargin.left }); sideLeft = side.offset().left; winLeft = w.scrollLeft(); if (pos === 'fixed') { side.css({ position: pos, left: sideLeft - winLeft, margin: 0 }); } else if (pos === 'absolute') { side.css({ position: pos, left: sideLeft, margin: 0 }); } }; w.on('load', scrollAdjust); w.on('scroll', scrollAdjust); w.on('resize', resizeAdjust); }); })(jQuery);
さて、上記のコードですが下記の部分は、お使いのテーマに合わせる必要があります。
var main = jQuery('#main'); // メインカラムのID var side = jQuery('#sidebar'); // サイドバーのID var wrapper = jQuery('#sidebar-scroll'); // スクロール追従要素のID
上にある設定を、分りやすく図に表すとこのようになります。
それぞれのIDは、利用しているWordpressテーマのIDに合わせて設定してください。
これで、記事の最後の方までスクロールを追従してくる領域を作ることができました。
試しに、Amazonの広告などを置くとこんな感じになります。
まとめ
参考にさせてもらったコードのおかげで思ったより簡単にスクロール追従領域を作ることができました。
先程も書きましたが、AdSense広告を追従領域に置くと、プログラム ポリシーに違反するので注意してください。
はじめまして。キイ太と申します。
いつも参考にさせていただいております。
早速お尋ねします。私のサイトでは、メディアクエリによって
・799ピクセル以下では1カラム、
・800ピクセル以上では2カラム
で表示する仕様となっています。
上記ご紹介の方法を、2カラム表示時(表示幅800ピクセル以上のとき)のみ
適用することは可能でしょうか。
もし簡単な変更作業で済む方法がありましたら
教えていただけないでしょうか。
お忙しいところ申し訳ありませんが、ご回答をよろしくお願いいたします。