ด้วย HTML ต่อไปนี้วิธีที่ง่ายที่สุดในการแสดงรายการเป็นสองคอลัมน์คืออะไร?
<ul>
<li>A</li>
<li>B</li>
<li>C</li>
<li>D</li>
<li>E</li>
</ul>
จอแสดงผลที่ต้องการ:
A B
C D
E
การแก้ปัญหาจะต้องสามารถทำงานได้บน Internet Explorer
ด้วย HTML ต่อไปนี้วิธีที่ง่ายที่สุดในการแสดงรายการเป็นสองคอลัมน์คืออะไร?
<ul>
<li>A</li>
<li>B</li>
<li>C</li>
<li>D</li>
<li>E</li>
</ul>
จอแสดงผลที่ต้องการ:
A B
C D
E
การแก้ปัญหาจะต้องสามารถทำงานได้บน Internet Explorer
คำตอบ:
ใช้ประโยชน์จากโมดูลคอลัมน์ css3 เพื่อสนับสนุนสิ่งที่คุณกำลังมองหา
http://www.w3schools.com/cssref/css3_pr_columns.asp
CSS:
ul {
columns: 2;
-webkit-columns: 2;
-moz-columns: 2;
}
น่าเสียดายสำหรับการสนับสนุน IE คุณจะต้องใช้โซลูชันรหัสที่เกี่ยวข้องกับการจัดการ JavaScript และ dom ซึ่งหมายความว่าเมื่อใดก็ตามที่เนื้อหาของรายการเปลี่ยนแปลงคุณจะต้องดำเนินการเพื่อจัดลำดับรายการใหม่ลงในคอลัมน์และพิมพ์ซ้ำ การแก้ปัญหาด้านล่างใช้ jQuery เพื่อความกระชับ
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;
}
แก้ไข:
ดังที่อธิบายไว้ด้านล่างนี้จะเรียงลำดับคอลัมน์ดังต่อไปนี้:
A E
B F
C G
D
ในขณะที่ OP ขอตัวแปรที่ตรงกับต่อไปนี้:
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;
});
}
A B(องค์ประกอบที่สองควรจะต่อท้ายด้านขวา) A Eแต่ในตัวอย่างของคุณ
ฉันกำลังดูโซลูชันของ @ jaider ซึ่งใช้ได้ แต่ฉันเสนอวิธีที่แตกต่างออกไปเล็กน้อยซึ่งฉันคิดว่าง่ายกว่าที่จะทำงานด้วยและที่ฉันเห็นว่าดีในเบราว์เซอร์
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;
}
วิธีนี้จะช่วยแก้ปัญหาทั้งหมดของคุณด้วยการแสดงคอลัมน์ ทั้งหมดที่ดีที่สุดและขอบคุณ @jaider เป็นคำตอบของคุณช่วยแนะนำให้ฉันค้นพบนี้
ฉันพยายามโพสต์สิ่งนี้เป็นความคิดเห็น แต่ไม่สามารถแสดงคอลัมน์ได้ถูกต้อง (ตามคำถามของคุณ)
คุณกำลังขอ:
AB
ซีดี
E
... แต่คำตอบที่ได้รับการยอมรับในฐานะโซลูชันจะกลับมา
AD
พ.ศ.
ค
... ดังนั้นคำตอบไม่ถูกต้องหรือเป็นคำถาม
วิธีแก้ปัญหาที่ง่ายมากคือการตั้งค่าความกว้างของคุณ<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/
หากคำถามของคุณไม่ถูกต้องคำตอบก่อนหน้านี้จะนำไปใช้ (พร้อมกับการแก้ไข JS สำหรับการขาดการสนับสนุน IE)
ฉันชอบวิธีแก้ปัญหาสำหรับเบราว์เซอร์ที่ทันสมัย แต่กระสุนหายไปดังนั้นฉันจึงเพิ่มมันเล็กน้อย:
http://jsfiddle.net/HP85j/419/
ul {
list-style-type: none;
columns: 2;
-webkit-columns: 2;
-moz-columns: 2;
}
li:before {
content: "• ";
}

list-style-position: inside;เป็นวิธีที่ดีกว่าสำหรับกระสุนที่จะแสดงอย่างถูกต้อง
นี่คือทางออกที่เป็นไปได้:
ตัวอย่างข้อมูล:
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 คอลัมน์ใช้liความกว้างเป็น 33% สำหรับ 4 คอลัมน์ใช้ 25% และอื่น ๆ
นี่เป็นวิธีที่ง่ายที่สุดที่จะทำ CSS เท่านั้น
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>
คุณสามารถใช้CSSเพื่อตั้งสองคอลัมน์หรือมากกว่าเท่านั้น
AE
B
ค
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;
}
สิ่งนี้สามารถทำได้โดยใช้คุณสมบัติการนับคอลัมน์จาก css บน div parent
ชอบ
column-count:2;
ตรวจสอบรายละเอียดเพิ่มเติมจากนี้
column-countจะไม่แสดงรายการในลำดับที่ถูกต้อง ยกตัวอย่างเช่นการแสดงผลที่ต้องการในบรรทัดแรกคือA B(องค์ประกอบที่สองควรจะต่อท้ายด้านขวา) แต่ถ้าคุณใช้มันจะเป็นcolumn-count A E
คุณสามารถทำสิ่งนี้ได้อย่างง่ายดายด้วยปลั๊กอิน jQuery-Columnsเพื่อแบ่ง ul ด้วยคลาส. mylist ที่คุณจะทำ
$('.mylist').cols(2);
นี่คือตัวอย่างสดของ jsfiddle
ฉันชอบสิ่งนี้ดีกว่าด้วย CSS เพราะด้วยโซลูชัน CSS ไม่ใช่ทุกสิ่งที่จัดแนวตั้งขึ้นไปด้านบน
<ul>รายชื่อในหลายรายการ ... ที่อาจซับซ้อนสิ่งอื่น ๆ
อีกหนึ่งคำตอบหลังจากไม่กี่ปี!
ในบทความนี้: 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%; }
ในupdateColumns()ความต้องการif (column >= columns.length)มากกว่าif (column > columns.length)ที่จะแสดงรายการองค์ประกอบทั้งหมด (C จะข้ามตัวอย่าง) ดังนั้น:
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;
});
}
ด้วย Bootstrap ... คำตอบนี้ ( https://stackoverflow.com/a/23005046/1128742 ) ชี้ให้ฉันเห็นแนวทางแก้ไขนี้:
<ul class="list-unstyled row">
<li class="col-xs-6">Item 1</li>
<li class="col-xs-6">Item 2</li>
<li class="col-xs-6">Item 3</li>
</ul>
โซลูชันแบบดั้งเดิมในคำตอบอันดับต้นไม่ได้ผลสำหรับฉันเพราะฉันต้องการส่งผลต่อหลายรายการในหน้าและคำตอบจะถือว่าเป็นรายการเดียวรวมถึงใช้บิตของสถานะทั่วโลก ในกรณีนี้ฉันต้องการแก้ไขทุกรายการภายใน<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]);
}
});
แม้ว่าฉันจะพบคำตอบของ Gabriel ในการทำงานในระดับหนึ่ง แต่ฉันก็พบสิ่งต่อไปนี้เมื่อพยายามสั่งรายการในแนวตั้ง (ul ul แรกและ ul ul EG ที่สอง):
ฉันได้แก้ไข 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>
นี่เป็นโซลูชั่นที่สมบูรณ์แบบสำหรับฉันดูมาหลายปี:
http://css-tricks.com/forums/topic/two-column-unordered-list/
Abdulในคำตอบของเขาซึ่งเหมือนกับความกว้างและ ID ที่ใช้