序章

プロフェッショナルなWebサイトを作成する場合、画像カルーセルを使用してポートフォリオを紹介すると、フロントエンド開発の経験が楽しくクリエイティブな方法で表示されます。 このチュートリアルでは、このWebページコンポーネントを作成およびスタイル設定するための基本的な手順について説明します。 HTMLを記述し、CSSでスタイルを設定し、JavaScriptを使用してページを動的にします。 また、MomentumSliderライブラリを使用してスライダー効果を作成します。

私たちが探しているカルーセル効果のタイプの例は次のとおりです。

Portfolio Carousel Example

注:このオリジナルデザインはFrancesco Zagamiに属し、Dribbbleで公開されています。

計画

デザインの開発に取り掛かる前に、利用可能なテクノロジーを考慮して、デザインをどのように実行するかを考える必要があります。

この場合、デザインを注意深く観察すると、ポートフォリオカルーセルは、すべて同期された4つの独立したスライダー(画像、数値、タイトル、およびリンク)で構成されていることがわかります。

これを念頭に置いて、MomentumSliderライブラリを問題なく使用できます。これにより、1つまたは複数のスライダーをメインスライダーに同期できるようになります。 画像をメインスライダーとして使用して、他の画像(番号、タイトル、リンク)を同期させることができます。

ステップ1—HTML構造を作成する

すべてのスライダーはMomentumSliderライブラリを使用してJavaScriptから生成されるため、HTMLコードは最小限に抑えられます。 したがって、マークアップは次のようになります。

<!-- Container for all sliders and pagination -->
<main class="sliders-container">
    <!-- Here sliders will be injected for images, numbers, titles, and links -->
</main>

ポートフォリオコードに焦点を当てるために、最終デモに表示される残りの装飾要素は含まれていないことに注意してください。 同様に、これらの装飾要素に対応するCSSコードは含めません。これにより、間違いなく、このチュートリアルがより理解しやすくなり、理解しやすくなります。

いずれの場合も、Githubリポジトリでいつでも完全なコードを確認できます。

ステップ2—MomentumSliderミックスインを使用してスタイルを追加する

HTMLにスライダーを含める前でも(JavaScriptで動的に生成されるため)、既にいくつかのスタイルを定義できます。 これを行うには、MomentumSliderライブラリが提供する新しいSCSSミックスインを使用します。

MomentumSliderで作成されたスライダーの基本的なCSSスタイルを生成するためのSCSSミックスインは、パスscss/_ms-mixin.scssにあり、次のパラメーターを受け取ることができます。

  • $cssClass:スライダーコンテナに一致するCSSクラス。
  • $slider-length:スライダーコンテナの長さ(幅または高さ)。
  • $slider-center:スライダーを中央に配置する必要がある場合。
  • $slide-width:各スライドの幅を固定しました。
  • $slide-height:各スライドの高さを固定しました。
  • $vertical:スライダーを垂直(true)または水平(false)にする必要がある場合。
  • $reverse:スライダーのスライドを逆にする必要がある場合(最後の最初の項目)。
  • $debug:デバッグに役立つ背景色を表示します。

デフォルト値を使用した例は、次のようになります。

@import "ms-mixin";

@include ms(
  $cssClass: 'ms-container',
  $slider-length: 400px,
  $slider-center: false,
  $slide-width: 90px,
  $slide-height: 90px,
  $vertical: false,
  $reverse: false,
  $debug: false
);

すべてのパラメーターはオプションであり、デフォルトで以前の値を使用します。

このミックスインは、スライダーにスタイルを与えます。 メインスライダー(画像)のSCSSコードがどのようになるか見てみましょう。

@import "ms-mixin";

// Images

$ms-images-slide-width: 700px;
$ms-images-slide-height: 400px;

// Using SCSS mixin to generate the final CSS code for the slider
@include ms(
  $cssClass: 'ms--images', // CSS class to match the slider container
  $slider-length: 100%,    // The slider container will have full width
  $slider-center: false,   // Don't need to center it, as it is full width
  $slide-width: $ms-images-slide-width,   // Fixed width for each slide
  $slide-height: $ms-images-slide-height, // Fixed height for each slide
  $vertical: false, // The slider should be horizontal
  $reverse: false,  // Normal order
  $debug: false     // No debug backgrounds in production
);

デフォルト値と同じであるため、不要なパラメータがいくつかあることに気付いたかもしれません。 ただし、ミックスインコードを参照しないように、すべてのパラメーターを書き込むことをお勧めします。

また、最初に、スライダーの位置と寸法を定義するために、パラメーター$debug: trueを定義することをお勧めします。これにより、スライダーの各要素に役立つ背景色が生成されます。

ステップ3—JavaScriptを使用してスライダーを初期化する

すべての基本的なスタイルを定義したら、次のようにメインスライダー(画像用)を初期化できます。

// Initializing the images slider
var msImages = new MomentumSlider({
    // Element to append the slider
    el: '.sliders-container',
    // CSS class to reference the slider
    cssClass: 'ms--images',
    // Generate the 4 slides required
    range: [0, 3],
    rangeContent: function () {
        return '<div class="ms-slide__image-container"><div class="ms-slide__image"></div></div>';
    },
    // Synchronize the other sliders
    sync: [msNumbers, msTitles, msLinks],
    // Styles to interpolate as we move the slider
    style: {
        '.ms-slide__image': {
            transform: [{scale: [1.5, 1]}]
        }
    }
});

このコードに示されているように、syncパラメーターは、作成している新しいスライダーと同期する他のスライダーのインスタンスを含むArrayを受け取ります。 これらのスライダーは事前に初期化しておく必要があります。

ステップ4—スタイルのカスタマイズ

画像スライダーが適切に機能するようにすると、ポートフォリオカルーセルを元のデザインのように見せるために必要な他のスタイルを追加できます。

// Custom styles for images slider
.ms--images {
  left: calc(50% - #{$ms-images-slide-width / 2 - 70px});

  &.ms-container--horizontal .ms-track {
    left: -70px;
  }

  // Slides images
  .ms-slide {
    &:nth-child(1) .ms-slide__image {
      background-image: url('../portfolio-carousel/img/harvey-gibson-498362-unsplash.jpg');
    }
    &:nth-child(2) .ms-slide__image {
      background-image: url('../portfolio-carousel/img/andre-hunter-461305-unsplash.jpg');
    }
    &:nth-child(3) .ms-slide__image {
      background-image: url('../portfolio-carousel/img/joanna-nix-389128-unsplash.jpg');
    }
    &:nth-child(4) .ms-slide__image {
      background-image: url('../portfolio-carousel/img/jurica-koletic-321003-unsplash.jpg');
    }
  }

  .ms-slide__image-container {
    width: 80%;
    height: 80%;
    background-color: rgba(0, 0, 0, 0.3);
    overflow: hidden;
  }

  .ms-slide__image {
    width: 100%;
    height: 100%;
    background-size: cover;
  }
}

MomentumSliderの主な利点の1つは、スライダーの機能に影響を与えることなく、必要に応じてスライダーのCSSスタイルを変更できることです。 スライドの寸法を上書きしないように注意する限り、あらゆる種類のスタイルを追加できます。

ステップ5—ページ付けを追加する

ライブラリは、すぐに使用できるいくつかの機能を提供しますが、ページ付けコンポーネントが必要な場合は、自分で実装する必要があります。

これは、スライドごとに1つの要素を含む、使用するHTMLコードになります。

<!-- Pagination for the slider -->
<ul class="pagination">
    <li class="pagination__item"><a class="pagination__button"></a></li>
    <li class="pagination__item"><a class="pagination__button"></a></li>
    <li class="pagination__item"><a class="pagination__button"></a></li>
    <li class="pagination__item"><a class="pagination__button"></a></li>
</ul>

この場合、ページ付けコンポーネントをデザインのように見せるために必要なCSSコードについては詳しく説明しません。 代わりに、JavaScriptコードを見て、正しく機能させるようにしましょう。

// Get pagination items
var pagination = document.querySelector('.pagination');
var paginationItems = [].slice.call(pagination.children);

// Update initialization for images slider
var msImages = new MomentumSlider({
    // MORE OPTIONS

    // Update pagination if slider change
    change: function(newIndex, oldIndex) {
        if (typeof oldIndex !== 'undefined') {
            paginationItems[oldIndex].classList.remove('pagination__item--active');
        }
        paginationItems[newIndex].classList.add('pagination__item--active');
    }
});

// Select corresponding slider item when a pagination button is clicked
pagination.addEventListener('click', function(e) {
    if (e.target.matches('.pagination__button')) {
        var index = paginationItems.indexOf(e.target.parentNode);
        msImages.select(index);
    }
});

ステップ6—応答性を高める

ポートフォリオカルーセルを小さな画面で見栄えよくするために、いくつかの位置を修正し、いくつかの小さな問題を解決しましょう。

// Responsive styles

@media screen and (max-width: 860px) {
  .ms--numbers {
    left: calc(50% - #{$ms-numbers-slide-width / 2});
  }

  .ms--titles {
    left: calc(50% - #{$ms-titles-slide-width / 2});
    top: calc(50% - #{$ms-titles-slide-height / 2 + 50px});
    text-align: center;
  }

  .ms--links {
    left: calc(50% - #{$ms-links-slide-width / 2});
    top: calc(50% + #{$ms-links-slide-height / 2 + 50px});
  }

  .pagination {
    left: 50%;
    top: calc(100% - 50px);
    transform: translateX(-50%);
  }
}

@media screen and (max-width: 600px) {
  .ms--images {
    overflow: visible;
  }
}

@media screen and (max-width: 400px) {
  .ms--titles {
    .ms-slide {
      transform: scale(0.8);
    }
  }
}

現在、ポートフォリオカルーセルはあらゆるサイズの画面で見栄えがします。

結論

このチュートリアルでは、エレガントなポートフォリオカルーセルを作成するために不可欠な要素を見てきました。

最終結果CodePenデモを見ることができます。