JavaScript8(ヒーロースライダー)

7.5から続きます

ヒーロースライダーを作成する

作成するもの

こちらでSwiperを利用する(今回はswiper.min.jsを利用)

https://swiperjs.com/get-started

導入方法

HTMLに記述を追加することと下をコピー&ペースト

<!-- Slider main container -->
<div class="swiper">
  <!-- Additional required wrapper -->
  <div class="swiper-wrapper">
    <!-- Slides -->
    <div class="swiper-slide">Slide 1</div>
    <div class="swiper-slide">Slide 2</div>
    <div class="swiper-slide">Slide 3</div>
    ...
  </div>
  <!-- If we need pagination -->
  <div class="swiper-pagination"></div>

  <!-- If we need navigation buttons -->
  <div class="swiper-button-prev"></div>
  <div class="swiper-button-next"></div>

  <!-- If we need scrollbar -->
  <div class="swiper-scrollbar"></div>
</div>

CSSにこれも追加すること

.swiper {
  width: 600px;
  height: 300px;
}

SCSSの記述

@import "mixin";

  $cWhite: white;

@import 'hero-slider';

main.jsの記述

document.addEventListener('DOMContentLoaded', function () {
// newでインスタンス化
  const hero = new HeroSlider('.swiper-container');
  hero.start();
});

HTMLの記述

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Document</title>
<link rel="stylesheet" href="https://unpkg.com/swiper/swiper-bundle.min.css" />
<link rel="stylesheet" href="style.css" />
</head>
<body>
  <div id="global-container">
  <div id="container">
  <div id="content">
<!-- 今回の重要な部分 -->
  <div class="hero"></div>
<!-- スライダーメインコンテナ -->
   <div class="swiper-container">
<!-- ラッパー -->
    <div class="swiper-wrapper">
<!-- スライドの部分 -->
     <div class="swiper-slide">
<!-- 画像の真ん中の文字 -->
      <div class="hero__title">Enjoy Rich</div>
     <image src="images/Dahlia.jpg" alt=""></image>
    </div>
     <div class="swiper-slide">
      <div class="hero__title">Fantastic</div>
       <image src="images/Gaillardia.jpg" alt=""></image>
    </div>
     <div class="swiper-slide">
      <div class="hero__title">Experience</div>
       <image src="images/Geranium.jpg" alt=""></image>
  </div>
</div>
<div class="hero__footer">
<!-- ↓矢印の部分 -->
<img class="hero__downarrow" src="images/arrow.svg" />
<span class="hero__scrolltext">scroll</span>
    </div>
   </div>
  </div>
 </div>
</div>
  <script src="https://unpkg.com/swiper/swiper-bundle.min.js"></script>
  <script src="hero-slider.js"></script>
  <script src="main.js"></script>
</body>
</html>

_hero-slider.scss

.swiper-container {
  overflow: visible !important;
}

.swiper-slide {
  height: 500px;
// 拡大してはみ出た部分を表示しない
  overflow: hidden;

  & > img {
    width: 100%;
    height: 100%;
    max-width: 100%;
    object-fit: cover;
// 拡大する
    transform: scale(1.3);
    transition: transform 1.9s ease;
}

  &::after {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0, 61, 125, 0.1);
}

  &-active {
    & > img {
      transform: none;
}

  & .hero__title {
// 透明度を解除
    opacity: 1;
    transform: translate(-50%, -50%);
  }
 }
}

.hero {
  &__title {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, calc(-50% + 20px));
    color: $cWhite;
    font-size: 25px;
// 文字が最前面にくるようにする
    z-index: 2;
    opacity: 0;
    transition: opacity 0.3s ease 1s, transform 0.3s ease 1s;
}

  &__footer {
    position: absolute;
    left: 50%;
    bottom: 20px;
    transform: translateX(-50%);
    z-index: 2;
    height: 68px;
    width: 32px;
// アニメーションで上下に動いているように見えなくする
    overflow: hidden;
}

  &__downarrow {
    position: absolute;
    left: 0;
    bottom: 0;
    width: 6px;
// アニメーションを付けるために必要
@include animation(
$name: kf-arrow-anime,
$iteration-count: infinite,
$duration: 2s,
$timing-function: linear
 );
}

  &__scrolltext {
    position: absolute;
// 90度回転
    transform: rotate(90deg);
    color: rgba(255, 255, 255, 0.7);
    left: -8px;
    top: 15px;
    font-size: 1.2em;
 }
}

@keyframes kf-arrow-anime {
  0%,
  50%,
  100% {
    transform: translateY(-10%);
 }
  30% {
    transform: none;
 }
}

hero-slider.js

class HeroSlider {
  constructor(el) {
    this.el = el;
    this.swiper = this._initSwiper();
}

  _initSwiper() {
// returnでインスタンスに返す
    return new Swiper(this.el, {
// オプション詳しくはSwiperで
// direction: 'vertical',
    loop: true,
// effect: 'fade',
    grabCursor: true,
    effect: "coverflow",
// スライダーを中央揃えにする
    centeredSlides: true,
// 1枚だけ表示する
    slidesPerView: 1,
    speed: 1000,
    breakpoints: {
// 1024px以上は2枚表示する
     1024: {
       slidesPerView: 2,
  },
  },
 });
}
// 空のオブジェクトを作る
  start(options = {}) {
    options = Object.assign(
{
    delay: 4000,
// マウスで変更したあとでも4秒後、またオートでトランジション開始する
    disableOnInteraction: false,
   },
   options
);

   this.swiper.params.autoplay = options;
   this.swiper.autoplay.start();
}
  stop() {
    this.swiper.autoplay.stop();
 }
}

※2022年現在Swiperは現在Verが変わっていて、少し記述を変更しないといけないので注意してください

9に続きます

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です