ど素人から毛を生やす。<延>

[JQuery]行の高さに合わせて超過分を非表示にし、クリックで全長表示に切り替えるテーブルセル

Web > javascript 2026年1月7日(最終更新:0日前)

どもです。
たまにはjsの話。

このセルは同行の他セルの高さを超えると一部表示と全体表示を切り替えるようにセットされます。
このセルは普通に自身の文字行分の高さを確保します。
このセルは同行の他セルの高さを超えると一部表示と全体表示を切り替えるようにセットされます。
このセルは普通に自身の文字行分の高さを確保します。このセルは普通に自身の文字行分の高さを確保します。

こんな感じで、

ある列だけ自身の高さを持たずに、行の高さに合わせて超過分があれば制限表示にして全文表示トグルを設置、超過がなければそのまま表示

というテーブルを設置したかった。
重要なのは「超過がなければそのまま表示」の部分だ。超過なしなら[全て表示]は設置してはいけない。

<table>
    <tr>
        <td class="shorten"><div>このセルは同行の他セルの高さを超えると一部表示と全体表示を切り替えるようにセットされます。</div></td>
        <td>このセルは普通に自身の文字行分の高さを確保します。</td>
    </tr>
    <tr>
        <td class="shorten"><div>このセルは同行の他セルの高さを超えると一部表示と全体表示を切り替えるようにセットされます。</div></td>
        <td>このセルは普通に自身の文字行分の高さを確保します。このセルは普通に自身の文字行分の高さを確保します。このセルは普通に自身の文字行分の高さを確保します。</td>
    </tr>
</table>
.shorten{
	overflow-y:hidden;
}
.shorten>div{
	overflow-y:visible;
	height:0;
	vertical-align:middle
}
.shorten>div.partHide{
	overflow-y:hidden;
}
.shorten .allView{
	display:inline-block;
	float:right;
	cursor:pointer;
	font-size:12px;
	color:#555;
	margin-top:4px;
}
$(function(){
	$(".shorten").each(function(){
		let height = Math.ceil($(this).height());
		$(this).css('height', height+'px');
		$(this).children('div').css('height', height+'px');
		if(height < $(this).children('div').get(0).scrollHeight -5){
			let h = height-24;
			$(this).children('div').css('height', h+'px');
			$(this).children('div').addClass('partHide');
			$(this).append('<span class="allView" data-height="'+h+'">[全て表示]</span>');
		}else{
			$(this).children('div').css('height', 'auto');
		}
	});
	$(".shorten>.allView").on('click', function(){
		let height = Math.ceil($(this).parent('.shorten').height());
		let field  = $(this).parent('.shorten').children('div');
		if(field.hasClass('partHide')){
			field.css('height','auto');
			field.removeClass('partHide');
			$(this).text('[一部を表示]');
		}else{
			field.css('height', $(this).attr('data-height')+'px');
			field.addClass('partHide');
			$(this).text('[全て表示]');
		}
	});
});

ミソは“scrollHeight”だ。表示範囲ではなく、非表示範囲を含めたコンテンツの高さを取得してくれるので表示高と比較することで「超過している」判断が可能になる。
CSS設定によっては僅かな誤差が生じ、同じ行数でもtdのheightの方がdivのscrollHeightより1px小さくなってしまう事象が確認できているため、判断は1行未満の遊びを持たせておくと良い。

また、自身を含まない行の高さを正しく取得するため、コンテンツの初期高さは0にしておく。
トグル切替のため、一部表示状態の高さは要素のいずれかに控えておく、あたりを押さえればOK。

この記事は役に立ちましたか?
  • _(:3」∠)_ 面白かった (0)
  • (・∀・) 参考になった (0)
  • (`・ω・´) 役に立った (0)