レスポンシブ対応版!cssのみのスライドショー
当サイトで以前紹介したcssのみのスライドショーをサイトの調整のときに見てみたら少し改善できそうだったので改善したコードを書き残しておきます。
動画化もしてみました
そうしても高さ固定がいいって場合はリンクから
以前の記事の問題点
以前の記事内でも書いてありますが、下記コードの4行目で高さを固定してしまっているため幅は可変しますが高さが可変しません。
表示画面幅によって画像の上下が隠れたり、上下に隙間ができたりと問題が発生します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
.slide { position: relative; width: 100%; height: 400px; overflow: hidden; } .slide img { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 100%; height: auto; } |
一応確認用のデモページを作成しましたので表示領域を変化させながら確認してみるといいでしょう。
高さを可変させればかんたんですが、紹介しているコードだと『position: absolute;』を中に入っているimg要素に対して行っているので内包した要素の高さは0扱いになり、絶対値による指定しかできない形になってしまっています。
heightプロパティに%を使って指定を試しても高さ0に対しての相対指定になるので結局高さは出てくれません。
paddingを使って高さを出す
高さの指定を%できないのであればpaddingを使って高さを出してしまおうという考え。
この方法は画像サイズによって計算が必要になり、指定する値が変わるのでちょっと難易度は高くなりますがそこまで難しくはありません。
ここでは800(横幅)×500(高さ)のサイズで解説していきます
計算方法
以前の記事でyoutubeなどのiframeを使った埋め込みコンテンツをレスポンシブ対応させる時に高さをpaddingで出す方法を紹介しました。
この方法を応用すれば今まで紹介していた高さの可変ができないスライドショーがきっちりと可変するようになります。
今回使う画像のサイズはアスペクト比が8:5なので
計算式にすると5 ÷ 8 × 100 = 62.5%となります。
高さの代わりに「padding-top」か「padding-bottom」で要素の内側に余白をつけるだけになります
計算用のツールも用意してありますので詳しくは下のリンクから確認お願いします。
コピペ用のコード
あとは使う画像サイズによって都度計算していただき、指定すれば大丈夫です。
今回紹介した画像の場合のデモページとコードも残しておきますので調整して使っていただければと思います。
画像サイズがバラバラの場合はすべて同じサイズに画像自体を調整するか、小さいものに合わせていただくといいと思います。
1 2 3 4 5 |
<div class="slide"> <img src="https://weblasts.com/wp-content/uploads/2021/03/food1.jpg" alt=""> <img src="https://weblasts.com/wp-content/uploads/2021/03/food2.jpg" alt=""> <img src="https://weblasts.com/wp-content/uploads/2021/03/food3.jpg" alt=""> </div> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
.slide { position: relative; width: 100%; padding-top: 62.5%; overflow: hidden; background-color: #c6c6c6; } @keyframes slideshow { 0% { opacity: 0; } 10% { opacity: 1; } 28% { opacity: 1 } 38% { opacity: 0; } 100% { opacity: 0; } } .slide img { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 100%; height: auto; opacity: 0; animation: slideshow 24s linear infinite; } .slide img:nth-child(2) { animation-delay: 8s; } .slide img:last-child { animation-delay: 16s; } |
以上おしまい
他のスライドショーもこの方法で高さの可変ができますよ