JavaScriptライブラリの「Swiper」は、スライダーを簡単に設置できるライブラリです。これをベースに、ほんの少しコードを書けば「タブ」のUIと絡めたスライダーを実装することができます。
タブにスライドの動きが加わります。
そんなUIを、Swiperのオプションと少しのコードでできるので、是非参考にしてみてください。
Swiper
Swiperは、スライダー・カルーセルUIの超定番とも言えるJavaScriptのライブラリです。
Swiperは本当に便利です。
Swiperの利用は簡単で、以下3つの方法で利用することができます。
- npmでインストール
- CDNを利用
- ファイルをダウンロードして利用
Swip絵kmは、jQuery不要で動き、オプションも豊富に用意されている為、カスタマイズもしやすいライブラリです。
以下の記事では、このSwiper.jsについて解説していますので以下の記事もあわせてご覧ください。
スライダーの超定番ライブラリSwiper.jsの基本と使い方タブのメニューに連動するスライダー・カルーセルのサンプル
早速サンプルです。
各タブには、リンクカードを模したオブジェクトを2つずつ格納しています。各メニュー部分をクリックすると、表示されるタブのコンテンツ部分が、左右へスライドしながら切り替わって表示されます。
タブUIですが、スライダーUIでもあり・・。両方の機能付きのUIみたいな感じです。
実装の手順と方法
コードの解説の前に、実装の手順と方法について解説します。
はじめにSwiper本体を読み込ませる必要があるので、以下のコードをHTMLの <head>〜</head>
の中に記述しましょう。
<link
rel="stylesheet"
href="https://unpkg.com/swiper@7/swiper-bundle.min.css"
/>
<script src="https://unpkg.com/swiper@7/swiper-bundle.min.js"></script>
この記事では、記述するだけでOKなCDNでの読み込みの場合で進めます。
次に、HTMLの設置したい場所にコードを記述します。
<div class="javaSample">
<div id ="app">
<div class="swiper-container tab-menu">
<ul class="swiper-wrapper">
<li class="swiper-slide">Tab 1</li>
<li class="swiper-slide">Tab 2</li>
<li class="swiper-slide">Tab 3</li>
<li class="swiper-slide">Tab 4</li>
<li class="Tabs__presentation-slider" role="presentation"></li>
</ul>
</div>
<div class="swiper-container tab-content">
<div class="swiper-wrapper">
<div class="swiper-slide">
<article class="card">
<a href="#">
<img src="https://dubdesign.net/wp-content/uploads/2022/02/javatooltip.jpg">
<time>6月19日</time>
<p class="cardTitle">タイトル 1-1</p>
</a>
</article>
<article class="card">
<a href="#">
<img src="https://dubdesign.net/wp-content/uploads/2022/02/javatooltip.jpg">
<time>6月19日</time>
<p class="cardTitle">タイトル 1-2</p>
</a>
</article>
</div>
<div class="swiper-slide">
<article class="card">
<a href="#">
<img src="https://dubdesign.net/wp-content/uploads/2022/02/javatooltip.jpg">
<time>6月19日</time>
<p class="cardTitle">タイトル 2-1</p>
</a>
</article>
<article class="card">
<a href="#">
<img src="https://dubdesign.net/wp-content/uploads/2022/02/javatooltip.jpg">
<time>6月19日</time>
<p class="cardTitle">タイトル 2-2</p>
</a>
</article>
</div>
<div class="swiper-slide">
<article class="card">
<a href="#">
<img src="https://dubdesign.net/wp-content/uploads/2022/02/javatooltip.jpg">
<time>6月19日</time>
<p class="cardTitle">タイトル 3-1</p>
</a>
</article>
<article class="card">
<a href="#">
<img src="https://dubdesign.net/wp-content/uploads/2022/02/javatooltip.jpg">
<time>6月19日</time>
<p class="cardTitle">タイトル 3-2</p>
</a>
</article>
</div>
<div class="swiper-slide">
<article class="card">
<a href="#">
<img src="https://dubdesign.net/wp-content/uploads/2022/02/javatooltip.jpg">
<time>6月19日</time>
<p class="cardTitle">タイトル 4-1</p>
</a>
</article>
<article class="card">
<a href="#">
<img src="https://dubdesign.net/wp-content/uploads/2022/02/javatooltip.jpg">
<time>6月19日</time>
<p class="cardTitle">タイトル 4-2</p>
</a>
</article>
</div>
</div>
</div>
</div>
</div>
次に、JavaScriptでSwiperのオプションを記述します。
コードは <body>〜</body>
で、</body>
の閉じタグ(クロージングタグ)の前に記述しましょう。
var tab = new Swiper('.tab-content', {
slidesPerView: 1,
autoHeight: true,
thumbs: {
swiper: {
el: '.tab-menu',
slidesPerView: 4,
}
},
});
最後にCSSを記述して、見た目を整えましょう。
ul.swiper-wrapper {
border: none;
list-style: none;
margin: 0;
padding: 0;
}
ul.swiper-wrapper li.swiper-slide {
display: flex;
justify-content: center;
align-items: center;
height: 60px;
}
ul.swiper-wrapper {
border: none;
list-style: none;
margin: 0;
padding: 0;
box-shadow: 0 7px 34px rgb(50 50 93 / 10%), 0 3px 6px rgb(0 0 0 / 8%);
border-radius: 3px;
background: #FFF;
}
ul.swiper-wrapper li.swiper-slide {
display: flex;
justify-content: center;
align-items: center;
height: 45px;
cursor: pointer;
position: relative;
z-index: 1;
border-right: solid 1px #eee;
color: #707070;
}
ul.swiper-wrapper li.swiper-slide:nth-child(4) {
border: none;
}
ul.swiper-wrapper li.swiper-slide.swiper-slide-thumb-active {
color: #FFF;
}
.tab-content {
opacity: 1;
}
.swiper-container {
padding-bottom: 20px;
}
.swiper-slide:first-child.swiper-slide-thumb-active ~ .Tabs__presentation-slider {
transform: translateX(0) scaleX(0.25);
}
.swiper-slide:nth-child(2).swiper-slide-thumb-active ~ .Tabs__presentation-slider {
transform: translateX(25%) scaleX(0.25);
}
.swiper-slide:nth-child(3).swiper-slide-thumb-active ~ .Tabs__presentation-slider {
transform: translateX(calc(25% * 2)) scaleX(0.25);
}
.swiper-slide:nth-child(4).swiper-slide-thumb-active ~ .Tabs__presentation-slider {
transform: translateX(calc(25% * 3)) scaleX(0.25);
}
.Tabs__presentation-slider {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 100%;
transform-origin: 0 0;
transition: transform 0.25s;
background: linear-gradient( 45deg , #bdb9ff, #67b8ff);
}
.swiper-slide {
display: flex;
justify-content: space-around;
flex-wrap: wrap;
padding: 15px 0 10px;
}
/* カード */
article.card {
width: 46%;
}
article.card a {
display: flex;
flex-direction: column;
border-radius: 2px;
background: #fff;
box-shadow: 0 0 3px 0 rgb(0 0 0 / 12%), 0 2px 3px 0 rgb(0 0 0 / 22%);
cursor: pointer;
transition: 0.2s ease-in-out;
padding-bottom: 12px;
text-decoration: none;
}
article.card a:hover {
box-shadow: 0 15px 30px -5px rgb(0 0 0 / 15%), 0 0 5px rgb(0 0 0 / 10%);
transform: translateY(-4px);
}
article.card img {
margin-bottom: 10px;
}
article.card time, article.card p {
padding: 0 20px;
color: #313131;
}
article.card time {
font-size: 0.9rem;
color: #aaa;
font-weight: 600;
}
p.cardTitle {
font-size: 1.3rem;
margin: 0;
font-weight: 600;
}
ざっくりとしたコードの解説
HTML
HTMLは、CDNで記述する内容と、スライダーを設置する内容の2種類です。
まずは、CDNでSwiper本体読み込ませる記述は、以下のコードをHTMLの <head>〜</head>
の中に記述します。
<link
rel="stylesheet"
href="https://unpkg.com/swiper@7/swiper-bundle.min.css"
/>
<script src="https://unpkg.com/swiper@7/swiper-bundle.min.js"></script>
そして次に、Swiperでスライダーを設置します。コードは以下で、設置したい場所に設置します。
<div class="javaSample">
<div id ="app">
<div class="swiper-container tab-menu">
<ul class="swiper-wrapper">
<li class="swiper-slide">Tab 1</li>
<li class="swiper-slide">Tab 2</li>
<li class="swiper-slide">Tab 3</li>
<li class="swiper-slide">Tab 4</li>
<li class="Tabs__presentation-slider" role="presentation"></li>
</ul>
</div>
<div class="swiper-container tab-content">
<div class="swiper-wrapper">
<div class="swiper-slide">
<article class="card">
<a href="#">
<img src="https://dubdesign.net/wp-content/uploads/2022/02/javatooltip.jpg">
<time>6月19日</time>
<p class="cardTitle">タイトル 1-1</p>
</a>
</article>
<article class="card">
<a href="#">
<img src="https://dubdesign.net/wp-content/uploads/2022/02/javatooltip.jpg">
<time>6月19日</time>
<p class="cardTitle">タイトル 1-2</p>
</a>
</article>
</div>
<div class="swiper-slide">
<article class="card">
<a href="#">
<img src="https://dubdesign.net/wp-content/uploads/2022/02/javatooltip.jpg">
<time>6月19日</time>
<p class="cardTitle">タイトル 2-1</p>
</a>
</article>
<article class="card">
<a href="#">
<img src="https://dubdesign.net/wp-content/uploads/2022/02/javatooltip.jpg">
<time>6月19日</time>
<p class="cardTitle">タイトル 2-2</p>
</a>
</article>
</div>
<div class="swiper-slide">
<article class="card">
<a href="#">
<img src="https://dubdesign.net/wp-content/uploads/2022/02/javatooltip.jpg">
<time>6月19日</time>
<p class="cardTitle">タイトル 3-1</p>
</a>
</article>
<article class="card">
<a href="#">
<img src="https://dubdesign.net/wp-content/uploads/2022/02/javatooltip.jpg">
<time>6月19日</time>
<p class="cardTitle">タイトル 3-2</p>
</a>
</article>
</div>
<div class="swiper-slide">
<article class="card">
<a href="#">
<img src="https://dubdesign.net/wp-content/uploads/2022/02/javatooltip.jpg">
<time>6月19日</time>
<p class="cardTitle">タイトル 4-1</p>
</a>
</article>
<article class="card">
<a href="#">
<img src="https://dubdesign.net/wp-content/uploads/2022/02/javatooltip.jpg">
<time>6月19日</time>
<p class="cardTitle">タイトル 4-2</p>
</a>
</article>
</div>
</div>
</div>
</div>
</div>
HTMLのコード量は比較的多くなっていますが、大きく分けて「タブメニュー」と「タブの切り替えで表示されるブロック」の2種類です。
「swiper-container tab-menu」のclass名が付く要素がタブメニューのブロックで、その中にある li
タグで「Tabs__presentation-slider」のclass名が付く要素が、タブの現在地につく背景色の要素です。
JavaScript
JavaScriptは、Swiperのパラメータに関するコード内容です。
var tab = new Swiper('.tab-content', {
slidesPerView: 1,
autoHeight: true,
thumbs: {
swiper: {
el: '.tab-menu',
slidesPerView: 4,
}
},
});
タブメニューをスライダーと連動させるには、thumbs
のパラメータで swiper
でサムネイルのスライダーのSwiperインスタンス名を指定してタブのスライダーを作ります。
ここで出てくるパラメータや、モジュールは、Swiperで使える全体のごく一部でこれ以外にたくさんあります。
外部リンク 利用できるパラメータやモジュール(英語)
是非あわせて参考にしてみてください。
CSS
CSSで、スライダー部分のCSSはSwiper本体のCSSで大枠のレイアウト・デザインがあたるので、タブメニューとリンクカードのスタイルをあてるコードがメインです。
ul.swiper-wrapper {
border: none;
list-style: none;
margin: 0;
padding: 0;
}
ul.swiper-wrapper li.swiper-slide {
display: flex;
justify-content: center;
align-items: center;
height: 60px;
}
ul.swiper-wrapper {
border: none;
list-style: none;
margin: 0;
padding: 0;
box-shadow: 0 7px 34px rgb(50 50 93 / 10%), 0 3px 6px rgb(0 0 0 / 8%);
border-radius: 3px;
background: #FFF;
}
ul.swiper-wrapper li.swiper-slide {
display: flex;
justify-content: center;
align-items: center;
height: 45px;
cursor: pointer;
position: relative;
z-index: 1;
border-right: solid 1px #eee;
color: #707070;
}
ul.swiper-wrapper li.swiper-slide:nth-child(4) {
border: none;
}
ul.swiper-wrapper li.swiper-slide.swiper-slide-thumb-active {
color: #FFF;
}
.tab-content {
opacity: 1;
}
.swiper-container {
padding-bottom: 20px;
}
.swiper-slide:first-child.swiper-slide-thumb-active ~ .Tabs__presentation-slider {
transform: translateX(0) scaleX(0.25);
}
.swiper-slide:nth-child(2).swiper-slide-thumb-active ~ .Tabs__presentation-slider {
transform: translateX(25%) scaleX(0.25);
}
.swiper-slide:nth-child(3).swiper-slide-thumb-active ~ .Tabs__presentation-slider {
transform: translateX(calc(25% * 2)) scaleX(0.25);
}
.swiper-slide:nth-child(4).swiper-slide-thumb-active ~ .Tabs__presentation-slider {
transform: translateX(calc(25% * 3)) scaleX(0.25);
}
.Tabs__presentation-slider {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 100%;
transform-origin: 0 0;
transition: transform 0.25s;
background: linear-gradient( 45deg , #bdb9ff, #67b8ff);
}
.swiper-slide {
display: flex;
justify-content: space-around;
flex-wrap: wrap;
padding: 15px 0 10px;
}
/* カード */
article.card {
width: 46%;
}
article.card a {
display: flex;
flex-direction: column;
border-radius: 2px;
background: #fff;
box-shadow: 0 0 3px 0 rgb(0 0 0 / 12%), 0 2px 3px 0 rgb(0 0 0 / 22%);
cursor: pointer;
transition: 0.2s ease-in-out;
padding-bottom: 12px;
text-decoration: none;
}
article.card a:hover {
box-shadow: 0 15px 30px -5px rgb(0 0 0 / 15%), 0 0 5px rgb(0 0 0 / 10%);
transform: translateY(-4px);
}
article.card img {
margin-bottom: 10px;
}
article.card time, article.card p {
padding: 0 20px;
color: #313131;
}
article.card time {
font-size: 0.9rem;
color: #aaa;
font-weight: 600;
}
p.cardTitle {
font-size: 1.3rem;
margin: 0;
font-weight: 600;
}
タブメニューがONになった箇所の背景色を変えるには、「.swiper-slide:first-child.swiper-slide-thumb-active ~ .Tabs__presentation-slider」のtransform
プロパティを指定して、サイズを作り動きを出します。
さいごに
いかがでしたでしょうか?
スライダーの部分は、Swiperのパラメータをいじるだけでカスタマイズが可能なので、いろいろ試してみてください。