Sırasız bir liste iki sütunda nasıl görüntülenir?


215

Aşağıdaki HTML ile, listeyi iki sütun olarak görüntülemek için en kolay yöntem nedir?

<ul>
    <li>A</li>
    <li>B</li>
    <li>C</li>
    <li>D</li>
    <li>E</li>
</ul>

İstenilen ekran:

A B
C D
E

Çözümün Internet Explorer üzerinde çalışabilmesi gerekir.


1
Jquery'de kolayca nasıl yapılacağına dair canlı bir örnek: jsfiddle.net/EebVF/5 Bu jquery eklentisini kullanarak: github.com/fzondlo/jquery-columns - Bunu CSS'den daha iyi seviyorum çünkü CSS çözümü ile her şey hizalanmıyor dikey olarak yukarı.
newUserName Burada

Yanıtlar:


371

Modern Tarayıcılar

aradığınızı desteklemek için css3 sütun modülünden yararlanın.

http://www.w3schools.com/cssref/css3_pr_columns.asp

CSS:

ul {
  columns: 2;
  -webkit-columns: 2;
  -moz-columns: 2;
}

http://jsfiddle.net/HP85j/8/

Eski Tarayıcılar

Ne yazık ki IE desteği için JavaScript ve dom manipülasyonu içeren bir kod çözümüne ihtiyacınız olacak. Bu, listenin içeriği her değiştiğinde listeyi sütunlara göre yeniden sıralamak ve yeniden yazdırmak için işlemi yapmanız gerekeceği anlamına gelir. Aşağıdaki çözüm kısalık için jQuery kullanır.

http://jsfiddle.net/HP85j/19/

HTML:

<div>
    <ul class="columns" data-columns="2">
        <li>A</li>
        <li>B</li>
        <li>C</li>
        <li>D</li>
        <li>E</li>
        <li>F</li>
        <li>G</li>
    </ul>
</div>

JavaScript:

(function($){
    var initialContainer = $('.columns'),
        columnItems = $('.columns li'),
        columns = null,
        column = 1; // account for initial column
    function updateColumns(){
        column = 0;
        columnItems.each(function(idx, el){
            if (idx !== 0 && idx > (columnItems.length / columns.length) + (column * idx)){
                column += 1;
            }
            $(columns.get(column)).append(el);
        });
    }
    function setupColumns(){
        columnItems.detach();
        while (column++ < initialContainer.data('columns')){
            initialContainer.clone().insertBefore(initialContainer);
            column++;
        }
        columns = $('.columns');
    }

    $(function(){
        setupColumns();
        updateColumns();
    });
})(jQuery);

CSS:

.columns{
    float: left;
    position: relative;
    margin-right: 20px;
}

DÜZENLE:

Aşağıda belirtildiği gibi bu sütunları aşağıdaki gibi sıralayacaktır:

A  E
B  F
C  G
D

OP aşağıdakilerle eşleşen bir değişken istedi:

A  B
C  D
E  F
G

Değişkeni gerçekleştirmek için kodu aşağıdaki şekilde değiştirmeniz yeterlidir:

function updateColumns(){
    column = 0;
    columnItems.each(function(idx, el){
        if (column > columns.length){
            column = 0;
        }
        $(columns.get(column)).append(el);
        column += 1;
    });
}

2
Öğeleri doğru sırada görüntülemiyorsunuz: jsfiddle.net/HP85j/258 Örneğin, ilk satırda istenen ekran A B(ikinci öğenin sağa eklenmesi gerekir), ancak örneklerinizde A E.
Paolo Moretti

1
Harika bir çalışma, 2'den fazla sütun varsa mantık kusurlu olmasına rağmen, burada düzeltmeyi oluşturdum: jsfiddle.net/HP85j/393
Tr1stan

2
kurşunlar eksik
Jaider

1
Muhtemelen listenin 2. sütundan önce 1. sütunu doldurmasını istemek daha olasıdır. Listedeki öğeleri yeniden sıralamak daha kolay olabilir, böylece aşağıdan önce doldurulmuş görünürler. Tabii ki liste değişirse yeniden yapılması gerekebilir. Her neyse, Gabriel'in CSS yanıtı tam ihtiyacım olan şeydi, teşekkürler!
15'te Punstress

3
Geç bir güncelleme, ilk seçeneğin şimdi modern IE tarayıcılarda çalışacağına inanıyorum.
Fizz

82

@ Jaider'ın çözümüne bakıyordum ama çalışmanın daha kolay olduğunu ve tarayıcılarda iyi olduğunu düşündüğüm biraz farklı bir yaklaşım öneriyorum.

ul{
    list-style-type: disc;
    -webkit-columns: 2;
    -moz-columns: 2;
    columns: 2;
    list-style-position: inside;//this is important addition
}

Varsayılan olarak sıralanmamış liste, mermi konumunu dışarıda görüntüler, ancak bazı tarayıcılarda, tarayıcınızın web sitenizi düzenleme şekline bağlı olarak bazı görüntü sorunlarına neden olur.

Biçimde görüntülenmesini sağlamak için:

A B
C D
E

vb. aşağıdakileri kullanın:

ul li{
    float: left;
    width: 50%;//helps to determine number of columns, for instance 33.3% displays 3 columns
}
ul{
    list-style-type: disc;
}

Bu, sütun görüntüleme ile ilgili tüm sorunlarınızı çözmelidir. Tüm iyi ve teşekkürler @ jaider yanıt olarak bu keşfetmek için bana rehberlik yardımcı oldu.


3
Bu yöntemle ilgili bir sorun var. Çok kısa (bu örnekte 1 karakter) liste öğelerini görüntülemek için harika çalışır. Daha uzun açıklamaları olan bir liste oluşturun ve ikinci sütun ilk konteynerle çakışır, ayrıca ul kabından dışarı çıkar.
Shaggy

1
Bunu şamandıra değiştirerek hafifçe değiştirdim: görüntülemek için sol: li elemanları için satır içi blok, bunun dışında benim için harikalar yarattı.
ZeRemz

41

Bunu bir yorum olarak yayınlamayı denedim, ancak sütunları doğru görüntülemek için alamadım (sorunuza göre).

Siz isteyin:

AB

CD

E

... ama çözüm olarak kabul edilen cevap geri dönecek:

AD

BE

C

... ya cevap yanlış ya da soru doğru.

Çok basit bir çözüm sizin genişliğini ayarlamak <ul>ve daha sonra yüzer ve <li>öğelerinizin genişliğini ayarlamak gibi olacaktır

<ul>
    <li>A</li>
    <li>B</li>
    <li>C</li>
    <li>D</li>
    <li>E</li>
</ul>

ul{
    width:210px;
}
li{
    background:green;
    float:left;
    height:100px;
    margin:0 10px 10px 0;
    width:100px;
}
li:nth-child(even){
    margin-right:0;
}

Burada örnek http://jsfiddle.net/Jayx/Qbz9S/1/

Sorunuz yanlışsa, önceki yanıtlar geçerlidir (IE desteğinden yoksun bir JS düzeltmesi ile).


@Gabriel çözümün ve davranış iyi ve beklendiği gibi, bu yüzden cevabını çalmaya çalışmıyorum hey ... Sadece sorunun yanlış yorumlanmış olabileceğini düşünüyorum ... her iki durumda da - soru olursa olsun cevaplandı doğru soru: D
Jayx

16

Modern tarayıcılar için çözümü seviyorum, ancak mermiler eksik, bu yüzden biraz hile ekliyorum:

http://jsfiddle.net/HP85j/419/

ul {
    list-style-type: none;
    columns: 2;
    -webkit-columns: 2;
    -moz-columns: 2;
}


li:before {
  content: "• ";
}

resim açıklamasını buraya girin


Burada merminin rengini değiştirmeden öğelerin rengini değiştirebiliriz jsfiddle.net/HP85j/444
Jaider

3
Bence list-style-position: inside;mermilerin düzgün bir şekilde ortaya çıkması için daha iyi bir çözüm.
Alexis Wilke

11

İşte olası bir çözüm:

Pasaj:

ul {
  width: 760px;
  margin-bottom: 20px;
  overflow: hidden;
  border-top: 1px solid #ccc;
}
li {
  line-height: 1.5em;
  border-bottom: 1px solid #ccc;
  float: left;
  display: inline;
}
#double li {
  width: 50%;
}
<ul id="double">
  <li>first</li>
  <li>second</li>
  <li>third</li>
  <li>fourth</li>
</ul>

Ve bitti.
3 sütun için ligenişliği% 33, 4 sütun için% 25 ve benzeri kullanın.


5

Bunu yapmanın en basit yolu budur. Yalnızca CSS.

  1. ul öğesine genişlik ekler.
  2. display: inline-block ve yeni sütunun genişliği (ul genişliğinin yarısından az olmalıdır).
ul.list {
  width: 300px;  
}

ul.list li{
  display:inline-block;
  width: 100px;
}
<ul class="list">
    <li>A</li>
    <li>B</li>
    <li>C</li>
    <li>D</li>
    <li>E</li>
</ul>

2
Bu cevabın OP'nin mevcut sorunu
çözmede

4

CSS'yi yalnızca iki veya daha fazla sütun ayarlamak için kullanabilirsiniz

AE

B

C

D

 <ul class="columns">
    <li>A</li>
    <li>B</li>
    <li>C</li>
    <li>D</li>
    <li>E</li>
</ul>

ul.columns  {
   -webkit-columns: 60px 2;
   -moz-columns: 60px 2;
    columns: 60px 2;
   -moz-column-fill: auto;
   column-fill: auto;
 }


2

Bunu, jQuery-Columns Eklentisi ile kolayca yapabilirsiniz , örneğin bir ul'u .mylist sınıfıyla bölmek için

$('.mylist').cols(2);

İşte jsfiddle'da canlı bir örnek

Bunu CSS ile olduğundan daha çok seviyorum çünkü CSS çözümü ile her şey dikey olarak en üste hizalanmıyor.


İlginç, ama aslında <ul>listeyi birden fazla listede parçalara ayırıyor ... Bu diğer şeyleri zorlaştırabilir.
Alexis Wilke

Bu aslında ben teşekkür sonra çözüm oldu, downvoter için OP sorusunu okursanız ve DV gerek yoktu bu cevap geçerlidir.
Zor

2

birkaç yıl sonra bir cevap daha!

bu makalede: http://csswizardry.com/2010/02/mutiple-column-lists-using-one-ul/

HTML:

<ul id="double"> <!-- Alter ID accordingly -->
  <li>CSS</li>
  <li>XHTML</li>
  <li>Semantics</li>
  <li>Accessibility</li>
  <li>Usability</li>
  <li>Web Standards</li>
  <li>PHP</li>
  <li>Typography</li>
  <li>Grids</li>
  <li>CSS3</li>
  <li>HTML5</li>
  <li>UI</li>
</ul>

CSS:

ul{
  width:760px;
  margin-bottom:20px;
  overflow:hidden;
  border-top:1px solid #ccc;
}
li{
  line-height:1.5em;
  border-bottom:1px solid #ccc;
  float:left;
  display:inline;
}
#double li  { width:50%;}
#triple li  { width:33.333%; }
#quad li    { width:25%; }
#six li     { width:16.666%; }

1

Gelen updateColumns()ihtiyacı if (column >= columns.length)yerine if (column > columns.length)(örneğin C atlanır) böylece tüm elemanları listelemek için:

function updateColumns(){
    column = 0;
    columnItems.each(function(idx, el){
        if (column >= columns.length){
            column = 0;
        }
        console.log(column, el, idx);
        $(columns.get(column)).append(el);
        column += 1;
    });
}

http://jsfiddle.net/e2vH9/1/



1

Üst yanıttaki eski çözüm benim için işe yaramadı çünkü sayfadaki birden çok listeyi etkilemek istedim ve cevap tek bir listenin yanı sıra adil bir küresel durum kullandığını varsayar. Bu durumda, içindeki her listeyi değiştirmek istedim <section class="list-content">:

const columns = 2;
$("section.list-content").each(function (index, element) {
    let section = $(element);
    let items = section.find("ul li").detach();
    section.find("ul").detach();
    for (let i = 0; i < columns; i++) {
        section.append("<ul></ul>");
    }
    let lists = section.find("ul");
    for (let i = 0; i < items.length; i++) {
        lists.get(i % columns).append(items[i]);
    }
});

örneğin, biri yalnızca kutucuğu ve diğeri sırasız bir listeyi içeren iki sütun oluşturmak nasıl mümkündür?
Dalek

Ne demek istediğinden emin değilim. Başlıkları olan bir dizi öğeniz varsa, bunları başlık, öğe, başlık, öğe olacak tek bir listeye koyabilirsiniz ve bu sizin için işe yarayacaktır.
Tom

1

Gabriel'i bir dereceye kadar çalışmak için cevap bulduğum halde, listeyi dikey olarak sipariş etmeye çalışırken aşağıdakileri buldum (ilk ul AD ve ikinci ul EG):

  • Ul, içinde eşit sayıda li'ye sahip olduğunda, ul'un üzerine eşit olarak yayılmıyordu.
  • ul veri sütununu kullanarak çok iyi görünmüyordu, 3 sütun için 4 koymak zorunda kaldı ve o zaman bile hala li sadece JS tarafından oluşturulan ul 2 yayılıyor

Yukarıda umarım gerçekleşmez JQuery revize.

(function ($) {
    var initialContainer = $('.customcolumns'),
        columnItems = $('.customcolumns li'),
        columns = null,
        column = 0;
    function updateColumns() {
        column = 0;
        columnItems.each(function (idx, el) {
            if ($(columns.get(column)).find('li').length >= (columnItems.length / initialContainer.data('columns'))) {
                column += 1;
            }
            $(columns.get(column)).append(el);
        });
    }
    function setupColumns() {
        columnItems.detach();
        while (column++ < initialContainer.data('columns')) {
            initialContainer.clone().insertBefore(initialContainer);
            column++;
        }
        columns = $('.customcolumns');
        updateColumns();
    }

    $(setupColumns);
})(jQuery);
.customcolumns {
  float: left;
  position: relative;
  margin-right: 20px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
  <ul class="customcolumns" data-columns="3">
    <li>A</li>
    <li>B</li>
    <li>C</li>
    <li>D</li>
    <li>E</li>
    <li>F</li>
    <li>G</li>
    <li>H</li>
    <li>I</li>
    <li>J</li>
    <li>K</li>
    <li>L</li>
    <li>M</li>
  </ul>
</div>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.