スライダーのホバー時に、ドラッグを促すマウスストーカーを出現させる&ドラッグ時に矢印に切り替わる(SlickとSwiper両バージョンあり!)

今回は以下のような実装をします。

  • スライダーにホバーするとドラッグを促すテキスト入りのマウスストーカーが出現する
  • ドラッグ中に矢印に切り替わる

slickとswiperは同じJavaScriptで実装できるかと思いきや、ドラッグ時にSwiperで少しクセがあり、地味に調整に時間がかかったので、ぜひこちらご活用いただけると幸いです。

目次

完成形

PC推奨(SP版ではマウスストーカーは出てきません)

上段:Slick 、下段:Swiper

See the Pen Untitled by ゆき | Web制作 (@yukimum22) on CodePen.

事前準備

CDNは以下を読み込む必要があります。

CSSは<head>内、JavaScriptは<body>タグの直前で読み込んでください。

jQuery

<script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>

Slick

<link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.css"/>

<script type="text/javascript" src="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js"></script>
				

Swiper

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css"/>

<script src="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js"></script>

HTML

<!-- slick -->
<div class="slider-wrapper slick">
		<div class="drag">
			<span class="before"></span>
			<span class="text">drag</span>
			<span class="after"></span>
		</div>
		<div class="slider slider-slick">
			<div class="slider_slide">
				<div class="img target-image"><img src="画像パス" alt=""></div>
        <div class="text">
          <p class="title">テキスト</p>
        </div>
			</div>
    <div class="slider_slide">
				<div class="img target-image"><img src="画像パス" alt=""></div>
        <div class="text">
           <p class="title">テキスト</p>
				</div>
			</div>
       ‥‥
      以下略(必要な枚数分タグを用意)
		</div>
</div>

<!-- swiper -->
<div class="slider-wrapper swiper">
		<div class="drag">
			<span class="before"></span>
			<span class="text">drag</span>
			<span class="after"></span>
		</div>
		<div class="slider swiper-wrapper">
			<div class="slider_slide swiper-slide">
				<div class="img target-image"><img src="画像パス" alt=""></div>
        <div class="text">
          <p class="title">テキスト</p>
        </div>
			</div>
			<div class="slider_slide swiper-slide">
				<div class="img target-image"><img src="画像パス" alt=""></div>
        <div class="text">
            <p class="title">テキスト</p>
				</div>
			</div>
    ‥‥
      以下略(必要な枚数分タグを用意)
		</div>
	</div>

CSS

.slider-wrapper{
  width:100%;
  position: relative;
  margin-block-end: 40px;
}
.slider {
  .slider_slide {
    margin: 0 10px;
    .img {
      margin-bottom: 20px;
      img {
       aspect-ratio: 900/600;
       width: 100%;
       height: 100%;
       object-fit: cover;
       }
     }
    .text{
      .title {
        font-size: 28px;
        text-align:center;
        color: #333;
        }
     }
   }
}

/* マウスストーカーのスタイル */
.drag {
  width: 80px;
  height: 80px;
  border-radius: 50%;
  background-image: repeating-linear-gradient(90deg, rgba(255, 255, 255, 0) 20px, 40px, rgba(66, 213, 42, 0.5) 40px 60px), repeating-linear-gradient(180deg, rgba(243, 201, 140, 0.6) 20px 40px, rgba(255, 255, 255, 1) 40px 60px);
  pointer-events: none; /* カーソルの動作に干渉しない */
  display: none; /* 初期状態では非表示 */
  align-items: center;
  justify-content: center;
  font-size: 20px;
  font-family: "Josefin Sans", sans-serif;
  color: #6f4b3e;
  position: absolute;
  transform: translate(-50%, -50%);
  z-index: 100;
}
@media ( max-width:768px ){
.drag{
  display: none !important;
}
}
.drag .before,
.drag .after{
 display: none;
 position: absolute;
 top: 50%;
 width: 10px;
 height: 10px;
 border-block-start: 2px solid #6f4b3e;
 border-inline-end: 2px solid #6f4b3e;
}
.drag .before{
  left: 10px;
  transform: translateY(-50%) rotate(225deg);
}
.drag .after{
 right: 10px;
 transform: translateY(-50%) rotate(45deg);
}
.drag.drag-on .before,
.drag.drag-on .after{
  display: block;
}
.drag.drag-on .text{
  display: none;
}

JavaScript

function sliderSetting() {
    jQuery('.slider-slick').slick({
        slidesToShow: 1,
        dots: false,
        arrows: false,
        centerMode: true,
        adaptiveHeight: true,
        centerPadding: "27%",
        responsive: [{
            breakpoint: 768,
            settings: {
                slidesToShow: 1,
                centerPadding: "5%"
            }
        }],
    });
}
sliderSetting();

$(function () {
    const swiper = new Swiper(".swiper", {
        centeredSlides: true,
        loop: true,
        slidesPerView: 1.3,
        spaceBetween: "10",
        allowTouchMove: true,
        breakpoints: {
            768: {
                slidesPerView: 2.4,
                spaceBetween: "20",
            }
        }
    });
      // ドラッグ開始時に drag-on クラスを追加
      swiper.on('touchStart', function () {
        $('.drag').addClass('drag-on');
    });
    // ドラッグ終了時に drag-on クラスを削除
    swiper.on('touchEnd', function () {
        $('.drag').removeClass('drag-on');
    });
});

// マウスストーカー
document.addEventListener('DOMContentLoaded', function () {
    const targetAreas = document.querySelectorAll('.slider-wrapper');
    const drags = document.querySelectorAll('.drag');
    let isDragging = false;

    targetAreas.forEach((targetArea, index) => {
        const drag = drags[index];
        if (!drag) return;
        targetArea.addEventListener('mousemove', function (e) {
            const rect = targetArea.getBoundingClientRect();
            const x = e.clientX - rect.left;
            const y = e.clientY - rect.top;
            drag.style.left = x + 'px';
            drag.style.top = y + 'px';
            if (isDragging) {
                drag.classList.add('drag-on');
            }
        });
        targetArea.addEventListener('mouseenter', function () {
            drag.style.display = 'flex';
            if (!isDragging) {
                drag.classList.remove('drag-on');
            }
        });
        targetArea.addEventListener('mouseleave', function () {
            drag.style.display = 'none';
        });
        targetArea.addEventListener('mousedown', function () {
            isDragging = true;
            drag.classList.add('drag-on');
        });
        document.addEventListener('mouseup', function () {
            isDragging = false;
            drag.classList.remove('drag-on');
        });
    });
});

以上です。今回チェック柄のマウスストーカーが可愛かったので、CSSにコードを残しました!↓この部分です!

 background-image: repeating-linear-gradient(90deg, rgba(255, 255, 255, 0) 20px, 40px, rgba(66, 213, 42, 0.5) 40px 60px), repeating-linear-gradient(180deg, rgba(243, 201, 140, 0.6) 20px 40px, rgba(255, 255, 255, 1) 40px 60px);

素敵なスライダーが完成しますように!

\Web制作コーダーの営業にオススメ!/

こんな不安を解決します!

  • Web制作の面談ってどんなこと聞かれるの?
  • どんな風に答えればいいの?
  • オンラインの面談って何を準備したらいいの?

"少しでも面談の不安を減らしたい"という方はぜひお手に取ってみてください!

ゆき
体育会系2児ママ
Web制作コーダー(元理学療法士)。子供の出産を機に働き方を考え直しWeb制作の学習を始める。現在はフリーランスとして在宅ワークで活動中。
よかったらシェアしてね!
  • URLをコピーしました!
目次