दो कॉलम में एक अनियंत्रित सूची कैसे प्रदर्शित करें?


215

निम्नलिखित HTML के साथ, सूची को दो कॉलम के रूप में प्रदर्शित करने के लिए सबसे आसान तरीका क्या है?

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

वांछित प्रदर्शन:

A B
C D
E

समाधान को इंटरनेट एक्सप्लोरर पर काम करने में सक्षम होना चाहिए।


1
यहाँ इसका सीधा उदाहरण दिया गया है कि इसे आसानी से jquery में कैसे किया जा सकता है: jsfiddle.net/EebVF/5 इस jquery प्लगइन का उपयोग करना: github.com/fzondlo/jquery-columns - मुझे CSS से बेहतर यह पसंद है क्योंकि CSS समाधान के साथ सब कुछ संरेखित नहीं होता है शीर्ष पर लंबवत।
newUserNameHere

जवाबों:


371

आधुनिक ब्राउज़र

आप जो खोज रहे हैं उसका समर्थन करने के लिए css3 कॉलम मॉड्यूल का लाभ उठाएं।

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

सीएसएस:

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

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

लिगेसी ब्राउजर

आईई समर्थन के लिए दुर्भाग्य से आपको एक कोड समाधान की आवश्यकता होगी जिसमें जावास्क्रिप्ट और डोम हेरफेर शामिल है। इसका मतलब यह है कि कभी भी सूची की सामग्री में परिवर्तन करने के लिए आपको सूची को फिर से कॉलम और रिप्रिंटिंग के लिए ऑपरेशन करने की आवश्यकता होगी। नीचे दिए गए समाधान संक्षिप्तता के लिए jQuery का उपयोग करता है।

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>

जावास्क्रिप्ट:

(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);

सीएसएस:

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

संपादित करें:

जैसा कि नीचे बताया गया है कि कॉलम इस प्रकार होगा:

A  E
B  F
C  G
D

जबकि ओपी ने निम्नलिखित प्रकार के मिलान के लिए कहा:

A  B
C  D
E  F
G

वेरिएंट को पूरा करने के लिए आप कोड को निम्नलिखित में बदलें:

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

2
आप सही क्रम में आइटम प्रदर्शित नहीं कर रहे हैं: jsfiddle.net/HP85j/258 उदाहरण के लिए, पहली पंक्ति में वांछित प्रदर्शन A B(दूसरा तत्व दाईं ओर जोड़ा जाना चाहिए) है, लेकिन आपके उदाहरणों में है A E
पाओलो मोरेटी

1
महान काम, हालांकि तर्क त्रुटिपूर्ण है यदि 2 से अधिक कॉलम हैं, तो मैंने यहां ठीक किया है: jsfiddle.net/HP85j/393
Tr1stan

2
गोलियों गायब हैं
Jaider

1
संभवतः कॉलम 2 से पहले कॉलम 1 भरने के लिए सूची की संभावना अधिक है। सूची के आइटमों को बस फिर से व्यवस्थित करना आसान हो सकता है ताकि ऐसा प्रतीत हो कि वे नीचे से पहले भर गए थे। यदि सूची में बदलाव होता है, तो निश्चित रूप से इसे फिर से करने की आवश्यकता हो सकती है। वैसे भी, गेब्रियल का सीएसएस जवाब सिर्फ मुझे चाहिए था, धन्यवाद!
दंड

3
बस एक देर से अद्यतन, मेरा मानना ​​है कि पहला विकल्प अब आधुनिक IE ब्राउज़रों में काम करेगा।
फ़िज़ूल

82

मैं @ जेदर के समाधान को देख रहा था, जो काम कर रहा था लेकिन मैं थोड़ा अलग दृष्टिकोण प्रस्तुत कर रहा हूं जो मुझे लगता है कि काम करना अधिक आसान है और जिसे मैंने ब्राउज़रों में अच्छा देखा है।

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

डिफ़ॉल्ट रूप से अन-ऑर्डर की गई सूची से बाहर बुलेट की स्थिति प्रदर्शित होती है, लेकिन फिर कुछ ब्राउज़रों में यह ब्राउज़र की आपकी वेबसाइट को बिछाने के तरीके के आधार पर कुछ प्रदर्शन समस्याओं का कारण होगा।

इसे प्रारूप में प्रदर्शित करने के लिए:

A B
C D
E

आदि निम्नलिखित का उपयोग करें:

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

यह कॉलम प्रदर्शित करने के साथ आपकी सभी समस्याओं को हल करना चाहिए। आपकी प्रतिक्रिया के रूप में ऑल द बेस्ट और थैंक्स @ जैदर ने मुझे इसे खोजने के लिए मार्गदर्शन करने में मदद की।


3
इस विधि के साथ एक समस्या है। यह बहुत छोटी (इस उदाहरण में 1 वर्ण) सूची आइटम प्रदर्शित करने के लिए बहुत अच्छा काम करता है। लंबे विवरण के साथ एक सूची बनाएं और दूसरा कॉलम पहले ओवरलैप करता है, साथ ही उल कंटेनर से बाहर निकलता है।
झबरा

1
मैंने इसे फ्लोट बदलकर थोड़ा बदल दिया: प्रदर्शन करने के लिए छोड़ दिया: ली तत्वों के लिए इनलाइन-ब्लॉक, इसके अलावा यह मेरे लिए अद्भुत काम किया।
ज़ेर्मेज़

41

मैंने इसे एक टिप्पणी के रूप में पोस्ट करने की कोशिश की, लेकिन सही (आपके प्रश्न के अनुसार) प्रदर्शित करने के लिए कॉलम नहीं मिला।

आप के लिए पूछ रहे हैं:

एबी

सीडी

... लेकिन उत्तर के रूप में स्वीकार कर लिया समाधान वापस आ जाएगी:

BE

सी

... तो या तो जवाब गलत है या सवाल है।

एक बहुत ही सरल उपाय यह होगा कि आप अपनी चौड़ाई निर्धारित करें <ul>और फिर अपनी <li>वस्तुओं की चौड़ाई को इस तरह से तैरें और सेट करें

<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;
}

यहाँ उदाहरण http://jsfiddle.net/Jayx/Qbz9S/1/

यदि आपका प्रश्न गलत है, तो पिछले उत्तर लागू होते हैं (IE समर्थन की कमी के लिए जेएस फिक्स के साथ)।


@Gabriel आपका समाधान और व्यवहार अच्छा है और जैसा कि अपेक्षित है, इसलिए मैं आपके उत्तर को खटखटाने की कोशिश नहीं कर रहा हूँ ... मुझे लगता है कि इस प्रश्न का गलत अर्थ निकाला गया है ... किसी भी तरह - प्रश्न का उत्तर दिया गया है कोई बात नहीं जो सही प्रश्न है: D
Jayx

16

मुझे आधुनिक ब्राउज़रों के लिए समाधान पसंद है, लेकिन बुलेट गायब हैं, इसलिए मैं इसे थोड़ा ट्रिक में जोड़ता हूं:

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

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


li:before {
  content: "• ";
}

यहां छवि विवरण दर्ज करें


यहाँ हम बुलेट के रंग को बदले बिना आइटमों का रंग बदल सकते हैं। jsfiddle.net/HP85j/444
Jaider

3
मुझे लगता list-style-position: inside;है कि गोलियों को ठीक से दिखाने के लिए यह एक बेहतर उपाय है।
एलेक्सिस विल्के

11

यहाँ एक संभावित समाधान है:

स्निपेट:

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>

और हो गया।
3 कॉलम के लिए li33% के रूप में चौड़ाई का उपयोग करें , 4 कॉलम के लिए 25% और इतने पर का उपयोग करें।


5

यह इसे करने का सबसे सरल तरीका है। केवल सीएसएस।

  1. उल तत्व में चौड़ाई जोड़ें।
  2. प्रदर्शन जोड़ें: नए कॉलम की इनलाइन-ब्लॉक और चौड़ाई (उल चौड़ाई के आधे से कम होनी चाहिए)।
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
जवाब के साथ कुछ स्पष्टीकरण जोड़ें कि यह उत्तर ओपी को वर्तमान मुद्दे को ठीक करने में कैसे मदद करता है
ρяєρ withя K

4

आप CSS का उपयोग केवल दो कॉलम या अधिक सेट करने के लिए कर सकते हैं

एई

बी

सी

डी

 <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;
 }

3

यह अभिभावक दिवस पर कॉलम-काउंट सीएसएस संपत्ति का उपयोग करके प्राप्त किया जा सकता है,

पसंद

 column-count:2;

अधिक जानकारी के लिए इसे देखें।

फ़्लोटिंग DIV सूची को स्तंभों में कैसे बनाएं, पंक्तियों में नहीं


1
column-countसही क्रम में आइटम प्रदर्शित नहीं करेगा। उदाहरण के लिए, पहली पंक्ति में वांछित प्रदर्शन A B(दूसरा तत्व दाईं ओर जोड़ा जाना चाहिए) है, लेकिन यदि आप इसका उपयोग करते हैं तो column-countयह होगा A E
पाओलो मोरेटी

2

आप वास्तव में jQuery के कॉलम प्लग इन के साथ आसानी से कर सकते हैं उदाहरण के लिए .myl के एक वर्ग के साथ विभाजित करने के लिए जो आप करेंगे।

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

यहाँ jsfiddle पर एक जीवंत उदाहरण है

मुझे यह सीएसएस से बेहतर लगता है क्योंकि सीएसएस समाधान के साथ सब कुछ शीर्ष पर लंबवत संरेखित नहीं होता है।


दिलचस्प है, लेकिन यह वास्तव <ul>में कई सूचियों में सूची को तोड़ता है ... जो अन्य चीजों को जटिल कर सकता है।
एलेक्सिस विलके

यह वास्तव में समाधान था जो धन्यवाद के बाद था, डाउनवॉटर के लिए यह उत्तर मान्य है यदि आपने ओपी के प्रश्न को पढ़ा है और डीवी की कोई आवश्यकता नहीं है।
मुश्किल

2

कुछ वर्षों के बाद अधिक जवाब!

इस लेख में: 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>

सीएसएस:

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

में updateColumns()जरूरत if (column >= columns.length)के बजाय if (column > columns.length)सभी तत्वों को सूचीबद्ध करने के लिए (सी उदाहरण के लिए छोड़ दिया जाता है) तो:

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

शीर्ष उत्तर में लीगेसी समाधान मेरे लिए काम नहीं किया क्योंकि मैं पृष्ठ पर कई सूचियों को प्रभावित करना चाहता था और उत्तर एकल सूची को मानता है और इसके साथ ही यह वैश्विक स्थिति का भी उपयोग करता है। इस मामले में मैं हर सूची को अंदर बदलना चाहता था <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]);
    }
});

उदाहरण के लिए यह कैसे संभव है कि दो कॉलम उत्पन्न हों, एक में टाइल और दूसरे में एक अनियंत्रित सूची हो?
दलेक

आप का क्या मतलब है यह बिल्कुल निश्चित नहीं है। यदि आपके पास शीर्षकों के साथ मदों की एक श्रृंखला है, तो आप उन्हें एक ही सूची में जा सकते हैं शीर्षक, आइटम, शीर्षक, आइटम और फिर यह आपके लिए काम करना चाहिए।
टॉम

1

हालांकि मुझे एक हद तक काम करने के लिए गेब्रियल का जवाब मिला, जब मैंने सूची को क्रमबद्ध करने की कोशिश की तो निम्नलिखित पाया (पहला उल विज्ञापन और दूसरा ईडी):

  • जब उल में ली की संख्या समान थी, तो यह उल के पूरे हिस्से में समान रूप से नहीं फैल रहा था
  • उल में डेटा-कॉलम का उपयोग करना बहुत अच्छी तरह से काम नहीं करता था, मुझे 3 कॉलमों के लिए 4 रखना था और तब भी यह केवल जेएस द्वारा उत्पन्न उल के 2 के ली को फैलाना था।

मैंने JQuery को संशोधित किया है इसलिए उपरोक्त उम्मीद नहीं है।

(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>

-1

यह मेरे लिए एक सही समाधान था, इसे वर्षों तक देखना:

http://css-tricks.com/forums/topic/two-column-unordered-list/


3
"हमेशा एक महत्वपूर्ण लिंक का सबसे प्रासंगिक हिस्सा उद्धृत करें, यदि लक्ष्य साइट अप्राप्य है या स्थायी रूप से ऑफ़लाइन है" - stackoverflow.com/help/how-to-answer
Sk8erPeter

कोई ज़रूरत नहीं - यह Abdulउसके उत्तर में उपयोग किए गए कोड के लिए लिंक / संदर्भ है , यहां तक ​​कि उपयोग की गई चौड़ाई और आईडी के समान।
cssyphus
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.