Vissza az animációkhoz
Kártyaanimációk

Kinyíló képablak

Élő előnézet – az animáció teljes méretben.

Élő előnézet
HTML · CSS · JS
HTML
<div class="we-card-reveal">

    <div class="we-card-reveal-image">
        <span>FÖLDÜNK CSODÁI</span>
    </div>

    <div class="we-card-reveal-content">
        <span class="we-card-reveal-number">03</span>

        <h3>Rejtett tájak</h3>

        <p>
            Vannak helyek, amelyek első pillantásra
            szinte hihetetlennek tűnnek.
        </p>

        <span class="we-card-reveal-arrow">Felfedezem&nbsp; ↗</span>
    </div>

</div>
CSS
.we-card-reveal {
    position: relative;
    width: min(100%, 420px);
    height: 300px;
    overflow: hidden;

    border-radius: 24px;
    background: #0d1511;

    border: 1px solid rgba(95, 189, 125, .22);

    box-shadow:
        0 20px 50px rgba(0, 0, 0, .35);

    cursor: pointer;
}

.we-card-reveal-image {
    position: absolute;
    inset: 0;

    display: flex;
    align-items: center;
    justify-content: center;

    background:
        linear-gradient(
            135deg,
            #24382d,
            #101b15
        );

    transition:
        transform .9s cubic-bezier(.22, 1, .36, 1),
        clip-path .9s cubic-bezier(.22, 1, .36, 1);
}

.we-card-reveal-image::before {
    content: "";
    position: absolute;
    inset: 0;

    background:
        radial-gradient(
            circle at 50% 45%,
            rgba(122, 201, 142, .16),
            transparent 45%
        );
}

.we-card-reveal-image span {
    position: relative;
    z-index: 2;

    color: rgba(244, 241, 233, .72);

    font-family: Inter, system-ui, sans-serif;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: .2em;

    transition:
        opacity .45s ease,
        transform .7s cubic-bezier(.22, 1, .36, 1);
}

.we-card-reveal-content {
    position: absolute;
    inset: 0;
    z-index: 3;

    display: flex;
    flex-direction: column;
    justify-content: flex-end;

    padding: 32px;

    background:
        linear-gradient(
            180deg,
            transparent 25%,
            rgba(8, 12, 10, .94) 100%
        );

    opacity: 0;
    transform: translateY(25px);

    transition:
        opacity .55s ease .18s,
        transform .8s cubic-bezier(.22, 1, .36, 1) .12s;
}

.we-card-reveal-number {
    position: absolute;
    top: 27px;
    right: 30px;

    color: rgba(244, 241, 233, .45);

    font-family: "Bodoni Moda", Georgia, serif;
    font-size: 18px;
}

.we-card-reveal-content h3 {
    margin: 0 0 9px;

    color: #f4f1e9;

    font-family: "Bodoni Moda", Georgia, serif;
    font-size: clamp(30px, 5vw, 42px);
    font-weight: 500;
    line-height: 1.05;
}

.we-card-reveal-content p {
    max-width: 305px;
    margin: 0 0 18px;

    color: rgba(244, 241, 233, .67);

    font-family: Inter, system-ui, sans-serif;
    font-size: 14px;
    line-height: 1.65;
}

.we-card-reveal-arrow {
    color: #7ac98e;

    font-family: Inter, system-ui, sans-serif;
    font-size: 13px;
    font-weight: 600;

    transform: translateX(-12px);

    transition:
        transform .65s cubic-bezier(.22, 1, .36, 1);
}


/* HOVER */

.we-card-reveal:hover .we-card-reveal-image {
    transform: scale(1.08);

    clip-path: inset(
        0 0 58% 0
    );
}

.we-card-reveal:hover .we-card-reveal-image span {
    opacity: 0;
    transform: translateY(-15px);
}

.we-card-reveal:hover .we-card-reveal-content {
    opacity: 1;
    transform: translateY(0);
}

.we-card-reveal:hover .we-card-reveal-arrow {
    transform: translateX(0);
}
JavaScript
document.querySelectorAll(".we-card-reveal").forEach(card => {

    const image = card.querySelector(
        ".we-card-reveal-image"
    );

    card.addEventListener("mousemove", event => {

        const rect = card.getBoundingClientRect();

        const x =
            (event.clientX - rect.left) /
            rect.width;

        const y =
            (event.clientY - rect.top) /
            rect.height;

        const moveX = (x - 0.5) * 5;
        const moveY = (y - 0.5) * 4;

        image.style.transform = `
            scale(1.08)
            translate(${moveX}px, ${moveY}px)
        `;
    });

    card.addEventListener("mouseleave", () => {

        image.style.transform =
            "scale(1) translate(0, 0)";
    });

});