cách sao chép bố cục xếp chồng div tuyệt đối của pinterest.com [đã đóng]


104

Tôi đang tìm cách sao chép bố cục div của Pinterest.com, cụ thể là cách số lượng cột điều chỉnh để phù hợp hơn / ít hơn khi thay đổi kích thước trình duyệt và việc xếp chồng theo chiều dọc không phụ thuộc vào chiều cao cột liền kề. Mã nguồn cho thấy rằng mỗi div là vị trí tuyệt đối. Một người đồng sáng lập đã trả lời một bài đăng trên Quora nói rằng nó được thực hiện với jQuery và CSS tùy chỉnh. Tôi muốn các kết quả được sắp xếp từ trái sang phải. Bất kỳ hướng nào bạn có thể cung cấp để thực hiện nó sẽ được đánh giá rất cao.


Tôi đã viết mã của riêng mình bằng Jquery và CSS đơn giản. Nếu bạn muốn điều này để thay đổi đã đổi kích thước bạn chỉ cần bọc nó trong một hàm và xem trên thay đổi kích thước trên yếu tố container jsfiddle.net/92gxyugb/1
Andrew WC Brown

Câu trả lời:


79

Bạn cũng có thể kiểm tra jQuery Plug-in Masonry , để biết loại chức năng này.


3
Thư viện thực sự tuyệt vời. Bây giờ tôi đang sử dụng nó mà không có bất kỳ vấn đề gì.
AhmetB - Google

183

Tôi đã viết kịch bản Pinterest. ID không liên quan đến bố cục và được sử dụng cho JS liên quan đến tương tác khác. Đây là cơ sở về cách nó hoạt động:

Tới trước:

  • Định vị tuyệt đối các hộp đựng ghim
  • Xác định chiều rộng cột
  • Xác định lề giữa các cột (rãnh)

Thiết lập một mảng:

  • Lấy chiều rộng của vùng chứa mẹ; tính toán số cột sẽ phù hợp
  • Tạo một mảng trống, có độ dài bằng số cột. Sử dụng mảng này để lưu trữ chiều cao của mỗi cột khi bạn xây dựng bố cục, ví dụ: chiều cao của cột 1 được lưu trữ dưới dạng mảng [0]

Lặp qua từng chốt:

  • Đặt mỗi ghim vào cột ngắn nhất tại thời điểm nó được thêm vào
  • "left:" === cột # (mảng chỉ số) nhân với chiều rộng cột + lề
  • "top:" === Giá trị trong mảng (chiều cao) cho cột ngắn nhất tại thời điểm đó
  • Cuối cùng, thêm chiều cao của ghim vào chiều cao cột (giá trị mảng)

Kết quả là nhẹ. Trong Chrome, việc tạo ra một trang đầy đủ hơn 50 chân chỉ mất <10 mili giây.


4
Làm thế nào để bạn có nghĩa là tính toán chiều cao của cột? Làm thế nào bạn biết nó phải cao bao nhiêu nếu bạn không biết số lượng và chiều cao của các mục bên trong nó? Bất kỳ cơ hội nào bạn có thể bố trí một số mã giả để chứng minh?
Michael Giovanni Pumo

22
đây là một hướng dẫn vững chắc - benholland.me/javascript/…
hollandben vào

1
Phản hồi từ một người dùng ẩn danh (được tìm thấy trong hàng đợi chỉnh sửa): Thật kỳ lạ là tôi đã thực hiện chính xác cùng một tập lệnh trong jQuery, với sự khác biệt nhỏ là thực sự tạo một bảng với 1 hàng và N cột và chỉ thêm chúng vào cột ngắn nhất từ ​​trái sang phải sự ưu tiên. Mặc dù tôi cũng đã thêm Hằng số "Chênh lệch độ cao tối thiểu" được yêu cầu để thực sự bỏ qua một cột khi định vị từ trái sang phải, điều này mang lại cho bố cục một màn hình hiển thị trực quan theo thứ tự thời gian mà không làm mất độ cao nhất có thể
vào

1
@MichaelGiovanniPumo Tôi nghĩ rằng chiều cao nên được biết trước khi bố trí (trong trường hợp của Pinterest), chúng không có trạng thái "ban đầu" có các div chồng lên nhau. Không thể thực hiện điều này nếu không biết chiều cao.
ptgamr

1
@ link hollandben là chết, liên kết mới: benholland.me/javascript/2012/02/20/...
Lukmo

57

Chúng tôi đã phát hành một plugin jQuery vì chúng tôi đã nhận được cùng một câu hỏi nhiều lần cho Wookmark . Nó tạo ra chính xác kiểu bố trí này. Xem nó ở đây - plugin Wookmark jQuery


4
Giải pháp này dường như tải nhanh hơn khối xây
Michael L Watson

bạn thấy cái nào tốt hơn wookmark hay khối xây?
Ramje

Tôi thích cái này hơn khối xây, có vẻ nhanh hơn như Michael đã nói.
nerdburn

2

Sau khi xem xét tất cả các tùy chọn, tôi đã kết thúc việc triển khai bố cục tương tự như Pinterest theo cách này:

Tất cả các DIV là:

div.tile {
    display: inline-block;
    vertical-align: top;
}

Điều này làm cho chúng định vị trong hàng tốt hơn so với khi chúng được thả nổi.

Sau đó, khi trang được tải, tôi lặp lại tất cả các DIV trong JavaScript để loại bỏ khoảng cách giữa chúng. Nó hoạt động tốt khi:

  1. Các DIV không khác nhau nhiều về chiều cao.
  2. Bạn không ngại một số vi phạm nhỏ về thứ tự (một số yếu tố bên dưới có thể được kéo lên phía trên).
  3. Bạn không ngại điểm mấu chốt là có chiều cao khác nhau.

Lợi ích của cách tiếp cận này - HTML của bạn có ý nghĩa đối với các công cụ tìm kiếm, có thể hoạt động với JavaScript bị vô hiệu hóa / bị chặn bởi tường lửa, chuỗi các phần tử trong HTML khớp với chuỗi logic (các mục mới hơn trước cũ hơn)


Này, bạn có thể cho tôi biết cách bạn tính toán phần bù mà bạn phải trừ đi không? Và bạn đã làm thế nào để giải quyết vấn đề phần tử cuối cùng nằm ở phía bên phải, bởi vì có một phần tử lớn hơn một chút và đẩy nó ở đó.
Lukas Oppermann

@LukasOppermann 1) Phần bù cho ô là tổng phần bù cho ô trong cùng một cột ở hàng trước đó và chênh lệch giữa chiều cao của ô cao nhất ở hàng trước đó và chiều cao của ô trong cùng một cột ở hàng trước. Hãy xem dev.sheeporpig.com/news (trước tiên bạn cần nhấp vào liên kết dev.sheeporpig.com/sheep/3210 để truy cập vào trang web phát triển - vì vậy bạn có thể xem các tập lệnh không được nén và nhận xét trong các tệp riêng biệt), tệp kịch bản stock_news.js, hàm tệp nén.
đặc biệt là

@LukasOppermann 2) Nếu bạn sử dụng CSS như trong câu trả lời (đặc biệt là display: inline-block) thì điều đó không xảy ra. Nó chỉ xảy ra nếu bạn float: left divs của bạn. Tôi không sử dụng phao.
đặc biệt là

0

Họ chia các thực thể theo cột với id (giải pháp không tốt ... tốt hơn nên sử dụng tên lớp) và sau đó tính toán vị trí theo nhóm cột


2
+1 Để xem qua mã nguồn của họ.
Bojangle

Đó là thú vị đối với tôi nhưng tôi nghĩ rằng có beter giải pháp với js tính toán ít
ant_Ti

display: inline-blockTôi cho rằng bạn có thể sử dụng , nhưng các vật phẩm có chiều cao dọc khác nhau sẽ không nằm cùng nhau.
tam giác

1
tốt hơn nên sử dụng các vùng chứa cột (div có float:left;và cuối cùng với overflow: hidden;) và lưu trữ các phần tử ở đó
ant_Ti

4
Điểm tốt. Nếu bạn thực sự muốn đi theo con đường JavaScript, bạn có thể sử dụng jQuery Masonry?
tam giác


0

Bạn có thể sử dụng phao và định kích thước chiều rộng div của mình bằng cách sử dụng tỷ lệ phần trăm cùng với chiều rộng tối thiểu để buộc các div tự động giảm xuống khi đạt đến chiều rộng tối thiểu? Đó là cách chúng tôi làm cho nó hoạt động trên http://www.goldtree.co.za/work

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.