複数のtransform×transitionでつくるCSSスライダーアニメーション3選【未経験でもOK】

今回はCSSだけで作るスライダーアニメーションを3つご紹介します。filterプロパティの応用transform:translateの移動エフェクト、skewの傾斜エフェクト、scaleの拡大エフェクト、rotateの回転エフェクトで変化前後のスタイルを調整しtransitionで滑らかにスライドするアニメーションになります。
複数のtransformプロパティを使っているのでかなり動きのあるアニメーションとなっています。
htmlとcssだけしか使っていません。
コードの説明や実際の動きも詳しくまとめてみたので自由にお使いください。

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

 

1. 【transform:translateX、skew、rotateZ&transition】CSSスライダーアニメーション

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

コードを見る
<div class="container">
  <div class="around-slider">
    <ul class="slider">
        <li>
            <input type="radio" id="image1" name="image" checked>
            <label for="image1"></label>
            <img src="https://images.unsplash.com/photo-1531913764164-f85c52e6e654?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1266&q=80" alt="image 1" style="width: 25em;height: 18.75em">
        </li>
        <li>
            <input type="radio" id="image2" name="image">
            <label for="image2"></label>
            <img src="https://images.unsplash.com/photo-1549834185-bd9f078a5dfe?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1650&q=80" alt="image 2" style="width: 25em;height: 18.75em">
        </li>
        <li>
            <input type="radio" id="image3" name="image">
            <label for="image3"></label>
            <img src="https://images.unsplash.com/photo-1542209784-f9702e6ade53?ixlib=rb-1.2.1&auto=format&fit=crop&w=2120&q=80" alt="image 3" style="width: 25em;height: 18.75em">
        </li>
        <li>
            <input type="radio" id="image4" name="image">
            <label for="image4"></label>
            <img src="https://images.unsplash.com/photo-1523895665936-7bfe172b757d?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=2850&q=80" alt="image 4" style="width: 25em;height: 18.75em">
        </li>
    </ul>
  </div>
</div>
.container {
  /* flexboxでcontainerの中身をど真ん中に設置 */
  display: flex;
  justify-content: center;
  align-items: center;
}
/* 額縁外側 */
.around-slider {
  background-color: #572500;
  width: 28em;
  height: 23em;
  display: block;
  top: 30%;
  position: absolute;
  border-radius: .2em;
  /* 額縁外の影 */
  box-shadow: 0 3px 10px 5px rgba(0,0,0,0.4);
}
.slider {
  display: block;
  /* スライダーの額縁内の位置指定 */
  top: 4%;
  left: 3.5%;
  background-color: #fff;
  height: 21em;
  width: 26em;
  padding: 0;
  margin: 0;
  position: absolute;
  /* .sliderに収まらない要素を隠すように指定 */
  overflow: hidden;
  border: 20px solid rgb(255, 211, 179);
  /* 内側の影を指定 */
  box-shadow: 0 2px 1px hsla(0,0%,0%,.4),
              0 -1px 1px 2px hsla(0,0%,0%,.5);
}
/* スライダー*/
.slider li {
  list-style:none;
  position: absolute;
}
.slider input {
  display: none;
}
/* スライダーナビゲーションボタン */
.slider label {
  background-color: #000000;
  border-radius: 100%;
  cursor: pointer;
  display: block;
  height: 1.0em;
  width: 1.0em;
  /* ボタンの位置を指定 */
  left: 12em;
  bottom: .5em;
  position: absolute;
  /* hover後にボタンが現れる速度を調整 */
  transition: .25s;
  z-index: 100;
  box-shadow: 0px 1px 5px 1px #fff;
}
.slider input:checked + label {
  /* クリックしたときのボタンの色を指定 */
  background-color: #fff;
}
.slider:hover li:nth-child(1) label {
  /* 1つ目のボタンの位置を指定 */
  left: 9.5em;
}
.slider:hover li:nth-child(2) label {
  /* 2つ目のボタンの位置を指定 */
  left: 11em;
}
.slider:hover li:nth-child(3) label {
  /* 3つ目のボタンの位置を指定 */
  left: 12.5em;
}
.slider:hover li:nth-child(4) label {
  /* 4つ目のボタンの位置を指定 */
  left: 14em;
}
/* 額内の写真 */
.slider img {
  opacity: 0;
  /* アニメーションの速度調整 */
  transition: 1.5s;
  filter: brightness(0%) saturate(0%) contrast(0%);
  /* 変化前の明るさ・彩度・コントラストの指定 */
  transform:translateX(200px) skew(30deg) rotate(30deg);
  /* X軸の移動距離、Z軸の傾斜角度、Z軸の回転角度を指定 */
}
.slider li input:checked ~ img {
  /* ボタンで選択後のスタイル指定 */
  opacity: 1;
  z-index: 10;
  filter: brightness(110%) saturate(210%) contrast(115%);
  /* 変化後の明るさ・彩度・コントラストの指定 */
  transform:translateX(0px) skew(0deg) rotate(0deg)
  /* X軸の移動距離、Z軸の傾斜角度、Z軸の回転角度を指定 */
}
ここがポイント!
  1. flexboxでcontainerの中身をど真ん中に設置
  2. .around-sliderで外側の額縁・.sliderで内側の額縁を指定
  3. スライダーのナビゲーションボタンを設置しボタンを押すと画像がスライドするように指定する
  4. .slider imgの変化前にopacityで不透明度、filter: brightness() saturate() contrast()で明るさ・彩度・コントラストを各々調整(filterの使い方については【filter完全網羅】hoverでボタンが動き出す!filterを網羅できるCSSボタンアニメーション15選)
  5. .slider imgの変化後も同じく調整
  6. hoverするとtransform:translateX、skew、rotateでX軸の移動距離、Z軸の傾斜角度、Z軸の回転角度を指定したスライダーのマテリアルデザイン(transformの使い方については【transform完全網羅】hoverで動き出す!transformを網羅できるCSSボタンアニメーション16選)
  7. transitionプロパティを指定して開始から終了までの自然なアニメーションを実現

 

2. 【transform:translateY、scaleY&transition】CSSスライダーアニメーション

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

コードを見る
<div class="container">
  <div class="around-slider">
    <ul class="slider">
        <li>
            <input type="radio" id="image1" name="image" checked>
            <label for="image1"></label>
            <img src="https://images.unsplash.com/photo-1531913764164-f85c52e6e654?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1266&q=80" alt="image 1" style="width: 25em;height: 18.75em">
        </li>
        <li>
            <input type="radio" id="image2" name="image">
            <label for="image2"></label>
            <img src="https://images.unsplash.com/photo-1549834185-bd9f078a5dfe?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1650&q=80" alt="image 2" style="width: 25em;height: 18.75em">
        </li>
        <li>
            <input type="radio" id="image3" name="image">
            <label for="image3"></label>
            <img src="https://images.unsplash.com/photo-1542209784-f9702e6ade53?ixlib=rb-1.2.1&auto=format&fit=crop&w=2120&q=80" alt="image 3" style="width: 25em;height: 18.75em">
        </li>
        <li>
            <input type="radio" id="image4" name="image">
            <label for="image4"></label>
            <img src="https://images.unsplash.com/photo-1523895665936-7bfe172b757d?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=2850&q=80" alt="image 4" style="width: 25em;height: 18.75em">
        </li>
    </ul>
  </div>
</div>
.container {
  /* flexboxでcontainerの中身をど真ん中に設置 */
  display: flex;
  justify-content: center;
  align-items: center;
}
/* 額縁外側 */
.around-slider {
  background-color: #572500;
  width: 28em;
  height: 23em;
  display: block;
  top: 30%;
  position: absolute;
  border-radius: .2em;
  /* 額縁外の影 */
  box-shadow: 0 3px 10px 5px rgba(0,0,0,0.4);
}
.slider {
  display: block;
  /* スライダーの額縁内の位置指定 */
  top: 4%;
  left: 3.5%;
  background-color: #fff;
  height: 21em;
  width: 26em;
  padding: 0;
  margin: 0;
  position: absolute;
  /* .sliderに収まらない要素を隠すように指定 */
  overflow: hidden;
  border: 20px solid rgb(255, 211, 179);
  /* 内側の影を指定 */
  box-shadow: 0 2px 1px hsla(0,0%,0%,.4),
              0 -1px 1px 2px hsla(0,0%,0%,.5);
}
/* スライダー*/
.slider li {
  list-style:none;
  position: absolute;
}
.slider input {
  display: none;
}
/* スライダーナビゲーションボタン */
.slider label {
  background-color: #000000;
  border-radius: 100%;
  cursor: pointer;
  display: block;
  height: 1.0em;
  width: 1.0em;
  /* ボタンの位置を指定 */
  left: 12em;
  bottom: .5em;
  position: absolute;
  /* hover後にボタンが現れる速度を調整 */
  transition: .25s;
  z-index: 100;
  box-shadow: 0px 1px 5px 1px #fff;
}
.slider input:checked + label {
  /* クリックしたときのボタンの色を指定 */
  background-color: #fff;
}
.slider:hover li:nth-child(1) label {
  /* 1つ目のボタンの位置を指定 */
  left: 9.5em;
}
.slider:hover li:nth-child(2) label {
  /* 2つ目のボタンの位置を指定 */
  left: 11em;
}
.slider:hover li:nth-child(3) label {
  /* 3つ目のボタンの位置を指定 */
  left: 12.5em;
}
.slider:hover li:nth-child(4) label {
  /* 4つ目のボタンの位置を指定 */
  left: 14em;
}
/* 額内の写真 */
.slider img {
  opacity: 0;
  /* アニメーションの速度調整 */
  transition: 2.0s;
  filter: brightness(0%) saturate(0%) contrast(0%);
  /* 変化前の明るさ・彩度・コントラストの指定 */
  transform:translateY(-350px) scaleY(-1);
  /* Y軸の移動距離とY軸の伸縮率を指定 */
}
.slider li input:checked ~ img {
  /* ボタンで選択後のスタイル指定 */
  opacity: 1;
  z-index: 10;
  filter: brightness(110%) saturate(210%) contrast(115%);
  /* 変化後の明るさ・彩度・コントラストの指定 */
  transform:translateY(0px) scaleY(1);
  /* Y軸の移動距離とY軸の伸縮率を指定 */
}
ここがポイント!
  1. flexboxでcontainerの中身をど真ん中に設置
  2. .around-sliderで外側の額縁・.sliderで内側の額縁を指定
  3. スライダーのナビゲーションボタンを設置しボタンを押すと画像がスライドするように指定する
  4. .slider imgの変化前にopacityで不透明度、filter: brightness() saturate() contrast()で明るさ・彩度・コントラストを各々調整(filterの使い方については【filter完全網羅】hoverでボタンが動き出す!filterを網羅できるCSSボタンアニメーション15選)
  5. .slider imgの変化後も同じく調整
  6. hoverするとtransform:translateY、scaleYでY軸の移動距離とY軸の伸縮率を指定したスライダーのマテリアルデザイン(transformの使い方については【transform完全網羅】hoverで動き出す!transformを網羅できるCSSボタンアニメーション16選)
  7. transitionプロパティを指定して開始から終了までの自然なアニメーションを実現

 

3. 【transform:translate、skewX、rotate、scale&transition】CSSスライダーアニメーション

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

コードを見る
<div class="container">
  <div class="around-slider">
    <ul class="slider">
        <li>
            <input type="radio" id="image1" name="image" checked>
            <label for="image1"></label>
            <img src="https://images.unsplash.com/photo-1531913764164-f85c52e6e654?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1266&q=80" alt="image 1" style="width: 25em;height: 18.75em">
        </li>
        <li>
            <input type="radio" id="image2" name="image">
            <label for="image2"></label>
            <img src="https://images.unsplash.com/photo-1549834185-bd9f078a5dfe?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1650&q=80" alt="image 2" style="width: 25em;height: 18.75em">
        </li>
        <li>
            <input type="radio" id="image3" name="image">
            <label for="image3"></label>
            <img src="https://images.unsplash.com/photo-1542209784-f9702e6ade53?ixlib=rb-1.2.1&auto=format&fit=crop&w=2120&q=80" alt="image 3" style="width: 25em;height: 18.75em">
        </li>
        <li>
            <input type="radio" id="image4" name="image">
            <label for="image4"></label>
            <img src="https://images.unsplash.com/photo-1523895665936-7bfe172b757d?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=2850&q=80" alt="image 4" style="width: 25em;height: 18.75em">
        </li>
    </ul>
  </div>
</div>
.container {
  /* flexboxでcontainerの中身をど真ん中に設置 */
  display: flex;
  justify-content: center;
  align-items: center;
}
/* 額縁外側 */
.around-slider {
  background-color: #572500;
  width: 28em;
  height: 23em;
  display: block;
  top: 30%;
  position: absolute;
  border-radius: .2em;
  /* 額縁外の影 */
  box-shadow: 0 3px 10px 5px rgba(0,0,0,0.4);
}
.slider {
  display: block;
  /* スライダーの額縁内の位置指定 */
  top: 4%;
  left: 3.5%;
  background-color: #fff;
  height: 21em;
  width: 26em;
  padding: 0;
  margin: 0;
  position: absolute;
  /* .sliderに収まらない要素を隠すように指定 */
  overflow: hidden;
  border: 20px solid rgb(255, 211, 179);
  /* 内側の影を指定 */
  box-shadow: 0 2px 1px hsla(0,0%,0%,.4),
              0 -1px 1px 2px hsla(0,0%,0%,.5);
}
/* スライダー*/
.slider li {
  list-style:none;
  position: absolute;
}
.slider input {
  display: none;
}
/* スライダーナビゲーションボタン */
.slider label {
  background-color: #000000;
  border-radius: 100%;
  cursor: pointer;
  display: block;
  height: 1.0em;
  width: 1.0em;
  /* ボタンの位置を指定 */
  left: 12em;
  bottom: .5em;
  position: absolute;
  /* hover後にボタンが現れる速度を調整 */
  transition: .25s;
  z-index: 100;
  box-shadow: 0px 1px 5px 1px #fff;
}
.slider input:checked + label {
  /* クリックしたときのボタンの色を指定 */
  background-color: #fff;
}
.slider:hover li:nth-child(1) label {
  /* 1つ目のボタンの位置を指定 */
  left: 9.5em;
}
.slider:hover li:nth-child(2) label {
  /* 2つ目のボタンの位置を指定 */
  left: 11em;
}
.slider:hover li:nth-child(3) label {
  /* 3つ目のボタンの位置を指定 */
  left: 12.5em;
}
.slider:hover li:nth-child(4) label {
  /* 4つ目のボタンの位置を指定 */
  left: 14em;
}
/* 額内の写真 */
.slider img {
  opacity: 0;
  /* アニメーションの速度調整 */
  transition: 2.0s;
  filter: brightness(0%) saturate(0%) contrast(0%);
  /* 変化前の明るさ・彩度・コントラストの指定 */
  transform:translate(-500px,-300px) skewX(60deg) rotate(540deg) scale(-1);
  /* XY軸の移動距離、X軸の傾斜角度、Z軸の回転角度、伸縮率を指定 */
}
.slider li input:checked ~ img {
  /* ボタンで選択後のスタイル指定 */
  opacity: 1;
  z-index: 10;
  filter: brightness(110%) saturate(210%) contrast(115%);
  /* 変化後の明るさ・彩度・コントラストの指定 */
  transform:translate(0px,0px) skewX(0deg) rotate(0deg) scale(1);
  /* XY軸の移動距離、X軸の傾斜角度、Z軸の回転角度、伸縮率を指定 */
}
ここがポイント!
  1. flexboxでcontainerの中身をど真ん中に設置
  2. .around-sliderで外側の額縁・.sliderで内側の額縁を指定
  3. スライダーのナビゲーションボタンを設置しボタンを押すと画像がスライドするように指定する
  4. .slider imgの変化前にopacityで不透明度、filter: brightness() saturate() contrast()で明るさ・彩度・コントラストを各々調整(filterの使い方については【filter完全網羅】hoverでボタンが動き出す!filterを網羅できるCSSボタンアニメーション15選)
  5. .slider imgの変化後も同じく調整
  6. hoverするとtransform:translate、skewX、rotate、scaleでXY軸の移動距離、X軸の傾斜角度、Z軸の回転角度、伸縮率を指定した贅沢なスライダーのマテリアルデザイン(transformの使い方については【transform完全網羅】hoverで動き出す!transformを網羅できるCSSボタンアニメーション16選)
  7. transitionプロパティを指定して開始から終了までの自然なアニメーションを実現

【初心者向け】失敗しないプログラミングTIPS

そもそもWebデザインの基礎がわからない。。
そんなあなたには『Udemy』

ふたご


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

ふたご

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

 

   話だけ聞いてみる