【jQuery】長文を省略して「もっと見る」ボタンで開閉する実装方法|PC・スマホ別の高さ指定&グラデーション付き

【jQuery】長文を省略して「もっと見る」ボタンで開閉する実装方法|PC・スマホ別の高さ指定&グラデーション付き

コンテンツ量が多いページにおいて、最初から全ての情報を表示してしまうとスクロールが長くなり、ユーザーの離脱要因になることがあります。

そんな時に便利なのが、一定の高さでコンテンツを隠し、「もっと見る」ボタンで続きを展開するUIです。

今回はjQueryを使用して、以下の特徴を持つ「もっと見る」機能を実装する方法を解説します。

  • レスポンシブ対応: PCとスマホで「隠す高さ」を個別に設定可能
  • グラデーション装飾: 続きがあることを直感的に伝える「ぼかし」効果
  • スムーズなアニメーション: スライドダウン・アップで開閉

コピペでそのまま使えるコードを用意しましたので、ぜひ活用してください。

CodePen ソースコードサンプル

実装デモとソースコード

まずは実際の挙動とコードを確認しましょう。

HTML

HTML構造のポイントは、親要素 .viewExpand に付与した data-height-pcdata-height-sp 属性です。ここで「何pxを超えたら隠すか」をCSSではなくHTML側で管理できるようにしています。

<div class="viewExpand" data-height-pc="300px" data-height-sp="500px">
  <div class="viewExpand__contents">
    <div>
      <p>ここにコンテンツが入ります...</p>
      <p>ダミーテキスト...</p>
    </div>
  </div>
  <button class="viewExpand__button" type="button" aria-label="もっと見る" data-close-label="閉じる"></button>
</div>

CSS

CSSでは、コンテンツの上に被せるグラデーション(.viewExpand__overlay)の配置と、ボタンのスタイリングを行います。オーバーレイの高さなどはCSS変数(--view-expand-overlay-height)で管理し、メンテナンス性を高めています。

.viewExpand{
  position: relative;
}
.viewExpand__contents{
  /* オーバーレイが被る分、下の余白を確保 */
  padding-bottom: var(--view-expand-overlay-height) ;
}
/* グラデーションのぼかし部分 */
.viewExpand__overlay{
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: var(--view-expand-overlay-height);
  /* 下に行くにつれて白くなるグラデーション */
  background: linear-gradient(180deg,rgba(255,255,255,0) 0%, rgba(255,255,255,0.8) 100%);
  pointer-events: none;
  z-index: 1;
}
.viewExpand__button{
  -webkit-appearance: none;
  border: 1px solid #000;
  border-radius: 5px;
  background-color: #fff;
  color: #000;
  /* 中央寄せ配置 */
  position: absolute;
  bottom: 10px;
  left: 50%;
  transform: translateX(-50%);
  display: flex;
  justify-content: center;
  align-items: center;
  width: 200px;
  height: var(--view-expand-btn-height);
  font-size: 13px;
  z-index: 2;
  transition: .5s;
  cursor: pointer;
}
@media (hover: hover){
  .viewExpand__button:hover{
    opacity: 0.7;
  }
}
/* レスポンシブ設定 */
@media screen and (min-width: 768px){
  .viewExpand{
    --view-expand-btn-height: 60px;
    --view-expand-overlay-height: 100px;
  }
}
@media screen and (max-width: 767px){
  .viewExpand{
    --view-expand-btn-height: 50px;
    --view-expand-overlay-height: 100px;
  }
}

JavaScript (jQuery)

JavaScriptでは、コンテンツの実際の高さ(scrollHeight)を取得し、指定した制限値(limit)と比較して開閉のアニメーションを実行します。

$(function () {
  var SP_BREAK = 768; // ブレイクポイントの設定

  $('.viewExpand').each(function () {
    var $view = $(this),
      $cont = $view.find('.viewExpand__contents'),
      $btn = $view.find('.viewExpand__button');

    // 現在のウィンドウ幅に応じて高さを取得する関数
    function viewExpandGetLimit() {
      return parseInt($(window).width() < SP_BREAK
        ? $view.data('height-sp')
        : $view.data('height-pc'), 10);
    }

    // 閉じる(折りたたむ)処理
    function viewExpandCollapse() {
      var limit = viewExpandGetLimit(),
        curH = $cont.get(0).scrollHeight;
      
      $cont.stop()
        .css({ height: curH + 'px', overflow: 'hidden' })
        .animate({ height: limit + 'px' }, 400, 'swing', function () {
          $cont.css({ height: '', 'max-height': limit + 'px' });
          // グラデーションオーバーレイを再生成
          if (!$view.find('.viewExpand__overlay').length) {
            $('<div class="viewExpand__overlay"></div>').insertBefore($btn);
          }
          // ボタンのテキストを変更
          $btn.text($btn.attr('aria-label'));
        });
    }

    // 開く(展開する)処理
    function viewExpandExpand() {
      var limit = viewExpandGetLimit(),
        fullH = $cont.get(0).scrollHeight;

      $cont.stop()
        .css({ 'max-height': '', height: limit + 'px', overflow: 'hidden' })
        .animate({ height: fullH + 'px' }, 400, 'swing', function () {
          $cont.css({ height: '', overflow: '' });
          // 開ききったらオーバーレイを削除
          $view.find('.viewExpand__overlay').remove();
          // ボタンのテキストを変更
          $btn.text($btn.data('close-label'));
        });
    }

    // 初期実行
    viewExpandCollapse();

    // クリックイベント
    $btn.on('click', function () {
      if ($view.hasClass('is-expanded')) {
        $view.removeClass('is-expanded');
        viewExpandCollapse();
      } else {
        $view.addClass('is-expanded');
        viewExpandExpand();
      }
    });

    // リサイズ時の調整
    $(window).on('resize', function () {
      if (!$view.hasClass('is-expanded')) viewExpandCollapse();
    });
  });
});

実装のポイント解説

今回のコードで工夫しているポイントをいくつか解説します。

HTMLのdata属性による管理

案件によって「PCでは300px見せたいけど、スマホでは500px見せたい」といった要望はよくあります。JSコード内の数値を毎回書き換えるのではなく、HTMLの data-height-pc data-height-sp を変更するだけで調整できるように設計しています。

グラデーションオーバーレイの出し入れ

「閉じて省略されている時」は続きがあるように見せるため、白いグラデーション(.viewExpand__overlay)を表示させています。 しかし、展開した後はコンテンツをクリアに見せる必要があるため、JSでこの要素を remove() しています。再び閉じる際には insertBefore で再生成するという処理を行っています。

ボタンテキストの切り替え

「もっと見る」と「閉じる」のテキスト切り替えもJSで行っています。 HTML側にあらかじめ aria-label="もっと見る" data-close-label="閉じる" を持たせておき、状態に応じてこれらを入れ替えることで、テキスト変更もHTML上で完結しやすくなっています。

まとめ

長文コンテンツをスッキリ見せる「もっと見る」ボタンの実装方法を紹介しました。

単純な display: none の切り替えではなく、アニメーションとグラデーションを加えることで、UX(ユーザー体験)が大きく向上します。 LPやブログ記事、商品詳細ページなど、様々な場面で応用できるテクニックですので、ぜひ試してみてください。

この記事をシェアする

どなたでもコメントや質問をどうぞ

スパム対策のため、承認作業を行うまでは表示されません。ご了承ください。

CAPTCHA