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
<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>
.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;
}
}
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();
});