幅の指定をjsで後付するだけなんだけどね。
基礎
こんな感じでhtmlがあるとする。
<div class="wrap">
<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
</div>
cssでこうすれば、ブラウザ幅が要素以下になった時に横スクロールになる。
.wrap{
overflow-x: auto;
}
.wrap ul{
width: 100%;
min-width: 1500px;
margin: 0;
padding: 0;
list-style: none;
display: flex;
flex-direction: row;
}
.wrap ul li{
flex: 1;
min-width: 300px;
}
liの幅を300pxにしたい、liは5個ある、だからulの幅が1500pxになる。
じゃあliが4個だったり6個だったりにしたいときはどうすんの、という話。
cssをいちいち変更してたらめんどくさいよね、っていう話。
jQueryで要素の幅を指定する
jsでliの数を拾ってきて、1つあたりの幅を掛けて、ulに適用させたらいい。
$(function(){
listNum = $('.wrap ul li').length;
listWidth = listNum * 300;
$('.wrap ul').css('min-width',listWidth+'px');
})
競合したらまずいんでcssのmin-widthは消しておく。
.wrap ul{
width: 100%;
margin: 0;
padding: 0;
list-style: none;
display: flex;
flex-direction: row;
}
これでOK。
なんでmin-widthかっていうと、widthでもいいんだけど、ブラウザ幅が1500px超えた幅で幅いっぱいに等間隔にliを配置できるからっていう、それだけ。
ぶっちゃけた話
少なすぎたり多すぎると何がなんだかわからなくなるので、やっぱり数は制限したほうがいい。
wpの記事一覧とかmakeshopのクリエイターモードとか、書き出しにあたって表示数を指定できるし。青天井の一覧を仕込むことは稀だと思う。
別アプローチ
<ul>をposition:absolute;にして組めばそもそも幅を気にすることはないんだよね。js使わなくてもいいんだよね。
親に「white-space: nowrap;」を入れたら親要素を無視して子要素が並ぶから、それを活用する。
.parent{
position: relative;
overflow-x: auto;
white-space: nowrap;
}
.parent .child{
display: inline-block;
position: absolute;
top: 0;
left: 0;
}
こんなかんじで。
コメント