今回も実際の制作からのメモ。
この投稿は備忘録の側面が強いのでslickの使い方に関しては割愛しています。
いつかよく使うオプションと使用サンプルを一緒に紹介します。いつか。
この記事でご紹介するのは、slickのスライドに合わせて他の要素にもアニメーションをつける方法です。
実現できる動作はこちらのdemoページから。(スマホ版は用意していません。ごめんなさい。)
それではコードと解説を。
slickのスライドに合わせて数のカウントと他の要素にアニメーションをつける方法!
各コードポイントとなるところだけピックアップしています。HTMLはこちら。
<div class="per customClass-1">
<ul class="imgList">
<li class="img01"></li>
<li class="img02"></li>
<li class="img03"></li>
</ul>
<ul class="txtList">
<li class="txt01">
<dl>
<dt>1つ目のテキスト</dt>
<dd>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Placeat sapiente nostrum ex odio voluptatibus id rem ratione corrupti, eaque consequatur omnis ea qui, nihil accusantium nulla, nesciunt sequi. Aperiam, alias.</dd>
</dl>
</li>
<li class="txt02">
<dl>
<dt>2つ目のテキスト</dt>
<dd>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Placeat sapiente nostrum ex odio voluptatibus id rem ratione corrupti, eaque consequatur omnis ea qui, nihil accusantium nulla, nesciunt sequi. Aperiam, alias.</dd>
</dl>
</li>
<li class="txt03">
<dl>
<dt>3つ目のテキスト</dt>
<dd>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Placeat sapiente nostrum ex odio voluptatibus id rem ratione corrupti, eaque consequatur omnis ea qui, nihil accusantium nulla, nesciunt sequi. Aperiam, alias.</dd>
</dl>
</li>
</ul>
</div>
HTMLのポイントは.imgListと.txtListを同じ階層に入れておくことと、.per に .customClass-1をあらかじめ入れておくことですね。
ちなみにslickで動かすのは.imgListです。
scssはこちら。見た目を整えるコードはもっとありましたが重要なのはこれくらいのはず。
.per {
.txtList {
position: relative;
li {
position: absolute;
transform: translateY(-50%);
top: 50%;
left: 0;
opacity: 0;
transition: all .3s ease;
}
}
&.customClass-1 {
.txtList {
.txt01 {
opacity: 1;
}
}
}
&.customClass-2 {
.txtList {
.txt02 {
opacity: 1;
}
}
}
&.customClass-3 {
.txtList {
.txt03 {
opacity: 1;
}
}
}
}
今回は.txtListの<li>は同じところで出たり消えたらいしてほしいので、position: absolute;を使って3つとも同じ位置におきます。すべての<li>にopacity: 0;も。
jsはこちら。
$(function () {
$(".imgList").on("init", function (event, slick) {
$(this).append('<div class="slick-num"><span class="now-count"></span> / <span class="all-count"></span></div>');
$(".now-count").text(slick.currentSlide + 1);
$(".all-count").text(slick.slideCount);
})
.slick({
autoplay: false,
slidesToShow: 1,
swipe: true,
arrows: true,
pauseOnFocus: false,
pauseOnHover: false,
variableWidth: true,
})
.on("beforeChange", function (event, slick, currentSlide, nextSlide) {
$(".now-count").text(nextSlide + 1);
// 以前に追加されたカスタムクラスを削除
var sliderParent = $(".imgList").parent();
sliderParent.removeClass(function (index, className) {
return (className.match(/\bcustomClass-\S+/g) || []).join(' ');
});
// スライドに応じて親要素に新しいクラスを追加
var newClass = "customClass-" + (nextSlide + 1);
sliderParent.addClass(newClass);
});
});
$(“.imgList”).on(〜)は枚数のところですね。「今のスライドのナンバー / スライドの合計数」で表示するようになっています。
.on(“beforeChange”, function (event, slick, currentSlide, nextSlide) {〜}); は.imgListのスライドが切り替わるたびに、.perにクラス名「customClass-◯」を追加・削除していく記述です。
scssの&.customClass-◯ {〜} でそれぞれの.txt0◯にopacity: 1;をつけています。
.per に .customClass-1をあらかじめ入れておいたのは、最初はこの記述が起動していないので1つ目の.txt01を表示させておくために入れています。
いかがでしょうか。
クラス名を追加・削除することで、他の要素のアニメーションを起動させているため、比較的汎用性のある記述をご紹介できたかと思います。
もっと上級者の方は別の方法も知っているかもしれませんが、ひとまずはコレでいろいろできるかと。