Có cách nào để chia danh sách thành các cột không?


119

Trang web của tôi có danh sách 'nhỏ': ví dụ: danh sách 100 mục, mỗi mục có độ dài một từ. Để giảm việc cuộn, tôi muốn trình bày danh sách này trong hai hoặc thậm chí bốn cột trên trang. Tôi nên làm như thế nào với CSS?

<ul>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
</ul>

Tôi thích giải pháp linh hoạt để nếu danh sách tăng lên 200 mục, tôi không phải thực hiện nhiều điều chỉnh thủ công để phù hợp với danh sách mới.


Có một thư viện mà làm thế - github.com/yairEO/listBreaker
vsync

Tôi tin rằng tùy chọn cột CSS sẽ làm được. Tùy chọn này rất dễ sử dụng và thay đổi nếu có nhu cầu. Ở đây bạn có nó giải thích chi tiết - kolosek.com/css-columns
Nesha Zoric

Câu trả lời:


254

Giải pháp CSS là: http://www.w3.org/TR/css3-multicol/

Hỗ trợ trình duyệt chính xác là những gì bạn mong đợi ..

Nó hoạt động "ở mọi nơi" ngoại trừ Internet Explorer 9 trở lên: http://caniuse.com/multicolumn

ul {
    -moz-column-count: 4;
    -moz-column-gap: 20px;
    -webkit-column-count: 4;
    -webkit-column-gap: 20px;
    column-count: 4;
    column-gap: 20px;
}

Xem: http://jsfiddle.net/pdExf/

Nếu cần hỗ trợ IE, bạn sẽ phải sử dụng JavaScript, ví dụ:

http://welcome.totheinter.net/columnizer-jquery-plugin/

Một giải pháp khác là để dự phòng bình thường float: leftcho chỉ IE . Thứ tự sẽ sai, nhưng ít nhất nó sẽ trông giống nhau:

Xem: http://jsfiddle.net/NJ4Hw/

<!--[if lt IE 10]>
<style>
li {
    width: 25%;
    float: left
}
</style>
<![endif]-->

Bạn có thể áp dụng dự phòng đó với Modernizr nếu bạn đã sử dụng nó.


Có cách nào để loại bỏ đường viền trên cùng trên đầu tiên litrong mỗi cột?
Có Barry

2
Điều này hoạt động tốt cho một không gian cố định, nhưng trở thành một vấn đề với các thiết kế đáp ứng vì các cột không bị thu gọn như khi sử dụng display: inline hoặc inline-block.
Unixac

4
Thực tế thú vị: IE là trình duyệt lớn duy nhất máy tính để bàn để hỗ trợ đầy đủ tính năng này mà không có tiền tố (kể từ khi IE10) ... Oh, sự trớ trêu ...
NemoStein

1
list-style-position: inside;Tôi tin rằng có thể cần hỗ trợ trình duyệt chéo tốt hơn để bao gồm thuộc tính bổ sung này nhằm giải quyết cụ thể vấn đề được chỉ ra bởi @vsync.
ThisClark

4
@PrafullaKumarSahu: Hãy thử li { break-inside: avoid; }: jsfiddle.net/thirtydot/pdExf/903 . Tôi không quá quen thuộc với các cột CSS, vì vậy có thể có một cách tốt hơn.
31

19

Nếu bạn đang tìm kiếm một giải pháp hoạt động được trong IE, bạn có thể thả nổi các phần tử danh sách sang bên trái. Tuy nhiên, điều này sẽ dẫn đến một danh sách xung quanh, như sau:

item 1 | item 2 | item 3
item 4 | item 5

Thay vì các cột gọn gàng, như:

item 1 | item 4
item 2 | 
item 3 | 

Mã để làm điều đó sẽ là:

ul li {
  width:10em;
  float:left;
}

Bạn có thể thêm đường viền dưới cùng vào các lis để làm cho dòng chảy của các mục từ trái sang phải rõ ràng hơn.


trong khi nó có thể hoạt động với một số mục cụ thể, kết quả sẽ không đẹp cho chỉ 2 mục.
vsync

Một giải pháp CSS hoạt động khác cho "các cột gọn gàng": stackoverflow.com/q/54982323/1066234
Kai Noack

10

Nếu bạn muốn một số cột đặt trước, bạn có thể sử dụng cột đếm và khoảng cách cột, như đã đề cập ở trên.

Tuy nhiên, nếu bạn muốn một cột duy nhất có chiều cao hạn chế có thể chia thành nhiều cột hơn nếu cần, điều này có thể đạt được khá đơn giản bằng cách thay đổi hiển thị thành linh hoạt.

Điều này sẽ không hoạt động trên IE9 và một số trình duyệt cũ khác. Bạn có thể kiểm tra hỗ trợ trên Tôi có thể sử dụng không

<style>
  ul {
    display: -ms-flexbox;           /* IE 10 */
    display: -webkit-flex;          /* Safari 6.1+. iOS 7.1+ */
    display: flex;
    -webkit-flex-flow: wrap column; /* Safari 6.1+ */
    flex-flow: wrap column;
    max-height: 150px;              /* Limit height to whatever you need */
  }
</style>

<ul>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
</ul>


2
Rất gần với những gì tôi đang theo đuổi. Nhược điểm duy nhất là chiều rộng của các cột không thích ứng với nội dung (hãy thử với các mục có độ dài khác nhau). Không chắc chắn chiều rộng cột được xác định như thế nào. Có thể là với của phần tử đầu tiên? Trong mọi trường hợp, bất kỳ chỉ dẫn về cách khắc phục điều này?
jorgeh

Có thể giới hạn số lượng cột hơn là chiều cao không? Tôi cần các mục để điền vào bốn cột và css column-countsẽ thực hiện số lượng hàng không đồng đều trong các cột. Giống như 6 mục trong cột đầu tiên, sau đó là 4, sau đó 6, rồi 5.
Virge Assault

Sẽ rất tuyệt nếu bạn gắn nhãn các mục, ví dụ: "Mục 1", "Mục 2" để người xem có thể thấy dòng chảy của các yếu tố
allkenang

3

Câu trả lời này không nhất thiết phải mở rộng quy mô mà chỉ yêu cầu điều chỉnh nhỏ khi danh sách phát triển. Về mặt ngữ nghĩa, nó có vẻ hơi phản trực quan vì nó là hai danh sách, nhưng ngoài điều đó ra, nó sẽ trông theo cách bạn muốn trong bất kỳ trình duyệt nào từng tạo.

ul {
  float: left;
}

ul > li {
  width: 6em;
}
<!-- Column 1 -->
<ul>
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Item 3</li>
</ul>
<!-- Column 2 -->
<ul>
  <li>Item 4</li>
  <li>Item 5</li>
  <li>Item 6</li>
</ul>


2

2020 - giữ cho nó đơn giản, sử dụng CSS Grid

Rất nhiều câu trả lời trong số này đã lỗi thời, đó là năm 2020 và chúng tôi không nên cho phép những người vẫn đang sử dụng IE9. Cách đơn giản hơn là chỉ sử dụng lưới CSS .

Mã này rất đơn giản và bạn có thể dễ dàng điều chỉnh số lượng cột đang sử dụng grid-template-columns. Xem điều này và sau đó chơi với trò chơi này để phù hợp với nhu cầu của bạn.

.grid-list {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
}
<ul class="grid-list">
  <li>item</li>
  <li>item</li>
  <li>item</li>
  <li>item</li>
  <li>item</li>
  <li>item</li>
  <li>item</li>
  <li>item</li>
  <li>item</li>
  <li>item</li>
  <li>item</li>
  <li>item</li>
</ul>


1
Đây là giải pháp tốt nhất cho tôi.
Patee Gutee

1

Tôi nhận thấy rằng (hiện tại) Chrome ( Version 52.0.2743.116 m) có rất nhiều câu hỏi và vấn đề với css column-countliên quan đến các mục tràn và các phần tử được định vị tuyệt đối bên trong các mục, đặc biệt là với một số chuyển đổi thứ nguyên ..

đó là một mớ hỗn độn và không thể sửa chữa được, vì vậy tôi đã thử giải quyết vấn đề này thông qua javascript đơn giản và đã tạo một thư viện thực hiện điều đó - https://github.com/yairEO/listBreaker

Trang demo


Tôi thích plugin jQuery columnizer, theo ý kiến ​​của tôi, nó có chức năng tốt hơn cho những gì tôi đang làm (có thể sắp xếp theo thứ tự bảng chữ cái, giảm dần hoặc tăng dần, số cột, chiều rộng cột và hơn thế nữa). jQuery Columnizer - WelcomeToTheInter.Net
Brandito

@Brandito - tốt, mã Columnizer chắc chắn có thêm nhiều lựa chọn, vì nó gần một 1.000 dòng mã, so với tôi đó là khoảng 120 dòng .. nhưng không được công việc tốt
vsync

có nhưng vấn đề của tôi cần danh sách ở lại như một danh sách, điều gì hữu ích hơn / cần thiết hơn tùy thuộc vào trường hợp sử dụng.
Brandito

0

Nếu bạn có thể hỗ trợ nó, CSS Grid có lẽ là cách tốt nhất để tạo danh sách một chiều thành bố cục hai cột với nội thất đáp ứng.

ul {
  max-width: 400px;
  display: grid;
  grid-template-columns: 50% 50%;
  padding-left: 0;
  border: 1px solid blue;
}

li {
  list-style: inside;
  border: 1px dashed red;
  padding: 10px;
}
<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
  <li>5</li>
  <li>6</li>
  <li>7</li>
  <li>8</li>
  <li>9</li>
<ul>

Đây là hai dòng chính sẽ cung cấp cho bạn bố cục 2 cột của bạn

display: grid;
grid-template-columns: 50% 50%;

0

Cách ưu tiên cho thiết bị di động là sử dụng CSS Columns để tạo trải nghiệm cho màn hình nhỏ hơn, sau đó sử dụng Media Queries để tăng số lượng cột tại mỗi điểm ngắt được xác định trong bố cục của bạn.

ul {
  column-count: 2;
  column-gap: 2rem;
}
@media screen and (min-width: 768px)) {
  ul {
    column-count: 3;
    column-gap: 5rem;
  }
}
<ul>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
</ul>


0

Đây là những gì tôi đã làm

ul {
      display: block;
      width: 100%;
}

ul li{
    display: block;
    min-width: calc(30% - 10px);
    float: left;
}

ul li:nth-child(2n + 1){
    clear: left;
}
<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
  <li>5</li>
  <li>6</li>
  <li>7</li>
  <li>8</li>
  <li>9</li>
  <li>0</li>
</ul>

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.