営業ナシでWeb制作案件が舞い込んでくる”新世代”戦略 ▶︎

【position:absolute×filter】hoverで画像が反射する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で親要素との絶対的な位置を指定したことで影を自然な位置に固定


まとめ

HTMLとCSSを使うと今回紹介したようなことも簡単にできてしまうんです。

 

『CSSアニメーションやエフェクトだけではなくWebサイトをゼロから作って稼いでいきたい』

『3ヶ月くらいで最低でも月10万円は稼ぎたい』

『営業とかやったことないけどWeb制作だけで稼いでいきたい』

 

こんな方のためにWeb制作で月80万超稼ぐ筆者が自身の経験を踏まえて【失敗しない】Webデザイナー(Web制作)独学ロードマップを執筆しました。

 

少額の投資で3ヶ月後には月10〜30万稼げるよう設計してあります。
(学習教材やAdobeなど最低限のコストはかかります)

 

ロードマップの構成
  1. Web制作に特化した『確実に身に付く』学習方法
  2. Web制作会社が喰いつく理想的なポートフォリオの作成手順
  3. 返信率10%以上!Web制作会社へのメール営業

 

有料公開も考えましたが「Webデザイナー(Web制作)はまだまだ稼げることを証明したい!」という思いが強く、期間限定で無料公開をすることにしました。

 

2021年半ばまでは無料公開する予定ではありますが前倒しすることもあり得ますのでご興味ある方はお早めにどうぞ!