PORTFOLIO & WEB DESIGN MEMORANDOM BLOG   
PORTFOLIO & WEB DESIGN MEMORANDOM BLOG   

【JAVASCRIPT】スクロール量に応じてulを左右に移動させる方法

スクロールアニメーションサンプル

See the Pen
Untitled
by ryotom (@ryotam-smoke)
on CodePen.

HTML部分

  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Scroll Example</title>
  7. <link rel="stylesheet" href="styles.css">
  8. </head>
  9. <body>
  10. <div class="sample-container">
  11. <div class="scale">
  12. <ul class="scroll-left">
  13. <li><img src="image1.jpg" alt="Image 1"></li>
  14. <li><img src="image2.jpg" alt="Image 2"></li>
  15. <li><img src="image3.jpg" alt="Image 3"></li>
  16. <li><img src="image4.jpg" alt="Image 4"></li>
  17. <li><img src="image5.jpg" alt="Image 5"></li>
  18. <li><img src="image6.jpg" alt="Image 6"></li>
  19. <li><img src="image1.jpg" alt="Image 1"></li>
  20. <li><img src="image2.jpg" alt="Image 2"></li>
  21. <li><img src="image3.jpg" alt="Image 3"></li>
  22. <li><img src="image4.jpg" alt="Image 4"></li>
  23. <li><img src="image5.jpg" alt="Image 5"></li>
  24. <li><img src="image6.jpg" alt="Image 6"></li>
  25. </ul>
  26. <ul class="scroll-right">
  27. <li><img src="image1.jpg" alt="Image 1"></li>
  28. <li><img src="image2.jpg" alt="Image 2"></li>
  29. <li><img src="image3.jpg" alt="Image 3"></li>
  30. <li><img src="image4.jpg" alt="Image 4"></li>
  31. <li><img src="image5.jpg" alt="Image 5"></li>
  32. <li><img src="image6.jpg" alt="Image 6"></li>
  33. <li><img src="image1.jpg" alt="Image 1"></li>
  34. <li><img src="image2.jpg" alt="Image 2"></li>
  35. <li><img src="image3.jpg" alt="Image 3"></li>
  36. <li><img src="image4.jpg" alt="Image 4"></li>
  37. <li><img src="image5.jpg" alt="Image 5"></li>
  38. <li><img src="image6.jpg" alt="Image 6"></li>
  39. </ul>
  40. <ul class="scroll-left">
  41. <li><img src="image1.jpg" alt="Image 1"></li>
  42. <li><img src="image2.jpg" alt="Image 2"></li>
  43. <li><img src="image3.jpg" alt="Image 3"></li>
  44. <li><img src="image4.jpg" alt="Image 4"></li>
  45. <li><img src="image5.jpg" alt="Image 5"></li>
  46. <li><img src="image6.jpg" alt="Image 6"></li>
  47. <li><img src="image1.jpg" alt="Image 1"></li>
  48. <li><img src="image2.jpg" alt="Image 2"></li>
  49. <li><img src="image3.jpg" alt="Image 3"></li>
  50. <li><img src="image4.jpg" alt="Image 4"></li>
  51. <li><img src="image5.jpg" alt="Image 5"></li>
  52. <li><img src="image6.jpg" alt="Image 6"></li>
  53. </ul>
  54. </div>
  55. </div>
  56. <script src="script.js"></script>
  57. </body>
  58. </html>

CSS部分

  1. .sample-container {
  2. display: flex;
  3. flex-direction: column;
  4. align-items: center;
  5. height: 400px; /* 縦にスクロールするための高さを設定 */
  6. overflow: hidden;
  7. position: relative;
  8. border-radius: 20px;
  9. background-color: black;
  10. }
  11. .sample-container::before {
  12. content: '';
  13. position: absolute;
  14. top: 0;
  15. left: 0;
  16. width: 100%;
  17. height: 100%;
  18. background-color: rgba(0, 0, 0, 0.1);
  19. pointer-events: none; /* マスクが他の要素の操作を妨げないように */
  20. z-index: 1; /* マスクが他の要素の上に表示されるように */
  21. }
  22. .scale {
  23. transform: translate(0,25px) scale(1.5);
  24. }
  25. .sample-container ul {
  26. display: flex;
  27. list-style: none;
  28. padding: 0;
  29. margin: 10px 0;
  30. }
  31. .sample-container li {
  32. margin: 0 5px;
  33. }
  34. .sample-container img {
  35. width: 100px;
  36. height: 100px;
  37. object-fit: cover;
  38. }

JavaScript部分

  1. document.addEventListener('DOMContentLoaded', function() {
  2. const leftScrollElements = document.querySelectorAll('.scroll-left');
  3. const rightScrollElements = document.querySelectorAll('.scroll-right');
  4. function cloneListItems(ulElement) {
  5. const items = ulElement.querySelectorAll('li');
  6. items.forEach(item => {
  7. const clone = item.cloneNode(true);
  8. ulElement.appendChild(clone);
  9. });
  10. }
  11. leftScrollElements.forEach(el => {
  12. cloneListItems(el);
  13. });
  14. rightScrollElements.forEach(el => {
  15. cloneListItems(el);
  16. });
  17. document.addEventListener('scroll', function() {
  18. const scrollY = window.scrollY;
  19. leftScrollElements.forEach(el => {
  20. const width = el.scrollWidth / 2;
  21. el.style.transform = `translateX(${(scrollY * -0.5) % width}px)`;
  22. });
  23. rightScrollElements.forEach(el => {
  24. const width = el.scrollWidth / 2;
  25. el.style.transform = `translateX(${(scrollY * 0.5) % width}px)`;
  26. });
  27. });
  28. });

このスクリプトでは、各ulの中のli要素をクローンして追加し、ループしているように見せます。スクロール位置に応じて、要素をループさせるためにtranslateXの値を調整しています。
scrollWidth / 2を使用して、リストが半分スクロールしたら位置をリセットすることで、ループするように見せています。

MILMONA   MILMONA   MILMONA   MILMONA   MILMONA   
MILMONA   MILMONA   MILMONA   MILMONA   MILMONA