Webサイトでよく見かける、「もっと見る」ボタンの実装方法のメモ書きです。

「もっと見る」ボタンを実装してみる

はじめに何件かコンテンツを表示しておき、「もっと見る」ボタンをクリックするたびに、指定した件数を追加で表示させるようにしていきます。

<ul class="list">
  <li class="target">target 1</li>
  <li class="target">target 2</li>
  <li class="target">target 3</li>
  <li class="target">target 4</li>
  <li class="target">target 5</li>
  <li class="target">target 6</li>
  <li class="target">target 7</li>
  <li class="target">target 8</li>
  <li class="target">target 9</li>
  <li class="target">target 10</li>
  <li class="target">target 11</li>
  <li class="target">target 12</li>
  <li class="target">target 13</li>
  <li class="target">target 14</li>
  <li class="target">target 15</li>
</ul>

<button class="btn-more">もっと見る</button>

以下のように、スタイルを当てていきます。

.list {
  display: flex;
  flex-wrap: wrap;
  max-width: 660px;
  margin: 0 auto;
}
.target {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 200px;
  height: 50px;
  margin: 10px;
  background: #828E98;
  color: #fff;
  
  &.is-hidden {
    display: none;
    opacity: 0;
  }
  &.is-show {
    animation: fadeIn 1s ease; /* フェードイン用のスタイル */
  }
}
.btn-more {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 200px;
  height: 50px;
  margin: 20px auto;
  border-radius: 25px;
  background: #AA987F;
  color: #fff;
  
  &:hover {
    opacity: .9
  }
}

@keyframes fadeIn {
  0% {
    transform: translateY(20px);
    opacity: 0;
  }
  100% {
     transform: translateY(0);
    opacity: 1;
  }
}
var showNum = 6, // 最初に表示しておく件数
    addNum = 3,  // クリックごとに表示したい件数
    target = '.target',
    btn = $('.btn-more');

 $(target + ':nth-child(n + ' + (showNum + 1) + ')').addClass('is-hidden');

 btn.on('click', function () {
   $(target + '.is-hidden').slice(0, addNum).removeClass('is-hidden').addClass('is-show'); // アニメーション用にis-showクラスを追加
  
   if ($(target + '.is-hidden').length == 0) {
     btn.fadeOut();
   }
});

「もっと見る」ボタンがクリックされた時に、フェードインしながら表示させるために、is-showというクラスを追加し、CSSでスタイルを適応しています。また、全て表示されたら、「もっと見る」ボタンは非表示になるようにしてあります。

See the Pen
more button
by gri-t (@gri-t)
on CodePen.