Yêu cầu thg 3 18, 2019 4:40 SA 355 0 3
  • 355 0 3
0

Div bị trồng lên nhau khi append bằng AJAX, thư viện Mansory

Chia sẻ
  • 355 0 3

Mình có sử dụng thư viện Mansory để làm layout, khi dùng AJAX để append dữ liệu mới thì gặp phải vấn đề ảnh bị trồng lên nhau ở 1 số vị trí. Nó sẽ tự hết khi scroll hoặc resize màn hình. Ai dùng thư viện này rồi có thể cho mình hướng xử lý được không nhỉ?

Trồng lên nhau

Kết quả mong muốn

js

for (var i = 0; i < data.length; i++) {
    let content = '<div class="grid-item photo">'
                +'<a href="'+route('recipe.detail', data[i].slug)+'">'
                +'<div class="item-content">'
                +'<img class="photothumb" src="'+data[i].finished_image+'">'
                +'<div class="item-desc">'
                +'<span class="recipe-name">'+data[i].name+'</span>'
                +'<div class="user-information">'
                +'<a href="">'
                +'<img src="'+data[i].user.avatar+'">&nbsp;'
                +'<span>'+data[i].user.name+'</span>'
                +'</a>'
                +'</div>'
                +'<div class="button-block">'
                +'<a href="javascript:;" class="btn-like"><i class="fa fa-heart-o" aria-hidden="true"></i>&nbsp;'
                +'<span>'+data[i].liked+'</span></a>'
                +'<a href="javascript:;" class="btn-save"><i class="fa fa-thumb-tack" aria-hidden="true"></i>&nbsp;'
                +'<span>'+data[i].thumbtacked+'</span></a>'
                +'</div>'
                +'</div>'
                +'</div>'
                +'</a>'
                +'</div>';

    let $content = $(content)
    $grid.append( $content ).masonry( 'appended', $content );
    $grid.masonry('layout');
}

3 CÂU TRẢ LỜI


Đã trả lời thg 3 18, 2019 6:11 CH
Đã được chấp nhận
+2

Khả năng cao là khi ajax ảnh của bạn chưa kịp load mà đã đc append vào dom nên nó tính sai về kích thước gây ảnh bị chồng. Mình thấy phần lớn là do nó. Masonry hay đi với thư viện imagesload để xử lý cái này:

$grid.imagesLoaded().progress( function() {
    $grid.masonry('layout');
});

Hoặc bạn có thể reload lại mỗi khi append xem

jQuery("#content").append(el).masonry( 'reload' );

Hoặc tự kích hoạt sự kiện scroll or resize để fix.

Link tham khảo có khá nhiều cách ko biết bạn trong trường hợp nào mình cũng từng bị và fix bằng cách thử từng cách 1 mà tìm đc 👍

Chia sẻ
Avatar Nguyen Tuan Anh @TuanAnh9996
thg 3 19, 2019 2:23 SA

okay bạn, để mình thử xem. Nhưng nếu mà tự dùng sự kiện scroll hoặc resize thì có ảnh hưởng đến trải nghiệm người dùng không nhỉ?

Đã trả lời thg 3 19, 2019 2:48 SA
0

Mình dùng cách

$grid.imagesLoaded().progress( function() {
    $grid.masonry('layout');
});

Còn dùng method Reload thì mansory báo là not valid method

jQuery("#content").append(el).masonry( 'reload' );

Chia sẻ
Avatar Lê Vĩnh Thiện @le.vinh.thien
thg 3 20, 2019 3:28 CH

vậy là đã fix rồi à?

Avatar Nguyen Tuan Anh @TuanAnh9996
thg 3 20, 2019 3:44 CH

@le.vinh.thien mình tích Accept answer rồi kìa bạn 😄

Đã trả lời thg 12 22, 2020 8:12 SA
0

Bạn dùng thử cách này $(".grid-item img").on("load", function (event) { $grid.masonry('layout'); })

Chia sẻ
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í