特に明示していないことが多いんですが、このブログではマウスを合わせると別の画像に切り替わる、という仕込みつきの画像があります。(スマホの場合はタップ。画像の外をタップすると戻ります)
今までは記事ごとにやっつけていたのを、そろそろちゃんとスタイルシートに書いておこうと思いまして。
同じ大きさの、親子関係になる
各々に画像を載せて、子要素の方をマウス操作で消し、親要素の画像を見せる、という仕組みです。
HTMLはこんな感じ。
つまり、タグの中にクラス名を書くだけで完結します。
ちなみに、画像を表示するのに
ライブドアブログのスマホ版ページでは
なお、子画像としてのみ使うクラスには
サンプルでは変化が分り易いように、変化にかかる時間(
ウチが主に使っているエフェクトです。いちばん設定が楽、かも。
親要素に
私もこれからはなるべくこちらを使っていきたいです。
せっかくなので左下から出てくるように設定しました。
何も指定しなければ画像の中央が基準点になります。
ベンダープレフィックスはAndroid用です(以下同じ)。
これが無いと奥行き感が出ず、単に縦方向に縮んでいるように見えてしまいます。
以上はCSSで実現できるホバーエフェクトのほんの一部です。
これからもちょこちょこ仕込んでいきたいです。
今までは記事ごとにやっつけていたのを、そろそろちゃんとスタイルシートに書いておこうと思いまして。
今回はこちらのちひゆず画像をサンプルに、五種類のエフェクトを紹介します。
目次
基本クラス
まず、こちらがベースとなるクラスのCSS。.baseH{ /* 表示領域のデザイン(適当) */ margin: 20px auto; box-shadow: 2px 2px 3px #bcbfbf; } .baseH, .coverH{ /* 画像を背景イメージとして表示するための設定 */ overflow: hidden; background: transparent no-repeat; background-size: cover; } .coverH{ /* 二つの画像の大きさを合わせる設定 */ width: 100%; height: 100%; }イメージはこんな感じ。
div.coverH
div.baseH
div
要素を作り、親のクラス名をbaseH
、子のクラス名をcoverH
と呼びます。(Hはhumotomitiの頭文字)各々に画像を載せて、子要素の方をマウス操作で消し、親要素の画像を見せる、という仕組みです。
HTMLはこんな感じ。
<div class="baseH 親画像のクラス名"> <div class="coverH 子画像のクラス名 エフェクトのクラス名"></div> </div>マーカーをつけた部分に画像とエフェクトを指定します。
つまり、タグの中にクラス名を書くだけで完結します。
画像クラス
画像は、上のdiv
要素の背景画像として表示します。ちなみに、画像を表示するのに
<img>
タグを使わない理由は、以前も書きましたが、ライブドアブログのスマホ版ページの仕様にあります。ライブドアブログのスマホ版ページでは
<a>
タグを外してある画像にも自動的にリンクが貼られてしまい、タップした時、エフェクトとリンク動作がバッティングしてしまうので、それを回避するためです…
.sample-image-01{ /* div.baseH に表示する画像 */ width: 452px; height: 201px; background-image: url(base画像のURL); } .sample-image-02{ /* div.coverH に表示する画像 */ width: 452px; height: 201px; background-image: url(cover画像のURL); }ある画像を一枚表示するだけなら、この内容をHTMLの
style
属性に書き込んでも手間は変わりませんが、<style>
タグのところにまとめておいた方が管理がし易いです。なお、子画像としてのみ使うクラスには
width
とheight
の指定は要りません。本稿では応用で両者を入れ替えるサンプルがあるので、両方に同じ値を指定しています。
エフェクトクラス
以下、各エフェクトのクラスについて説明します。サンプルでは変化が分り易いように、変化にかかる時間(
transition-duration
)をゆっくり目(0.5秒)に設定していますが、実装する時は0.1~0.2秒ぐらいにするのが普通だと思います。
effectH-opacity
最初にお見せしたのと同じサンプルですが、説明のために再掲。ウチが主に使っているエフェクトです。いちばん設定が楽、かも。
上の画像がフェイドアウトする事で、下の画像が見えるようになります。
.effectH-opacity{ /* 透明度を変更するエフェクトの設定 */ opacity: 1; transition: .5s; } .effectH-opacity:hover{ /* マウスオーバー時の設定 */ opacity: 0; }
<div class="baseH sample-image-01"> <div class="coverH sample-image-02 effectH-opacity"></div> </div>
effectH-toRight
画像が右に引っ込みます。.effectH-toRight{ /* 位置を変更するエフェクトの設定 */ transform: translate(0); transition: .5s; } .baseH:hover .effectH-toRight{ /* マウスオーバー時の設定 */ transform: translate(100%); }
transform: translate()
関数は、top
、right
などのような position系プロパティに比べCPUへの負担が少なく、アニメーションさせても動作が軽いそうです。親要素に
position: relative
を指定して…といった面倒なルーティンも要りません。私もこれからはなるべくこちらを使っていきたいです。
<div class="baseH sample-image-01"> <div class="coverH sample-image-02 effectH-toRight"></div> </div>
effectH-fromBottomLeft
前項の応用で、引っ込むのではなく、出てくるパターン。せっかくなので左下から出てくるように設定しました。
.effectH-fromBottomLeft{ /* 位置を変更するエフェクトの設定 */ transform: translate(-100%, 100%); transition: .5s ease-in-out; } .baseH:hover .effectH-fromBottomLeft{ /* マウスオーバー時の設定 */ transform: translate(0, 0); }
<div class="baseH sample-image-02"> <div class="coverH sample-image-01 effectH-fromBottomLeft"></div> </div>動かすことになった
sample-image-01
の方を内側に設定します。
effectH-scale
画像が縮小して消えます。.effectH-scale{ /* 表示倍率が変化するエフェクトの設定 */ transform: scale(1); transition: .5s ease-in-out; -webkit-transform-origin: top right; transform-origin: top right; } .baseH:hover .effectH-scale{ /* マウスオーバー時の設定 */ transform: scale(0); }倍率変更の基準点は
transform-origin
プロパティに指定します。何も指定しなければ画像の中央が基準点になります。
ベンダープレフィックスはAndroid用です(以下同じ)。
<div class="baseH sample-image-01"> <div class="coverH sample-image-02 effectH-scale"></div> </div>
effectH-rotateX
画像が転倒します。
画像が奥に向かって倒れているように見せるため、
pers-600
というクラスを作り、親要素に設定しています。これが無いと奥行き感が出ず、単に縦方向に縮んでいるように見えてしまいます。
.effectH-rotateX{ /* 回転角を変更するエフェクトの設定 */ transform: rotateX(0); transition: .5s ease-in-out; -webkit-transform-origin: bottom; transform-origin: bottom; } .baseH:hover .effectH-rotateX{ /* マウスオーバー時の設定 */ transform: rotateX(90deg); } .pers-600{ /* パース効果の設定 */ -webkit-perspective: 600px; perspective: 600px; -webkit-perspective-origin: bottom; perspective-origin: bottom; overflow: visible!important; backface-visibility: hidden; }変形の基準点
transform-origin
と消失点perspective-origin
を一致させておかないと、倒れてもアオリが見えてしまうので注意。overflow: visible
は、傾斜角度がマイナスの時(手前に倒れる)の指定、更に-90deg より絶対値を大きくする場合は、backface-visibility
プロパティで画像の背面を見せるかどうかを指定します。
<div class="baseH sample-image-01 pers-600"> <div class="coverH sample-image-02 effectH-rotateX"></div> </div>親要素に遠近感を出すクラス
pers-600
が追加されている点に留意して下さい。
以上はCSSで実現できるホバーエフェクトのほんの一部です。
これからもちょこちょこ仕込んでいきたいです。
コメント
コメント一覧 (5)
こういう技術には疎いですが、今回の例では2枚目をずらして重ねたり画像の脇に印をつけたりと、何かあると一目で分かるようにするのも一つの手かもしれませんね。
それにしても、このシーンは何度見ても尊い…
私は過去にHPを作ったことがあります、アイコンやボタンに
ポインタを乗せるとアイコンがピカッと光ったり、ボタンが
ブルブル震えるような仕掛けを作ったけど・・
そんな小技で喜んでいた自分が恥ずかしくなるほどの
スゴ技がこの「一萬人の麓路」には仕込んでありますね。
完全に職人芸・プロの技だなーと思っています。
※1様
スマホですか!
※2 K@DS様
目立たないアイコンなんかを端っこにつけておきたいと思っていましたが、どんなデザインがいいか思いつかなくて…何か思いついたらしれっとつけておきたいです。
以前、このシーンをアニメ化したファンアート?を紹介して下さいましたね。いい…
※3 咲が好きなオヤジ様
私、ネット歴まだ三年チョイなんですが、時々たどり着く老舗のHPの中には手作り感のある工夫がこらしてあるサイトがたまにあって、とても面白いと思います。
そういうのを見ると、ちょっとした仕掛けを作るにも昔の方が技術が要ったと思います。
今はコード自体は標準化されて簡単になっているし、スゴ技なんてとんでもないですよ…
このテクニック凄いです ^^
でもそのまま真似させてもらったら、スマホから見ると画像の右側がちょちょ切れてしまうんです (T^T)クゥー
私のはWordPressってので、レスポンシブとかで、それが原因みたいなんですけど、スマホからでも画面に収まるようにするにはどうやったらいいんでしょうか?
いろいろ自分でCSS弄くってみたんですけど、全然だめなんです。
どうか、お助けください。