令和7年6月2日更新 パララックス効果 テキスト2 フォト2 合計4レイヤー

コードコピーサンプル
<!-- ここにコードをそのまま貼る --><!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>パララックス複数セクション</title>
  <style>
    html, body {
      margin: 0;
      padding: 0;
      background: #000;
      font-family: sans-serif;
    }

    .parallax-container {
      position: relative;
      height: 100vh;
      overflow: hidden;
    }

    .background-photo {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: auto;
      z-index: 0;
      will-change: transform;
    }

    .background-text {
      position: absolute;
      top: 70%;
      left: 50%;
      transform: translate(-50%, -50%);
      font-size: 2vw;
      font-weight: bold;
      color: #2c2c2c;
      text-shadow:
        -0.5px -0.5px 0 #f5f5dc,
         0.5px -0.5px 0 #f5f5dc,
        -0.5px  0.5px 0 #f5f5dc,
         0.5px  0.5px 0 #f5f5dc;
      background-color: rgba(0, 0, 0, 0.1);
      padding: 0.5em 1em;
      border-radius: 8px;
      z-index: 1;
      white-space: nowrap;
      will-change: transform;
      pointer-events: none;
    }

    .foreground-text {
      position: absolute;
      top: 60%;
      left: 50%;
      transform: translate(-50%, -50%);
      font-size: 1.5vw;
      font-weight: bold;
      color: #fff;
      text-shadow: 1px 1px 2px #000;
      z-index: 3;
      background-color: rgba(0, 0, 0, 0.4);
      padding: 0.4em 0.8em;
      border-radius: 6px;
      white-space: nowrap;
      will-change: transform;
      pointer-events: none;
    }

    .foreground-photo {
      position: absolute;
      top: 50%;
      left: 50%;
      width: 90%;
      height: auto;
      transform: translate(-50%, -50%) translateY(0);
      z-index: 2;
      will-change: transform, box-shadow;
      border: 2px solid #fceacb;
      border-radius: 8px;
      padding: 4px;
      box-sizing: border-box;
      box-shadow: 0 6px 12px rgba(18, 245, 18, 0.4);
    }

    .foreground-photo:hover {
      transform: translate(-50%, -50%) scale(1.05);
      box-shadow: 0 10px 20px rgba(255, 255, 255, 0.5);
      transition: transform 0.3s ease, box-shadow 0.3s ease;
    }

    @media (max-width: 600px) {
      .background-text {
        font-size: 5vw;
      }
      .foreground-text {
        font-size: 4vw;
      }
    }
  </style>
</head>
<body>

<!-- &#x1f501; セクション1 -->
<div class="parallax-container">
  <img class="background-photo" src="背景画像1" alt="背景画像">
  <div class="background-text">背景テキスト1</div>
  <div class="foreground-text">前景テキスト1</div>
  <a href="リンク先1" target="_blank" rel="noopener noreferrer">
    <img class="foreground-photo" src="前景画像1" alt="前景画像">
  </a>
</div>

<!-- &#x1f501; セクション2 -->
<div class="parallax-container">
  <img class="background-photo" src="背景画像2" alt="背景画像">
  <div class="background-text">背景テキスト2</div>
  <div class="foreground-text">前景テキスト2</div>
  <a href="リンク先2" target="_blank" rel="noopener noreferrer">
    <img class="foreground-photo" src="前景画像2" alt="前景画像">
  </a>
</div>

<!-- &#x1f501; セクション3 -->
<div class="parallax-container">
  <img class="background-photo" src="背景画像3" alt="背景画像">
  <div class="background-text">背景テキスト3</div>
  <div class="foreground-text">前景テキスト3</div>
  <a href="リンク先3" target="_blank" rel="noopener noreferrer">
    <img class="foreground-photo" src="前景画像3" alt="前景画像">
  </a>
</div>

<!-- &#x1f501; セクション4 -->
<div class="parallax-container">
  <img class="background-photo" src="背景画像4" alt="背景画像">
  <div class="background-text">背景テキスト4</div>
  <div class="foreground-text">前景テキスト4</div>
  <a href="リンク先4" target="_blank" rel="noopener noreferrer">
    <img class="foreground-photo" src="前景画像4" alt="前景画像">
  </a>
</div>

<!-- &#x1f501; セクション5 -->
<div class="parallax-container">
  <img class="background-photo" src="背景画像5" alt="背景画像">
  <div class="background-text">背景テキスト5</div>
  <div class="foreground-text">前景テキスト5</div>
  <a href="リンク先5" target="_blank" rel="noopener noreferrer">
    <img class="foreground-photo" src="前景画像5" alt="前景画像">
  </a>
</div>

<!-- &#x1f501; セクション6 -->
<div class="parallax-container">
  <img class="background-photo" src="背景画像6" alt="背景画像">
  <div class="background-text">背景テキスト6</div>
  <div class="foreground-text">前景テキスト6</div>
  <a href="リンク先6" target="_blank" rel="noopener noreferrer">
    <img class="foreground-photo" src="前景画像6" alt="前景画像">
  </a>
</div>

<!-- &#x1f501; セクション7 -->
<div class="parallax-container">
  <img class="background-photo" src="背景画像7" alt="背景画像">
  <div class="background-text">背景テキスト7</div>
  <div class="foreground-text">前景テキスト7</div>
  <a href="リンク先7" target="_blank" rel="noopener noreferrer">
    <img class="foreground-photo" src="前景画像7" alt="前景画像">
  </a>
</div>

<!-- &#x1f501; セクション8 -->
<div class="parallax-container">
  <img class="background-photo" src="背景画像8" alt="背景画像">
  <div class="background-text">背景テキスト8</div>
  <div class="foreground-text">前景テキスト8</div>
  <a href="リンク先8" target="_blank" rel="noopener noreferrer">
    <img class="foreground-photo" src="前景画像8" alt="前景画像">
  </a>
</div>

<!-- &#x1f501; セクション9 -->
<div class="parallax-container">
  <img class="background-photo" src="背景画像9" alt="背景画像">
  <div class="background-text">背景テキスト9</div>
  <div class="foreground-text">前景テキスト9</div>
  <a href="リンク先9" target="_blank" rel="noopener noreferrer">
    <img class="foreground-photo" src="前景画像9" alt="前景画像">
  </a>
</div>

<!-- &#x1f501; セクション10 -->
<div class="parallax-container">
  <img class="background-photo" src="背景画像10" alt="背景画像">
  <div class="background-text">背景テキスト10</div>
  <div class="foreground-text">前景テキスト10</div>
  <a href="リンク先10" target="_blank" rel="noopener noreferrer">
    <img class="foreground-photo" src="前景画像10" alt="前景画像">
  </a>
</div>



<script>
  let ticking = false;

  window.addEventListener('scroll', function () {
    if (!ticking) {
      window.requestAnimationFrame(function () {
        handleParallax();
        ticking = false;
      });
      ticking = true;
    }
  });

  function handleParallax() {
    const scrollY = window.scrollY;

    document.querySelectorAll('.parallax-container').forEach(container => {
      const bg = container.querySelector('.background-photo');
      const fg = container.querySelector('.foreground-photo');
      const backgroundText = container.querySelector('.background-text');
      const foregroundText = container.querySelector('.foreground-text');

      const containerTop = container.offsetTop;
      const containerHeight = container.offsetHeight;

      if (scrollY + window.innerHeight > containerTop && scrollY < containerTop + containerHeight) {
        const relativeY = scrollY - containerTop;

        if (bg) bg.style.transform = `translateY(${relativeY * 0.6}px)`;
        if (fg) fg.style.transform = `translate(-50%, -50%) translateY(${-relativeY * 0.7}px)`;
        if (backgroundText) backgroundText.style.transform = `translate(-50%, -50%) translateY(${-relativeY * 1.2}px)`;
        if (foregroundText) foregroundText.style.transform = `translate(-50%, -50%) translateY(${-relativeY * 1.1}px)`;
      }
    });
  }
</script>

</body>
</html>
<div>こんにちは!</div>