公開日:2017.11.22
更新日:
[JQuery/CSS3]マウスの動きに合わせて動くコンテンツの作成:初級編
この記事の目次(クリックで項目へジャンプします)
おひさしぶりです。トゥインドルです。
WEBサイトでは、いろいろなアニメーションや動きを実装することができますが、スクロールで画面が切り替わったりなど、インタラクティブなものがあると、コンテンツの質がぐっと上がったりすることがありますよね。
ということで、jQueryを使って3分で実装できる、マウスに合わせたコンテンツの動きを紹介します。
今回は、大きく「マウスの場所の検知の仕方」と「基本的な動きを実装する方法」に分けて紹介します(シリーズ化して、ちょっとずつレベルの高いものを作っていく予定ですが、とりあえず基本的なことだけという回にします)。
今回つくるもの(仕様)
・マウスが中央よりも左にいるか、右にいるかを検知してシーソーが角度を変える
→それに従って人の向きも変わる
・マウスが中央から遠くに行けば行くほどシーソーの角度が急になる
→それに従って、人のいる部分も変わる
というものを作ります。
※マウスの動きに対応する動きのデモなので、PCのみに対応しています。
マウスの場所の検知方法
jQueryを使っての実装なので、あらかじめjQuery本体を読み込んでください。
まずは、マウスの場所の検知から。
HTML
<p><span>マウスX軸:</span><span id="clientX"></span></p> <p><span>マウスY軸:</span><span id="clientY"></span></p>
JS
$('body').mousemove(function(e) { var cX = e.clientX; var cY = e.clientY; $('#clientX').text(cX); $('#clientY').text(cY); });
- 1行目:bodyのマウスの動きを検知して、マウスが動くたびに以降のfunctionを実行
- 2行目、3行目:マウスの位置のX軸、Y軸をそれぞれ取得
- 4,5行目:②の値をそれぞれテキストに入れ込む
これで、マウスの場所を取得することはできました。
真ん中からどれくらいの距離かを計測
今度は、画面の中央からの距離を計測します
JS
var $window = $(window); var $winH = $window.height(); var $winW = $window.width(); $('body').mousemove(function(e) { var cX = (e.clientX - $winW / 2); var cY = (e.clientY - $winH / 2); $('#clientX').text(cX); $('#clientY').text(cY); });
(html,cssは省略)
「var= ~」、という定義部分が増えましたが、基本的に変更したのは一か所で、デモ1の②部分にあたる5,6行目部分を「座標-ウィンドウサイズの2分の1」としました。
これによって中央からの差し引きの値となり、マウスが画面の左にあるとき=Xは負の値、右にあるとき=Xは正の値となります(Y軸の値も同様)。
これで、マウスが真ん中からどれくらい離れているかが計測できました。
マウスの動きに従って動くコンテンツをつくる
(これからは、内容を簡略化するために、X軸のみの動きを追いかけることにします。)
コンテンツの動きを足す作業は、
JSでマウスの動きを検知する→CSSのtransformをつかって動かす
だけです。
HTML,CSS
<style media="screen"> * { padding: 0; margin: 0; } body { width: 100vw; height: 100vh; position: relative; } .island__wrapper { position: absolute; top: 50%; left: 50%; margin-left: -250px; margin-top: -25px; transition: transform .4s; } .island { width: 600px; height: 50px; overflow: hidden; } .island::after { content: ""; display: block; width: 600px; height: 100px; border-radius: 1000px; background-color: green; } .hito { position: absolute; top: -170px; left: 250px; transition: transform 1s; } .hito img { width: 100px; height: auto; } </style> <div id="canvas"> <div class="island__wrapper"><div class="island"></div><div class="hito"><img src="left.gif" alt="" width="550" height="922"></div></div> </div>
JS
var $window = $(window); var $winW = $window.width(); var $winCeneter = $winW / 2;//windowのX軸の中央の値を取得 var hito = $('.hito'); var hitoImg = $('.hito img'); $('body').mousemove(function(e) { var cX = (e.clientX - $winCeneter);//X軸中央値からの差 var rX = cX * 0.03 + "deg";//cXの値に応じてシーソーの傾き度合いを変える(0.03は適当。この値が大きければ大きいほど角度が急になる) var sX = Math.abs(cX) / $winCeneter;//中央からの値の割合(cXの絶対値/中央値).端っこに行けば行くほど1に近づき、中央に行けば行くほど0に近づく。 $('.island__wrapper').css({'transform': 'rotate('+ rX + ')'});//シーソーの角度をtransformでつける if(cX > 0) { //cXが正の値になったときの動作 hitoImg.attr('src','left.gif');//人が左を向くgifに切替 hito.css({'transform': 'translateX('+ 220*sX + 'px)'});//translateXで「最大値220px*傾きの割合」移動させる } else { //cXが負の値になったときの動作 hitoImg.attr('src','right.gif');//人が右を向くgifに切替 hito.css({'transform': 'translateX(-'+ 220*sX + 'px)'});//translateXで「最大値220px*傾きの割合」マイナスに移動させる } });
Transformにtransitionをかけると、ちょっとだけマウスとの動きとの時間差が生まれて、
マウスとの連動があまりにもグイングインしない感じになります。