hoverで画像が鏡みたいに反射!position:absoluteとfilter多用でCSSアニメーション3選

今回はposition:absoluteとfilter多用で画像に「鏡面反射エフェクト」を効かせて特殊な影を作りtransitionで滑らかなアニメーションを実装してみました。
filter: blur、saturate、brightness、grayscale、opacityをアニメーションで使用しているので「フィルターエフェクト」もしっかりと確認できます。

htmlとcssだけしか使っていません。
コードの説明や実際の動きも詳しくまとめてみたので自由にお使いください。

こちらのデザイン・コードはすべて完全オリジナルなのでコピペ大歓迎です。

 

 

1. 画像が反射してオシャレな影が現れるhoverエフェクト

動きは下の画像のような感じになります

コードを見る
<div class="bg-image">
  <div class="image img-url">
  </div>
</div>
.image {
  position: relative;
  display: inline-block;
  width: 250px;
  height: 200px;
  background-size: contain;
  background-repeat: no-repeat;
  cursor: pointer;
  transform: scaleY(1);
  /* 伸び縮みする度合いを指定 */
  filter: saturate(150%);
  /* filterプロパティで彩度を指定 */
}
.bg-image {
  margin: 0 auto;
  width: 250px;
  height: 200px;
}
.image::before,
.image::after {
  transform: scaleY(-1);
  /* 伸び縮みする度合い(伸縮度)を指定 */
  transform: skewX(20deg);
  /* 傾きの角度(傾斜角度)を指定 */
  filter: blur(3px);
  /* filterプロパティでぼかしの度合いを指定 */
}
.image::after {
  content: '';
  background-image: inherit;
  background-repeat: no-repeat;
  background-position: bottom;
  background-size: cover;
  width: inherit;
  height: 55%;
  position: absolute;
  /* 親要素との絶対的な位置を指定 */
  bottom: -40%;
  margin-left: -105px;
  opacity: 0;
  transition-duration: 1s;
  /* アニメーションの開始から終了までの時間を指定 */
}
.image:hover::after {
  /* hover後の変化 */
  opacity: 1;
}
.image::before {
  content: '';
  width: inherit;
  height: 60%;
  position: absolute;
  /* 親要素との絶対的な位置を指定 */
  bottom: -44%;
  background: linear-gradient(to bottom, rgba(255, 255, 255, .9),rgba(255, 255, 255, .1));
  z-index: 1;
  /* ボックスの重なる順番を指定 */
  margin-left: -104px;
  opacity: 0;
  transition-duration: 1s;
  /* アニメーションの開始から終了までの時間を指定 */
}
.image:hover::before {
  /* hover後の変化 */
  opacity: 1;
}
.img-url {
  background-image: url(https://images.unsplash.com/photo-1477089884677-c596568bd120?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1650&q=80);
}
ここがポイント!
  1. filterプロパティのblurとsaturateを使い分け、ぼかしと彩度を調整
  2. transform: scale、skewを使い分け、影の傾きや伸縮を再現
  3. transition-durationプロパティを指定して開始から終了までの自然なアニメーションを実現
  4. position: absoluteで親要素との絶対的な位置を指定したことで影を自然な位置に固定

 

2. filter加工した画像が反射して立体的な影が現れるhoverエフェクト 

動きは下の画像のような感じになります

コードを見る
<div class="bg-image">
  <div class="image img-url">
  </div>
</div>
.image {
  position: relative;
  display: inline-block;
  width: 350px;
  height: 350px;
  background-size: contain;
  background-repeat: no-repeat;
  cursor: pointer;
  filter: saturate(100%) brightness(100%) grayscale(1) opacity(.8);
  /* filterプロパティで左から彩度、明度、モノクロ度、透明度を指定 */
  transform: scaleY(1);
  /* 伸び縮みする度合いを指定 */
  transition-duration:1s;
  /* アニメーションの開始から終了までの時間を指定 */
}
.bg-image {
  margin: 0 auto;
  width: 350px;
  height: 350px;
  filter: blur(3px);
  /* filterプロパティでぼかしの度合いを指定 */
  transition-duration:1s;
  /* アニメーションの開始から終了までの時間を指定 */
}
.bg-image:hover {
  /* hover後の変化 */
  filter: blur(0px);
  /* filterプロパティでぼかしの度合いを指定 */
}
.image:hover {
  /* hover後の変化 */
  filter: saturate(200%) brightness(135%) grayscale(0) opacity(1);
  /* filterプロパティで左から彩度、明度、モノクロ度、透明度を指定 */
}
.image::before,
.image::after {
  transform: scaleY(-1);
  /* 伸び縮みする度合いを指定 */
  transform: skewX(-20deg);
  /* 傾きの角度(傾斜角度)を指定 */
  filter: blur(3px);
  /* filterプロパティでぼかしの度合いを指定 */
}
.image::after {
  content: '';
  background-image: inherit;
  background-repeat: no-repeat;
  background-position: bottom;
  background-size: cover;
  width: inherit;
  height: 55%;
  position: absolute;
  /* 親要素との絶対的な位置を指定 */
  bottom: -5%;
  margin-left: -210px;
  filter: saturate(50%) brightness(40%);
  /* filterプロパティで左から彩度、明度を指定 */
  filter: blur(3px);
  /* filterプロパティでぼかしの度合いを指定 */
  opacity: 0;
  transition-duration:1s;
  /* アニメーションの開始から終了までの時間を指定 */
}
.image:hover::after {
  /* hover後の変化 */
  opacity: 1;
}
.image::before {
  content: '';
  width: inherit;
  height: 55%;
  position: absolute;
  /* 親要素との絶対的な位置を指定 */
  bottom: -5%;
  background: linear-gradient(to bottom, rgba(255, 255, 255, .3),rgba(255, 255, 255, .1));
  z-index: 1;
  /* ボックスの重なる順番を指定 */
  margin-left: -210.5px;
  opacity: 0;
  transition-duration:1s;
  /* アニメーションの開始から終了までの時間を指定 */
}
.image:hover::before {
  /* hover後の変化 */
  opacity: 1;
}
.img-url {
  background-image: url(https://images.unsplash.com/photo-1522694013927-350c454fa94b?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=2829&q=80);
}
ここがポイント!
  1. filterプロパティのblur、saturate、brightness、grayscale、opacityを使い分け、ぼかし、彩度、明度、モノクロ度、透明度を調整して画像の存在感を強調
  2. transform: scale、skewを使い分け、影の傾きや伸縮を再現
  3. transition-durationプロパティを指定して開始から終了までの自然なアニメーションを実現
  4. position: absoluteで親要素との絶対的な位置を指定したことで影を自然な位置に固定
  5. 影の長さをheightで調整してよりカッコいいデザインを実現

 

3. 画像が反射してできた影が自然に動くhoverアニメーション

動きは下の画像のような感じになります

コードを見る
<div class="bg-image">
  <div class="image img-url">
  </div>
</div>
.image {
  position: relative;
  display: inline-block;
  width: 250px;
  height: 200px;
  background-size: contain;
  background-repeat: no-repeat;
  cursor: pointer;
  transform: scaleY(1);
  /* 伸び縮みする度合いを指定 */
  filter: grayscale(0) opacity(1) saturate(180%)brightness(120%);
  /* filterプロパティで左からモノクロ度、透明度、彩度、明度を指定 */
}
.bg-image {
  margin: 0 auto;
  width: 250px;
  height: 200px;
}
.image::before,
.image::after {
  transform: scaleY(-1);
  /* 伸び縮みする度合いを指定 */
  transform: skewX(-50deg);
  /* 傾きの角度(傾斜角度)を指定 */
  transition-duration:1s;
  /* アニメーションの開始から終了までの時間を指定 */
}
.image::after {
  content: '';
  background-image: inherit;
  background-repeat: no-repeat;
  background-position: bottom;
  background-size: cover;
  width: inherit;
  height: 75%;
  position: absolute;
  /* 親要素との絶対的な位置を指定 */
  bottom: -80%;
  margin-left: -215px;
  filter: saturate(100%);
  /* filterプロパティで彩度を指定 */
}
.image::before {
  content: '';
  width: inherit;
  height: 75%;
  position: absolute;
  /* 親要素との絶対的な位置を指定 */
  bottom: -80%;
  background: linear-gradient(to bottom, rgba(255, 255, 255, .5),rgba(255, 255, 255, .1));
  z-index: 1;
  /* ボックスの重なる順番を指定 */
  margin-left: -215.5px;
}
.image:hover::before,
.image:hover::after {
  /* hover後の変化 */
  transform: scaleY(-1);
  /* 伸び縮みする度合いを指定 */
  transform: skewX(50deg);
  /* 傾きの角度(傾斜角度)を指定 */
}
.image:hover::after {
  /* hover後の変化 */
  content: '';
  background-image: inherit;
  background-repeat: no-repeat;
  background-position: bottom;
  background-size: cover;
  width: inherit;
  height: 75%;
  position: absolute;
  /* 親要素との絶対的な位置を指定 */
  bottom: -80%;
  margin-left: -35px;
  filter: saturate(100%);
  /* filterプロパティで彩度を指定 */
}
.image:hover::before {
  /* hover後の変化 */
  content: '';
  width: inherit;
  height: 75%;
  position: absolute;
  /* 親要素との絶対的な位置を指定 */
  bottom: -80%;
  background: linear-gradient(to bottom, rgba(255, 255, 255, .5),rgba(255, 255, 255, .0));
  z-index: 1;
  /* ボックスの重なる順番を指定 */
  margin-left: -35.5px;
}
.img-url {
  background-image: url(https://images.unsplash.com/photo-1516222338250-863216ce01ea?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1567&q=80);
}
ここがポイント!
  1. filterプロパティのsaturate、brightness、grayscale、opacityを使い分け、彩度、明度、モノクロ度、透明度を調整して画像の存在感を強調
  2. transform: scale、skewを使い分け、影の傾きや伸縮を再現
  3. transition-durationプロパティを指定して開始から終了までの自然なアニメーションを実現
  4. hover前後で影の位置、傾斜角度、伸縮度を変えてアニメーションらしさを強調
  5. position: absoluteで親要素との絶対的な位置を指定したことで影を自然な位置に固定

参考

そもそもWebデザインの基礎がわからない。。
そんなあなたにはこれ!

ふたご


でもなあ、独学だと心配だしプログラミングスクールで学びたい!。かといってお金はかけたくないし。。
そんなあなたにはこれ!

ふたご

完全無料で一人前のエンジニアになれるプログラミングスクールあります
  1. プログラミング学習&サポートが無料!
  2. 誰もが知っている超優良企業への就職サポート付き!
  3. 学習言語:Java、PHP、HTML、CSSなど

 

   話だけ聞いてみる