マンガでわかるホームページ作成

CSSのみスライドショー【選択ボタン付き自動再生】

完成イメージ

CSSのみのスライドショーです。自動再生する上に選択ボタンも付いています。htmlのラジオボタンとCSSを駆使して作成しました。

以下の「選択ボタン付きスライドショー」と「自動再生スライドショー」を組み合わせて作成しています。だいぶ複雑なのでこれらを理解してから手をかけてください。

特徴

  • 自動でスライド
  • 中央下部に選択ボタンを表示し、クリックすると画像が切り替わる。
  • マウスオーバーでスライドストップ
  • 選択ボタンクリックで以降スライドストップ
  • aタグ(画像リンク)あり・なし、どっちでも可
  • 画像を増減するとき再計算し、CSS調整が必要

html

<div class="out">
    <img src="1.jpg">
    <input type=radio name="slide" id="slide1">
    <input type=radio name="slide" id="slide2">
    <input type=radio name="slide" id="slide3">
    <input type=radio name="slide" id="slide4">
    <div class="in">
        <label for="slide1"><span></span><a href="#1"><img src="1.jpg"></a></label>
        <label for="slide2"><span></span><a href="#2"><img src="2.jpg"></a></label>
        <label for="slide3"><span></span><a href="#3"><img src="3.jpg"></a></label>
        <label for="slide4"><span></span><a href="#4"><img src="4.jpg"></a></label>
    </div>
</div>

2行目のimgは高さ確保のためです。高さが決まっていればdivに高さ指定することでこのimgはいらなくなります。

inputとlabelはidとforで一致させます。必ず上から順に一致させましょう。

aタグはあってもなくても、どっちでもOKです。

CSS

.out{
    position: relative;
}
.in img{
    position: absolute;
    top: 0;
    left: 0;
    opacity: 0;
    transition: .5s;
    z-index: 0;
}
img{
    display: block;
    width: 100%;
    height: auto;
}
input{
    display: none;
}
.in{
    display: flex;
    justify-content: center;
}
label span{
    display: block;
    width: 15px;
    height: 15px;
    padding: 7px;
    margin: -40px 0 0;
    border-radius: 100%;
    cursor: pointer;
    position: relative;
    z-index: 2;
}
label span::before{
    content: "";
    display: block;
    width: 100%;
    height: 100%;
    background: #4287f5;
    opacity: 0.5;
    border-radius: 100%;
}            
input:nth-of-type(1):checked ~ .in label:nth-of-type(1) span::before,
input:nth-of-type(2):checked ~ .in label:nth-of-type(2) span::before,
input:nth-of-type(3):checked ~ .in label:nth-of-type(3) span::before,
input:nth-of-type(4):checked ~ .in label:nth-of-type(4) span::before{
    background: #000;
    opacity: 1;
}
label span::before{
    animation: slidebutton 14s infinite;
}
@keyframes slidebutton{
    0%{opacity: 0.5;background: #4287f5;}
    3.5%{opacity: 1;background: #000;}/* b÷x×100=y */
    25%{opacity: 1;background: #000;}/* 100÷c=z */
    28.5%{opacity: 0.5;background: #4287f5;}/* y+z */
}            
label:nth-of-type(2) span::before,label:nth-of-type(2) img{
    animation-delay: 3.5s;
}            
label:nth-of-type(3) span::before,label:nth-of-type(3) img{
    animation-delay: 7s;
}            
label:nth-of-type(4) span::before,label:nth-of-type(4) img{
    animation-delay: 10.5s;
}            
input:nth-of-type(1):checked ~ .in label:nth-of-type(1) img,
input:nth-of-type(2):checked ~ .in label:nth-of-type(2) img,
input:nth-of-type(3):checked ~ .in label:nth-of-type(3) img,
input:nth-of-type(4):checked ~ .in label:nth-of-type(4) img{
    opacity: 1;
    z-index: 1;
}
.in img{
    animation: slide 14s infinite;/* (a+b)×c=x */
    opacity: 0;
}
@keyframes slide{
    0%{opacity: 0;}
    3.5%{opacity: 1;z-index: 1;}/* b÷x×100=y */
    25%{opacity: 1;}/* 100÷c=z */
    28.5%{opacity: 0;z-index: 0;}/* y+z */
}
input:checked ~ .in img,input:checked ~ .in span::before{
    animation: none;
}
.in:hover img,.in:hover span::before{
    animation-play-state:paused;/* マウスを載せると一時停止 */
}

仕組み解説

自動スライドはCSSだけで自動スライドショーの仕組みそのままです。

ボタンをクリックしたときにスライドが切り替わるのはCSSだけで選択スライドショーの仕組みそのままです。

ここで工夫が必要なのは、ボタンをクリックしたときに自動スライドをストップさせることです。

ボタンがクリックされたとき、すべてのスライドアニメーションをストップさせます。

inputがlabelの中にあると他の画像やボタンに影響を与えることができないので、すべてのlabelより前に記述します。

画像を増やすとき

自動スライドの計算方法はCSSだけで自動スライドショーを参照してください。

htmlではinputとlabelの行を追加し、idとforを一致させます。

CSSでは以下を追加します。追加するとき「,」をつけるのをお忘れなく。
input:nth-of-type(x):checked ~ .in label:nth-of-type(x) span::before
input:nth-of-type(x):checked ~ .in label:nth-of-type(x) img
label:nth-of-type(x) span::before,label:nth-of-type(x) img
xには5や6といった半角数字を順番に入れます。

減らすときは上記の部分を削除です。自動スライド時間の調整も必要です。

 

「:nth-of-type」や「:checked」がなんぞや?というかたは以下の記事をご覧ください。セレクタについて説明しています。

まとめ

今回は自動再生かつ選択ボタンつきということで実用性は高いかと思います。

ただし、数値が変わると再計算やCSS、html調整が大変なので、数や時間を固定させて運用するほうが楽だと思います。

以上、CSSだけで選択ボタン付き自動スライドショーを作る方法でした。

関連記事