概要
横スクロールの可変(アイテムの数がリロードすると変わる)のコンテンツを作成しています。
枠内に数個のボックスがあり、
それが横並びになっていてoverflow-x: hiddenでスクロールができないようにしてあります。
次、前のボタンを押した時だけスクロールするようになっています。
困っているとこ
1.一番最初、つまり数個のボックスがまだスクロールされていない時、
または、枠内の一番左に一番最初の要素がある時は前ボタンを消す。
スクロールをして一番最後の要素が枠内に来たら次ボタンを消す。
やって見たこと
ulの要素を取得してscrollLeftの値が0だったら前ボタンを出さないようにした。
しかし、次ボタンを押したタイミングでスクロールされた時に再度scrollLeftの値を見て
0以外だったら前ボタンを出現させるように書いたがうまくいかなかった。
次ボタンに関してはulの要素をとって、一番最後のxの位置を取得して
そこまで来たら次ボタンを消そうと思ったが、最後のxの位置がわからずうまくいかなかった。
2.スクロール量がわからない。
次ボタン、前ボタン押した時にスクロールさせたいが、
どうスクロールさせればいいのかわからない。
コード
https://jsfiddle.net/wata/L1j6um1u/1/
html
<div class="scrollContent" data-scroll-area=""> <ul class="scrollContentList"> <li class="scrollContentListItem" data-list-item=""> <div class="itemWrapper"> <p class="itemText">これはアイテムです。</p> </div> </li> <li class="scrollContentListItem" data-list-item=""> <div class="itemWrapper"> <p class="itemText">これはアイテムです。</p> </div> </li> <li class="scrollContentListItem" data-list-item=""> <div class="itemWrapper"> <p class="itemText">これはアイテムです。</p> </div> </li> <li class="scrollContentListItem" data-list-item=""> <div class="itemWrapper"> <p class="itemText">これはアイテムです。</p> </div> </li> <li class="scrollContentListItem" data-list-item=""> <div class="itemWrapper"> <p class="itemText">これはアイテムです。</p> </div> </li> <li class="scrollContentListItem" data-list-item=""> <div class="itemWrapper"> <p class="itemText">これはアイテムです。</p> </div> </li> <li class="scrollContentListItem" data-list-item=""> <div class="itemWrapper"> <p class="itemText">これはアイテムです。</p> </div> </li> <li class="scrollContentListItem" data-list-item=""> <div class="itemWrapper"> <p class="itemText">これはアイテムです。</p> </div> </li> </ul> </div> <div class="btns"> <div class="prev" data-prev="">前</div> <div class="next" data-next="">次</div> </div>
css
.scrollContent { width: 200px; height: 200px; border: 1px solid #ff0000; padding: 20px; overflow-x: scroll; } .scrollContentList { list-style-type: none; padding: 0; margin: 0; white-space: nowrap; display: inline-block; } .scrollContentListItem { display: inline-block; border: 1px solid #333333; width: 100px; white-space: normal; } .btns { margin-top: 50px; } .prev, .next { border: 1px solid #333333; display: inline-block; }
js
const $scrollArea = $('[data-scroll-area]'); const item = document.querySelector('[data-list-item]'); const prev = document.querySelector('[data-prev]'); const next = document.querySelector('[data-next]'); if ($scrollArea[0].scrollLeft === 0) { prev.style.display = 'none'; } else { prev.style.display = 'inline-block'; } prev.addEventListener('click', () => { $($scrollArea).animate({ scrollLeft: 0 }, 500, 'swing'); }); next.addEventListener('click', () => { $($scrollArea).animate({ scrollLeft: 200 }, 500, 'swing'); });
回答1件
あなたの回答
tips
プレビュー