マスクスライダーの実装方法jqueryなど無しで、CSSのclip-pathだけで動く方法

マスクスライダーの実装方法jqueryなど無しで、CSSのclip-pathだけで動く方法

以下のコードを参考にしてください。
styleの.sliderのwidthとheightは、スライド画像の大きさにしてください。

<div class="slider">
  <img src="https://hirocreate.com/wp-content/themes/seo/images/hirocreate/slide01.jpg" class="slide">
  <img src="https://hirocreate.com/wp-content/themes/seo/images/hirocreate/slide02.jpg" class="slide">
  <img src="https://hirocreate.com/wp-content/themes/seo/images/hirocreate/slide03.jpg" class="slide">
</div>


<style>
.slider {
  position: relative;
  width: 1200px;
  height: 480px;
  overflow: hidden;
}

.slide {
  position: absolute;
  width: 100%;
  height: 100%;
  object-fit: cover;
  top: 0;
  left: 0;
  clip-path: inset(0 100% 0 0);
  z-index: -1;
  transition: none;
}

.slide.shown {
  clip-path: inset(0 0 0 0);
  z-index: 0;
  transition: none;
}

.slide.animating {
  z-index: 1;
  transition: clip-path 1s ease;
}




</style>

<script>
const slides = document.querySelectorAll('.slide');
let currentIndex = 0;

function initialize() {
  slides.forEach((slide, i) => {
    if (i === currentIndex) {
      slide.classList.add('visible');
      slide.style.zIndex = 1;
      slide.style.clipPath = 'inset(0 0 0 0)';
    } else {
      slide.classList.remove('visible', 'above');
      slide.style.zIndex = 0;
      slide.style.clipPath = 'inset(0 100% 0 0)';
    }
  });
}

function nextSlide() {
  const total = slides.length;
  const prevIndex = currentIndex;
  currentIndex = (currentIndex + 1) % total;

  const prevSlide = slides[prevIndex];
  const nextSlide = slides[currentIndex];

  // 次のスライドを上に置きマスクで隠す状態に
  nextSlide.classList.add('above');
  nextSlide.classList.remove('visible');
  nextSlide.style.zIndex = 2;
  nextSlide.style.clipPath = 'inset(0 100% 0 0)';

  // 1フレーム待ってマスクを外す(アニメーション開始)
  requestAnimationFrame(() => {
    requestAnimationFrame(() => {
      nextSlide.style.transition = 'clip-path 1s ease';
      nextSlide.style.clipPath = 'inset(0 0 0 0)';
      nextSlide.classList.add('visible');
    });
  });

  // アニメ完了後、prevSlideを非表示化、nextSlideを背景化
  setTimeout(() => {
    prevSlide.classList.remove('visible', 'above');
    prevSlide.style.zIndex = 0;
    prevSlide.style.transition = 'none';
    prevSlide.style.clipPath = 'inset(0 100% 0 0)';

    nextSlide.style.zIndex = 1;
    nextSlide.style.transition = 'none';
  }, 1100);
}

initialize();
setInterval(nextSlide, 3000);








</script>

ポチッ☆とクリックお願いします!
↓ ↓ ↓

  • にほんブログ村 IT技術ブログ ホームページ・サイト制作支援へ

コメントは受け付けていません。

サブコンテンツ

TOP