Vissza a webes elemekhez
Galériák és képek

Húzd szét!

Élő előnézet – a komponens teljes méretben.

Élő előnézet
HTML · CSS · JS
HTML
<section class="we-compare" data-compare>
  <div class="we-compare__intro">
    <span class="we-compare__eyebrow">KÉT PILLANAT · EGY TÖRTÉNET</span>
    <h2>A változás <em>nyomában.</em></h2>
    <p>Húzd el a választóvonalat, és fedezd fel, mi változott!</p>
  </div>

  <div class="we-compare__frame" style="--position: 50%">
    <!-- Az alsó, teljes szélességű kép -->
    <img
      class="we-compare__image we-compare__image--after"
      src="https://images.unsplash.com/photo-1470770841072-f978cf4d019e?auto=format&fit=crop&w=1800&q=85"
      alt="Hegyek és tó naplementében"
    >

    <!-- A felső kép, amelyből a csúszka felfed egy részt -->
    <div class="we-compare__before">
      <img
        class="we-compare__image"
        src="https://images.unsplash.com/photo-1500530855697-b586d89ba3ee?auto=format&fit=crop&w=1800&q=85"
        alt="Hegyi táj zöldellő völggyel"
      >
    </div>

    <span class="we-compare__label we-compare__label--before">
      <span>01</span> ELŐTTE
    </span>

    <span class="we-compare__label we-compare__label--after">
      <span>02</span> UTÁNA
    </span>

    <input
      class="we-compare__range"
      type="range"
      min="0"
      max="100"
      value="50"
      aria-label="Az előtte és utána kép összehasonlítása"
      aria-valuetext="50 százalék"
      data-compare-range
    >

    <div class="we-compare__divider" aria-hidden="true">
      <span class="we-compare__handle">
        <span>‹</span>
        <span>›</span>
      </span>
    </div>
  </div>

  <div class="we-compare__footer">
    <span class="we-compare__hint">
      <span class="we-compare__hint-icon">↔</span>
      HÚZD A VONALAT
    </span>
    <span class="we-compare__counter" data-compare-counter>50 / 50</span>
  </div>
</section>
CSS
.we-compare {
  --compare-gold: #d7bd83;
  --compare-ink: #10231d;
  --compare-muted: #9aa99f;
  width: 100%;
  max-width: 1080px;
  margin: 0 auto;
  padding: clamp(24px, 5vw, 64px);
  color: #f5f2e9;
  background:
    radial-gradient(ellipse at 10% 0%, #29483a 0%, transparent 48%),
    linear-gradient(145deg, #142820, #0b1511 80%);
  border: 1px solid rgba(215, 189, 131, .22);
  border-radius: 24px;
  box-sizing: border-box;
  font-family: Georgia, "Times New Roman", serif;
}

.we-compare *,
.we-compare *::before,
.we-compare *::after {
  box-sizing: border-box;
}

.we-compare__intro {
  max-width: 680px;
  margin: 0 auto 32px;
  text-align: center;
}

.we-compare__eyebrow {
  display: inline-block;
  margin-bottom: 15px;
  color: var(--compare-gold);
  font: 700 11px/1.5 Arial, sans-serif;
  letter-spacing: .2em;
}

.we-compare__intro h2 {
  margin: 0;
  font-size: clamp(32px, 5vw, 57px);
  font-weight: 400;
  line-height: 1.08;
  letter-spacing: -.035em;
}

.we-compare__intro h2 em {
  color: var(--compare-gold);
  font-weight: 400;
}

.we-compare__intro p {
  margin: 16px 0 0;
  color: #c1cbc3;
  font: 15px/1.7 Arial, sans-serif;
}

.we-compare__frame {
  position: relative;
  width: 100%;
  aspect-ratio: 16 / 9;
  overflow: hidden;
  isolation: isolate;
  border: 1px solid rgba(255, 255, 255, .15);
  border-radius: 15px;
  background: #24362d;
  box-shadow: 0 24px 55px rgba(0, 0, 0, .3);
}

.we-compare__image {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  user-select: none;
  pointer-events: none;
}

.we-compare__image--after {
  position: absolute;
  inset: 0;
}

.we-compare__before {
  position: absolute;
  z-index: 1;
  inset: 0;
  width: var(--position);
  overflow: hidden;
  border-right: 0;
}

.we-compare__before .we-compare__image {
  width: calc(100% / (var(--position-number, 50) / 100));
  max-width: none;
}

/* A felső kép mérete nem változik húzás közben. */
.we-compare__before .we-compare__image {
  width: var(--frame-width, 100%);
}

/* A képek azonos méretűek maradnak a vágás alatt. */
.we-compare__before {
  right: auto;
}

.we-compare__label {
  position: absolute;
  z-index: 3;
  top: 18px;
  display: flex;
  align-items: center;
  gap: 9px;
  padding: 10px 13px;
  color: white;
  background: rgba(10, 20, 15, .65);
  border: 1px solid rgba(255, 255, 255, .22);
  border-radius: 5px;
  backdrop-filter: blur(10px);
  font: 700 10px/1 Arial, sans-serif;
  letter-spacing: .13em;
  pointer-events: none;
}

.we-compare__label span {
  color: var(--compare-gold);
  font-size: 9px;
}

.we-compare__label--before {
  left: 18px;
}

.we-compare__label--after {
  right: 18px;
}

.we-compare__range {
  position: absolute;
  z-index: 5;
  inset: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  opacity: 0;
  cursor: ew-resize;
  touch-action: pan-y;
}

.we-compare__range:focus-visible {
  opacity: 1;
  outline: 3px solid var(--compare-gold);
  outline-offset: -5px;
}

.we-compare__divider {
  position: absolute;
  z-index: 4;
  top: 0;
  bottom: 0;
  left: var(--position);
  width: 2px;
  background: #fff;
  transform: translateX(-50%);
  pointer-events: none;
  box-shadow: 0 0 18px rgba(0, 0, 0, .25);
}

.we-compare__handle {
  position: absolute;
  top: 50%;
  left: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 1px;
  width: 50px;
  height: 50px;
  color: var(--compare-ink);
  background: #fff;
  border: 3px solid rgba(215, 189, 131, .9);
  border-radius: 50%;
  transform: translate(-50%, -50%);
  box-shadow: 0 4px 20px rgba(0, 0, 0, .3);
  font: 26px/1 Arial, sans-serif;
}

.we-compare__handle span:first-child {
  margin-right: -3px;
}

.we-compare__handle span:last-child {
  margin-left: -3px;
}

.we-compare__footer {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  margin-top: 18px;
  font-family: Arial, sans-serif;
}

.we-compare__hint {
  display: flex;
  align-items: center;
  gap: 10px;
  color: var(--compare-muted);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: .15em;
}

.we-compare__hint-icon {
  color: var(--compare-gold);
  font-size: 20px;
}

.we-compare__counter {
  color: var(--compare-gold);
  font-size: 12px;
  font-variant-numeric: tabular-nums;
  letter-spacing: .08em;
}

@media (max-width: 600px) {
  .we-compare {
    padding: 22px 14px;
    border-radius: 16px;
  }

  .we-compare__intro {
    margin-bottom: 22px;
  }

  .we-compare__intro p {
    font-size: 13px;
  }

  .we-compare__frame {
    aspect-ratio: 4 / 5;
    border-radius: 10px;
  }

  .we-compare__label {
    top: 10px;
    gap: 6px;
    padding: 8px;
    font-size: 9px;
  }

  .we-compare__label--before {
    left: 9px;
  }

  .we-compare__label--after {
    right: 9px;
  }

  .we-compare__handle {
    width: 42px;
    height: 42px;
    font-size: 22px;
  }

  .we-compare__footer {
    align-items: flex-start;
  }

  .we-compare__hint {
    font-size: 9px;
    letter-spacing: .08em;
  }
}
JavaScript
document.querySelectorAll("[data-compare]").forEach((gallery) => {
  const frame = gallery.querySelector(".we-compare__frame");
  const range = gallery.querySelector("[data-compare-range]");
  const counter = gallery.querySelector("[data-compare-counter]");

  if (!frame || !range || !counter) return;

  function updateComparison() {
    const value = Number(range.value);

    frame.style.setProperty("--position", `${value}%`);
    counter.textContent = `${value} / ${100 - value}`;
    range.setAttribute("aria-valuetext", `${value} százalék`);
  }

  range.addEventListener("input", updateComparison);

  updateComparison();
});