+4

Làm hiệu ứng hover 3D "khá xịn" với thuộc tính transform

Sau một thời gian tiếp xúc và làm việc với CSS, mình muốn thử làm ra một hiệu ứng hover "xịn sò" nhất có thể với những kiến thức đã có. Vậy là sau vài giờ đồng hồ mầy mò kết hợp với một ít Jquery, đây là kết quả mình đạt được.

Trong bài viết này mình sẽ hướng dẫn các bạn cách để làm được hiệu ứng như trên.

Phần 1. Chuẩn bị

Trước tiên, chúng ta tạo ra một element với class .card với tác dụng như một container chứa những element khác.

<div class="card">
    <div class="card__img-wrapper"><img class="card__img" src=""/></div>
    <p class="card__title">Forest Road</p>
</div>

Để cho dễ nhìn hơn thì chúng ta sẽ style cho body center .card vào giữa màn hình.

body {
    background: linear-gradient(to bottom, #355c7d, #6c5b7b, #c06c84);
    display: flex;
    height: 100vh;
    perspective: 1000px;
    transform-style: preserve-3d;
    overflow: hidden;
    font-family: 'Macondo Swash Caps', cursive;
}

.card {
    margin: auto;
}

Sau đó chúng ta sẽ style cho ảnh và chữ

.card {
    margin: auto;
    position: relative;
}

.card__img-wrapper {
    border-radius: 15px;
    width: 300px;
    height: 450px;
    background: transparent;
    overflow: hidden;
}

.card__img {
    display: block;
    margin: -20% 0 0 -20%;
    width: 140%;
    height: 140%;
    object-fit: cover;
    backface-visible: hidden;
    vertical-align: middle;
}

.card__title {
    position: absolute;
    bottom: 0;
    color: #fff;
    padding: 5px;
    font-size: 30px;
    width: 100%;
    transition: all .3s ease;
    cursor: default;
    background: transparent;
    transition: all .3s ease;
}

Vậy là có được kết quả như sau.

Nhìn cũng khá ok, nhưng để cho chất hơn nữa chúng ta sẽ bắt tay vào làm hiệu ứng khi hover

Phần 2. Viết Jquery

Trước tiên, chúng ta sẽ detect 2 sự kiện mousemovemouseleave trong element .card.

$(function(){
    $('.card').mousemove(function(ev){
        // Do something when mouse move
    });

    $('.card').mouseleave(function(ev) {
        // Do something when mouse leave
    });
})

Trong sự kiện mousemove chúng ta sẽ tìm đến vị trí con trỏ chuột khi di chuột trong .card sau đó tính toán để áp dụng vào transform.

$('.card').mousemove(function(ev){
    let parentWidth = $(this).width();  // Chiều rộng div cha
    let parentHeight = $(this).height();  // Chiều dài div cha
    let mouseX = ev.pageX - $(this).offset().left;  // Vị trí x chuột trong div cha
    let mouseY = ev.pageY - $(this).offset().top;  // Vị trí y chuột trong div cha
    let x = (parentWidth/2 - mouseX)/15;
    let y = -(parentHeight/2 - mouseY)/15;
    
    $(this).css({
      'transform': 'rotateX('+ y +'deg) rotateY('+ 2*x +'deg) translateZ(50px)',
      'transition': 'all .15s ease'
    });
    
    $(this).find('.card__img').css({
      'transform': 'scale(1.05) translateX('+ -5*x +'px) translateY('+ -5*y +'px)',
      'transition': 'all .15s ease'
    });
});

Sau đó, chúng ta sẽ trả .card. về trạng thái ban đầu sau khi mouseleave

$('.card').mouseleave(function(ev) {
    $(this).css({
      'transform': 'rotateX(0) rotateY(0)',
      'transition': 'all .6s ease'
    });

    $(this).find('.card__img').css({
      'transform': 'scale(1) translateX(0px) translateY(0px) translateZ(0)',
      'transition': 'all .6s ease'
    });
});

Lời kết

Vậy là chúng ta đã tạo được ra hiệu ứng hover khá đẹp mắt. Các bạn cứ thoải mái chỉnh sửa để tạo ra được những hiệu ứng chất hơn nhé. Xin cảm ơn


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí