So sánh hình ảnh trước/sau bằng HTML5

So sánh hình ảnh trước và sau là hiệu ứng thường gặp trong các trang web về chỉnh sửa ảnh, phục hồi ảnh, làm đẹp hoặc giới thiệu tính năng. Trong bài viết này, bạn sẽ học cách tạo một khung so sánh ảnh đơn giản, chỉ bằng HTML5, CSS3 và JavaScript, không cần thư viện ngoài.

So sánh hình ảnh trước/sau bằng HTML5
Mục lục

Xem demo Tải về

HTML

Phần khung HTML gồm một thẻ <div> chứa hình ảnh nền, một lớp phủ để so sánh, và thanh trượt để điều chỉnh tỷ lệ hiển thị.

<div id="comparison">
    <figure>
        <div id="divisor"></div>
    </figure>
    <input type="range" min="0" max="100" value="50" id="slider" oninput="moveDivisor();">
</div>

CSS

CSS định hình khung so sánh, thiết lập ảnh nền, ảnh lớp phủ, và tùy chỉnh giao diện thanh trượt để phù hợp với mọi thiết bị.

div#comparison { 
    width: 60vw;
    height: 60vw;
    max-width: 600px;
    max-height: 600px;
    overflow: hidden;
    position: relative;
}

div#comparison figure { 
    background-image: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/4273/photoshop-face-before.jpg);
    background-size: cover;
    font-size: 0;
    width: 100%;
    height: 100%;
    margin: 0;
}

div#comparison figure > img {
    position: relative;
    width: 100%;
}

div#comparison figure div { 
    background-image: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/4273/photoshop-face-after.jpg);
    background-size: cover;
    position: absolute;
    width: 50%;
    box-shadow: 0 5px 10px -2px rgba(0,0,0,0.3);
    overflow: hidden;
    bottom: 0;
    height: 100%;
}

input[type=range]{
    -webkit-appearance:none;
    -moz-appearance:none;
    position: relative;
    top: -2rem;
    left: -2%;
    background-color: rgba(255,255,255,0.1);
    width: 102%;
}

input[type=range]:focus { 
    outline: none;
}

input[type=range]:active {
    outline: none;
}

input[type=range]::-moz-range-track {
    -moz-appearance:none;
    height:15px;
    width: 98%;
    background-color: rgba(255,255,255,0.1);
    position: relative;
    outline: none;   
}

input[type=range]::active {
    border: none;
    outline: none;
}

input[type=range]::-webkit-slider-thumb {
    -webkit-appearance:none;
    width: 20px;
    height: 15px;
    background: #fff;
    border-radius: 0;
}

input[type=range]::-moz-range-thumb {
    -moz-appearance: none;
    width: 20px;
    height: 15px;
    background: #fff;
    border-radius: 0;
}

input[type=range]:focus::-webkit-slider-thumb {
    background: rgba(255,255,255,0.5);
}

input[type=range]:focus::-moz-range-thumb {
    background: rgba(255,255,255,0.5);
}

JavaScript

JavaScript rất ngắn gọn: chỉ cần điều chỉnh chiều rộng của lớp phủ ảnh theo giá trị thanh trượt.

divisor = document.getElementById('divisor');
slider = document.getElementById('slider');

function moveDivisor() {
    divisor.style.width = slider.value + '%';
}

window.onload = function() {
    moveDivisor();
};

Bạn có thể mở rộng thêm bằng cách thêm nhãn cho ảnh “Trước / Sau”, hoặc tích hợp plugin slider chuyên dụng nếu cần hiệu ứng nâng cao hơn.

Chúc các bạn thành công!

Bình luận


4 bình luận
  • HaiNguyen

    18/08/2018 lúc 13:30

    bạn thử làm chưa hay chỉ đi copy ở đâu đâu về, tôi làm theo mà có được đâu, chỉ có ảnh với cái khung, kéo nó ko chạy được nè

    • Admin

      18/08/2018 lúc 13:32

      đương nhiên là có, mình đã chạy trên chính website này tại bài https://inithtml.com/tai-nguyen/xu-ly-anh-scan-bi-nhieu-lem-bang-photoshop/, cái demo đó là mình làm thử, bạn có thể tải về để so sánh.

    • Admin

      18/08/2018 lúc 13:32

      vì nó cần sự kiện window.onload là khi trang tải xong toàn bộ, trên 2 cái trang test code đó thì k có sự kiện đó.

    • Admin

      18/08/2018 lúc 13:32

      cái đó mình tách riêng, có làm thì vứt CSS vào thẻ

      , còn JS thì trong là xong liền mà
      https://uploads.disquscdn.com/images/ed657ff2cafcf8a0b3b0cd1b0ebf77e9a178b7c4321a61f3260874d5c2eaf0de.jpg

Init Toolbox

Nhấn Ctrl + \ trên máy tính, hoặc vuốt sang trái ở bất kỳ đâu trên mobile.

Đăng nhập





Đang tải...