Vissza az animációkhoz
Hover effektek

Térbeli üveglap

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

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

    <div class="we-glass3d-reflection"></div>

    <div class="we-glass3d-content">
        <span>WebElements</span>

        <strong>
            Térbeli üveglap
        </strong>

        <small>
            Finom 3D perspektíva és fényvisszaverődés
        </small>
    </div>

</div>
CSS
.we-hover-glass3d {
    width: 100%;
    max-width: 440px;
    height: 190px;
    margin: 60px auto;

    position: relative;
    overflow: hidden;

    display: flex;
    align-items: center;

    padding: 40px;
    box-sizing: border-box;

    background:
        linear-gradient(
            135deg,
            rgba(255,255,255,.04),
            rgba(142,232,212,.025)
        ),
        #0a1014;

    border: 1px solid rgba(142,232,212,.24);
    border-radius: 20px;

    color: #f2f4f0;
    font-family: Arial, sans-serif;

    transform-style: preserve-3d;
    perspective: 1200px;

    transition:
        transform .18s ease-out,
        box-shadow .45s ease,
        border-color .45s ease;
}


/* ÜVEGREFLEX */

.we-glass3d-reflection {
    position: absolute;
    z-index: 2;

    width: 65%;
    height: 180%;

    top: -40%;
    left: var(--reflection-x, 15%);

    transform:
        rotate(25deg)
        translateX(-80%);

    background:
        linear-gradient(
            90deg,
            transparent,
            rgba(255,255,255,.035),
            rgba(255,255,255,.32),
            rgba(142,232,212,.10),
            transparent
        );

    filter: blur(2px);

    opacity: 0;

    transition:
        left .12s ease-out,
        opacity .35s ease;

    pointer-events: none;
}


/* FINOM FÉNYFELÜLET */

.we-hover-glass3d::before {
    content: "";

    position: absolute;
    inset: 0;

    background:
        radial-gradient(
            circle at var(--reflection-x, 50%)
                       var(--reflection-y, 50%),
            rgba(142,232,212,.14),
            transparent 38%
        );

    opacity: 0;

    transition: opacity .4s ease;

    pointer-events: none;
}


/* TARTALOM */

.we-glass3d-content {
    position: relative;
    z-index: 3;

    transform: translateZ(35px);

    transition:
        transform .3s ease;
}

.we-glass3d-content span {
    display: block;

    margin-bottom: 12px;

    font-size: 11px;
    letter-spacing: 4px;
    text-transform: uppercase;

    color: #8ee8d4;
}

.we-glass3d-content strong {
    display: block;

    font-size: 27px;
    font-weight: 500;
}

.we-glass3d-content small {
    display: block;

    margin-top: 10px;

    font-size: 13px;
    color: rgba(242,244,240,.62);
}


/* HOVER */

.we-hover-glass3d:hover {

    border-color:
        rgba(142,232,212,.65);

    box-shadow:
        0 30px 65px rgba(0,0,0,.55),
        0 0 40px rgba(142,232,212,.12);
}

.we-hover-glass3d:hover::before {
    opacity: 1;
}

.we-hover-glass3d:hover .we-glass3d-reflection {
    opacity: 1;
}
JavaScript
const glass3D = document.querySelector('.we-hover-glass3d');

glass3D.addEventListener('mousemove', function(e) {

    const rect = this.getBoundingClientRect();

    const x = e.clientX - rect.left;
    const y = e.clientY - rect.top;

    const centerX = rect.width / 2;
    const centerY = rect.height / 2;

    const rotateY =
        ((x - centerX) / centerX) * 7;

    const rotateX =
        ((centerY - y) / centerY) * 7;

    const reflectionX =
        (x / rect.width) * 100;

    const reflectionY =
        (y / rect.height) * 100;

    this.style.transform =
        `perspective(1200px)
         rotateX(${rotateX}deg)
         rotateY(${rotateY}deg)
         translateY(-8px)
         scale(1.015)`;

    this.style.setProperty(
        '--reflection-x',
        reflectionX + '%'
    );

    this.style.setProperty(
        '--reflection-y',
        reflectionY + '%'
    );

});

glass3D.addEventListener('mouseleave', function() {

    this.style.transform =
        'perspective(1200px) rotateX(0deg) rotateY(0deg) translateY(0) scale(1)';

});