
目次
コンテンツ量が多いページにおいて、最初から全ての情報を表示してしまうとスクロールが長くなり、ユーザーの離脱要因になることがあります。
そんな時に便利なのが、一定の高さでコンテンツを隠し、「もっと見る」ボタンで続きを展開するUIです。
今回はjQueryを使用して、以下の特徴を持つ「もっと見る」機能を実装する方法を解説します。
- レスポンシブ対応: PCとスマホで「隠す高さ」を個別に設定可能
- グラデーション装飾: 続きがあることを直感的に伝える「ぼかし」効果
- スムーズなアニメーション: スライドダウン・アップで開閉
コピペでそのまま使えるコードを用意しましたので、ぜひ活用してください。
CodePen ソースコードサンプル
実装デモとソースコード
まずは実際の挙動とコードを確認しましょう。
HTML
HTML構造のポイントは、親要素 .viewExpand に付与した data-height-pc と data-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やブログ記事、商品詳細ページなど、様々な場面で応用できるテクニックですので、ぜひ試してみてください。