スクロールに合わせて背景画像にブラー効果を!JavaScriptで実装する方法

CSS、JavaScript

ウェブデザインをするとき、視覚的なエフェクトはとても効果的です。特に、スクロールに応じて背景を変化させる「ブラー」エフェクトは、ユーザーの注意を引きやすく、魅力的な効果を生み出します。この記事では、スクロールと連動して背景にブラーをかける方法を、HTML、CSS、JavaScriptを使って解説します。初心者から中級者向けに、コードをわかりやすく説明しますので、ぜひ実際に試してみてください!

サンプル

See the Pen Scroll Blur Effect by kasasagi_kmnmc (@kasasagi_kmnmc) on CodePen.

基本のHTML構造

まずは、HTMLの基本構造を準備します。背景画像がぼやけるエフェクトを作るために、2つのセクションを用意しました。

<div class="content blur-background">
  <div class="background"></div>
  <div class="text">
    <h1>スクロールで背景にブラー</h1>
    <p>スクロールすると背景画像がぼやけます!</p>
  </div>
</div>

<div class="content white-background">
  <div class="background"></div>
  <div class="text">
    <h1>背景が白いコンテンツ</h1>
    <p>これは背景が白くなるコンテンツです。</p>
  </div>
</div>

ここでは、.contentというクラスで全体をラップし、その中で背景を設定するための.backgroundと、テキストを表示するための.textを作成しています。背景部分のスタイリングを行い、テキストはスクロールしても固定されるようにします。

CSSでのレイアウトとスタイリング

次に、CSSを使ってレイアウトを整えます。ここでは、背景画像を設定し、スクロールに合わせてブラーエフェクトを追加できるように準備します。

body {
  margin: 0;
  font-family: Arial, sans-serif;
  overflow-x: hidden; /* 横スクロール防止 */
}

.content {
  position: relative;
  width: 100%;
}

.blur-background {
  height: 300vh; /* このセクションの高さを300vhに設定 */
}

.white-background {
  height: 100vh; /* このセクションの高さを200vhに設定 */
}

.background {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: url('https://as1.ftcdn.net/v2/jpg/03/90/63/84/1000_F_390638401_HbagabflE6cevPucZM5drrajYvPBnIYv.jpg') no-repeat center center;
  background-size: cover;
  transition: filter 0.3s ease, opacity 0.3s ease; /* 不透明度とフィルタにトランジションを追加 */
  z-index: -1;
  will-change: filter, opacity; /* パフォーマンス向上 */
}

.text {
  position: sticky; /* スクロールに合わせてテキストが固定される */
  top: 50px; /* スクロール時に少し余白を取る */
  z-index: 1;
  padding: 50px;
  text-align: center;
}

h1 {
  font-size: 3rem;
  color: white;
}

p {
  font-size: 1.5rem;
  color: white;
}

ここでは、.backgroundで背景画像を固定し、.textでテキストがスクロールしても動かないようにposition: stickyを使っています。background-size: coverで背景画像を画面いっぱいに広げ、スクロールに合わせて背景がブラーになる準備をします。

スクロール連動のJavaScript

JavaScriptを使って、スクロールイベントに応じて背景のブラーエフェクトを変更する機能を追加します。スクロール量に合わせて背景がぼやけ、さらに透明度が変化するようにします。

window.addEventListener('scroll', function() {
  const backgrounds = document.querySelectorAll('.background');
  const blurContent = document.querySelector('.blur-background');
  const whiteContent = document.querySelector('.white-background');
  const scrollPosition = window.scrollY;

  const textElements = document.querySelectorAll('.blur-background .text h1, .blur-background .text p'); // h1とpを取得

  // blur-backgroundが表示されている部分
  const blurContentPosition = blurContent.offsetTop;
  const whiteContentPosition = whiteContent.offsetTop;

  // ブラーをかけ始めるためのスクロール距離
  const startBlurDistance = 500; // 500pxスクロールしたらブラー開始

  // blur-backgroundが表示される範囲
  if (scrollPosition >= blurContentPosition && scrollPosition < whiteContentPosition) {
    // スクロールが一定距離を超えてからブラーを適用
    if (scrollPosition > startBlurDistance) {
      const blurAmount = Math.min((scrollPosition - startBlurDistance) / 2, 500); // スクロール開始からの距離でブラー量を決定
      const opacityAmount = Math.max(1 - (scrollPosition / 1000), 0); // 透明度を減少させる

      backgrounds.forEach(background => {
        background.style.filter = `blur(${blurAmount}px)`; // ブラーを適用
        background.style.opacity = opacityAmount; // 透明度を減少
      });

      // h1とpの透明度をスクロールに応じて減少
      textElements.forEach(text => {
        const textOpacity = Math.max(1 - (scrollPosition / 1000), 0); // 透明度を減少させる
        text.style.opacity = textOpacity;
      });
    } else {
      // スクロール位置がstartBlurDistanceより小さくなったらリセット
      backgrounds.forEach(background => {
        background.style.filter = 'blur(0px)';
        background.style.opacity = 1; // 元の透明度に戻す
      });

      textElements.forEach(text => {
        text.style.opacity = 1; // 元の透明度に戻す
      });
    }
  }

  // white-backgroundが表示される部分
  if (scrollPosition >= whiteContentPosition) {
    // 背景を完全にフェードアウト
    backgrounds.forEach(background => {
      background.style.filter = 'blur(0px)';
      background.style.opacity = 0; // 背景画像を完全に消す
    });

    // h1とpの透明度を0に
    textElements.forEach(text => {
      text.style.opacity = 0;
    });
  }
});

スクロールすると、背景画像に徐々にブラーがかかり、テキスト部分の透明度が変化します。スクロールが進むにつれて、背景画像が完全にフェードアウトし、次のコンテンツに進むことができます。

カスタマイズの方法

スクロールで背景にブラーをかけるエフェクトは非常にシンプルで、カスタマイズがしやすいです。以下の部分を変更することで、さらに自分好みに調整できます。

ブラーの強さを変更する

const blurAmount = Math.min((scrollPosition - startBlurDistance) / 2, 500); // スクロール開始からの距離でブラー量を決定

(scrollPosition - startBlurDistance) / 2 の部分を変更することで、ブラーの強さを調整できます。

  • 値を小さくするとブラーが弱く、ゆるやかに変化します。
  • 値を大きくするとブラーが強く、早い段階でぼかしがかかります。

背景画像を変更する

background: url('https://your-image-url.jpg') no-repeat center center;

背景に使用する画像を変更することで、異なるビジュアルを作り出せます。background-size: coverで画像を画面全体にフィットさせることができます。

テキストの透明度や色を調整する

テキストの透明度や色を変更することで、さらに個性的なデザインを作れます。例えば、テキストの色を別のカラーにしたり、透明度を変更して印象を変えることができます。

まとめ

スクロールに合わせて背景にブラーをかけるエフェクトは、視覚的にインパクトのあるデザインができます。これを使えば、ページの内容を引き立たせ、より動きのあるウェブサイトを作ることができます。初心者でも簡単に取り入れられるエフェクトなので、ぜひ試してみてください!

タイトルとURLをコピーしました