💩
【Rails】slickでスライドショーを作成する
画像をスライドショーで表示したい!
イメージはこんな感じです。
GIFが乗りませんでしたので、画像で、、、。
絵の癖が強いのは気にしないでください。
画像が一定の間隔で流れていくイメージです。
自動で動いていきます。
そこで、slick
というライブラリをCDN
で読み込み、実装することとします。
実装
slick
の読込
slick
をCDN
で読み込みます。
views/application.html.erb
...
<!-- slick -->
<!-- Add the slick-theme.css if you want default styling -->
<link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.css"/>
<!-- Add the slick-theme.css if you want default styling -->
<link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick-theme.css"/>
</head>
...
...
<script type="text/javascript" src="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js"></script>
</body>
ビューを記述
今回は、人気画像をスライドショーにて表示したいので、@boards
表示を以下のようにします。
以下のようにslider
クラスを付与します。
これは、のちにJSで操作するためのものです。
views/top/index.html.erb
<!-- sliderクラスはJSでの操作を適応するため -->
<div class="slider">
<% @boards.each do |board| %>
<p><%= image_tag board.board_image.url, class: 'slider-item rounded' %></p>
<% end %>
</div>
JavaScript
を記述する。
こちらにさまざまなバリエーションが載っておりますので、参考にしてください。
javascript/src/slider.js
$(window).on('load resize', function(){
var wid = window.innerWidth;
if (wid >= 800) {
$(document).ready(function(){
$('.slider').slick({
centerMode: true,
slidesToShow: 3,
arrows: false,
autoplay: true,
autoplaySpeed: 1500,
speed: 700,
});
});
}
else {
$(document).ready(function(){
$('.slider').slick({
autoplay: true,
autoplaySpeed: 1500,
speed: 700,
});
});
}
});
'data-turbolinks': false
を追記
このままではページ遷移した時に、スライドショーが動かない場合があります。
turbolinks
に原因がある場合があります。
以下のように追記します。
views/application.html.erb
<!-- 'data-turbolinks': false追記 -->
<%= link_to 'Top', root_path, class: 'nav-link', 'data-turbolinks': false %>
※リロードしないとJSが効かない場合
※「リロードしないとJSが動かない!」という場合、以下で解決することが多いです。
-
ターボリンクスが影響している
上記記載 -
ページ読み込み前にJSが実行されてしまっている。
検証ツールのconsole
でエラーが出ていることが多いです。
// ページの読込が完了してから実行するようにする
window.addEventListener('load', () => {
...
});
Discussion