รายการที่เรียงลำดับสามารถสร้างผลลัพธ์ที่มีลักษณะเช่น 1.1, 1.2, 1.3 (แทนที่จะเป็นเพียง 1, 2, 3, ... ) ด้วย CSS หรือไม่? จนถึงตอนนี้การใช้list-style-type:decimal
มีการผลิตเพียง 1, 2, 3, ไม่ใช่ 1.1, 1.2., 1.3
รายการที่เรียงลำดับสามารถสร้างผลลัพธ์ที่มีลักษณะเช่น 1.1, 1.2, 1.3 (แทนที่จะเป็นเพียง 1, 2, 3, ... ) ด้วย CSS หรือไม่? จนถึงตอนนี้การใช้list-style-type:decimal
มีการผลิตเพียง 1, 2, 3, ไม่ใช่ 1.1, 1.2., 1.3
คำตอบ:
คุณสามารถใช้เคาน์เตอร์เพื่อทำสิ่งต่อไปนี้:
หมายเลขสไตล์ชีตต่อไปนี้แสดงเป็นรายการแบบซ้อน "1", "1.1", "1.1.1" เป็นต้น
OL { counter-reset: item } LI { display: block } LI:before { content: counters(item, ".") " "; counter-increment: item }
ตัวอย่าง
ol { counter-reset: item }
li{ display: block }
li:before { content: counters(item, ".") " "; counter-increment: item }
<ol>
<li>li element
<ol>
<li>sub li element</li>
<li>sub li element</li>
<li>sub li element</li>
</ol>
</li>
<li>li element</li>
<li>li element
<ol>
<li>sub li element</li>
<li>sub li element</li>
<li>sub li element</li>
</ol>
</li>
</ol>
ดูตัวนับและขอบเขตแบบซ้อนสำหรับข้อมูลเพิ่มเติม
li:before
: content: counters(item, ".")". ";
ไม่มีวิธีแก้ไขปัญหาใด ๆ ในหน้านี้ที่ทำงานได้อย่างถูกต้องและเป็นสากลสำหรับทุกระดับและย่อหน้า (ยาว) เป็นการยากที่จะบรรลุการเยื้องที่สอดคล้องกันเนื่องจากขนาดตัวแปรของเครื่องหมาย (1. , 1.2, 1.10, 1.10.5, …); ไม่สามารถเป็นเพียง“ แกล้ง” ไม่ได้แม้แต่กับมาร์จิ้น / ช่องว่างที่คำนวณล่วงหน้าสำหรับแต่ละระดับการเยื้องที่เป็นไปได้
ในที่สุดฉันก็พบโซลูชันที่ใช้งานได้จริงและไม่ต้องการ JavaScript ใด ๆ
ผ่านการทดสอบบน Firefox 32, Chromium 37, IE 9 และเบราว์เซอร์ Android ไม่ทำงานบน IE 7 และรุ่นก่อนหน้า
CSS:
ol {
list-style-type: none;
counter-reset: item;
margin: 0;
padding: 0;
}
ol > li {
display: table;
counter-increment: item;
margin-bottom: 0.6em;
}
ol > li:before {
content: counters(item, ".") ". ";
display: table-cell;
padding-right: 0.6em;
}
li ol > li {
margin: 0;
}
li ol > li:before {
content: counters(item, ".") " ";
}
ลองบนJSFiddle , แยกบนสรุปสาระสำคัญ
คำตอบที่เลือกเป็นการเริ่มต้นที่ดี แต่มันบังคับให้list-style-position: inside;
สไตล์ในรายการเป็นหลักทำให้การห่อข้อความยากที่จะอ่าน ต่อไปนี้เป็นวิธีแก้ไขปัญหาอย่างง่ายที่ให้การควบคุมระยะห่างระหว่างหมายเลขและข้อความและจัดชิดหมายเลขตามพฤติกรรมเริ่มต้น
ol {
counter-reset: item;
}
ol li {
display: block;
position: relative;
}
ol li:before {
content: counters(item, ".")".";
counter-increment: item;
position: absolute;
margin-right: 100%;
right: 10px; /* space between number and text */
}
JSFiddle: http://jsfiddle.net/3J4Bu/
ol
พฤติกรรมเริ่มต้น สามารถลบออกได้อย่างง่ายดายโดยการลบรายการสุดท้าย"."
จากcontent
สถานที่ แต่นี่ดูแปลกสำหรับฉัน
โซลูชันที่โพสต์ที่นี่ทำงานได้ไม่ดีสำหรับฉันดังนั้นฉันจึงผสมผสานคำถามเหล่านี้กับคำถามต่อไปนี้: เป็นไปได้ไหมที่จะสร้างรายการที่เรียงลำดับหลายระดับใน HTML
/* Numbered lists like 1, 1.1, 2.2.1... */
ol li {display:block;} /* hide original list counter */
ol > li:first-child {counter-reset: item;} /* reset counter */
ol > li {counter-increment: item; position: relative;} /* increment counter */
ol > li:before {content:counters(item, ".") ". "; position: absolute; margin-right: 100%; right: 10px;} /* print counter */
ผลลัพธ์:
หมายเหตุ: ภาพหน้าจอหากคุณต้องการดูซอร์สโค้ดหรืออะไรก็ตามที่อยู่ในโพสต์นี้: http://estiloasertivo.blogspot.com.es/2014/08/introduccion-running-lean-y-lean.html
หมายเหตุ: ใช้ CSS เพื่อสร้างการกำหนดหมายเลขแบบซ้อนในเบราว์เซอร์สมัยใหม่ ดูคำตอบที่ยอมรับได้ ต่อไปนี้เป็นเพื่อประโยชน์ทางประวัติศาสตร์เท่านั้นcounters
หากเบราว์เซอร์สนับสนุนcontent
และcounter
,
.foo {
counter-reset: foo;
}
.foo li {
list-style-type: none;
}
.foo li::before {
counter-increment: foo;
content: "1." counter(foo) " ";
}
<ol class="foo">
<li>uno</li>
<li>dos</li>
<li>tres</li>
<li>cuatro</li>
</ol>
.foo > ol > li
.
counters()
ฟังก์ชันตามตัวอย่างด้านบนแทนcounter()
ฟังก์ชั่น
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="author" content="Sandro Alvares - KingRider">
</head>
<body>
<style type="text/css">
li.title {
font-size: 20px;
font-weight: lighter;
padding: 15px;
counter-increment: ordem;
}
.foo {
counter-reset: foo;
padding-left: 15px;
}
.foo li {
list-style-type: none;
}
.foo li:before {
counter-increment: foo;
content: counter(ordem) "." counter(foo) " ";
}
</style>
<ol>
<li class="title">TITLE ONE</li>
<ol class="foo">
<li>text 1 one</li>
<li>text 1 two</li>
<li>text 1 three</li>
<li>text 1 four</li>
</ol>
<li class="title">TITLE TWO</li>
<ol class="foo">
<li>text 2 one</li>
<li>text 2 two</li>
<li>text 2 three</li>
<li>text 2 four</li>
</ol>
<li class="title">TITLE THREE</li>
<ol class="foo">
<li>text 3 one</li>
<li>text 3 two</li>
<li>text 3 three</li>
<li>text 3 four</li>
</ol>
</ol>
</body>
</html>
ผลลัพธ์: http://i.stack.imgur.com/78bN8.jpg
ฉันมีปัญหาบางอย่างเมื่อมีสองรายการและรายการที่สองอยู่ใน DIV รายการที่สองควรเริ่มต้นที่ 1 ไม่ใช่ 2.1
<ol>
<li>lorem</li>
<li>lorem ipsum</li>
</ol>
<div>
<ol>
<li>lorem (should be 1.)</li>
<li>lorem ipsum ( should be 2.)</li>
</ol>
</div>
http://jsfiddle.net/3J4Bu/364/
แก้ไข: ฉันแก้ไขปัญหาโดยhttp://jsfiddle.net/hy5f6161/นี้
ในอนาคตอันใกล้นี้คุณอาจจะสามารถใช้::marker
องค์ประกอบ psuedoเพื่อให้ได้ผลลัพธ์เช่นเดียวกับโซลูชันอื่น ๆ ในรหัสบรรทัดเดียว
อย่าลืมตรวจสอบตารางความเข้ากันได้ของเบราว์เซอร์เนื่องจากยังคงเป็นเทคโนโลยีทดลอง ในขณะที่เขียนเท่านั้น Firefox และ Firefox สำหรับ Android เริ่มจากรุ่น 68 สนับสนุนนี้
นี่เป็นตัวอย่างข้อมูลที่จะแสดงผลอย่างถูกต้องหากลองใช้เบราว์เซอร์ที่ใช้งานร่วมกันได้:
::marker { content: counters(list-item,'.') ':' }
li { padding-left: 0.5em }
<ol>
<li>li element
<ol>
<li>sub li element</li>
<li>sub li element</li>
<li>sub li element</li>
</ol>
</li>
<li>li element</li>
<li>li element
<ol>
<li>sub li element</li>
<li>sub li element</li>
<li>sub li element</li>
</ol>
</li>
</ol>
คุณอาจต้องการตรวจสอบบทความที่ดีนี้โดย smashingmagazineในหัวข้อ
ฉันต้องการเพิ่มสิ่งนี้ลงในโซลูชันที่โพสต์ใน 12 เนื่องจากฉันใช้รายการที่มีส่วนผสมของรายการที่สั่งซื้อและส่วนประกอบรายการที่ไม่มีการเรียงลำดับ เนื้อหา: no-close-quote ดูเหมือนจะเป็นเรื่องแปลกที่ฉันจะเพิ่ม แต่มันใช้งานได้ ...
ol ul li:before {
content: no-close-quote;
counter-increment: none;
display: list-item;
margin-right: 100%;
position: absolute;
right: 10px;
}
การทำงานต่อไปนี้สำหรับฉัน:
ol {
list-style-type: none;
counter-reset: item;
margin: 0;
padding: 0;
}
ol > li {
display: table;
counter-increment: item;
margin-bottom: 0.6em;
}
ol > li:before {
content: counters(item, ".") ") ";
display: table-cell;
padding-right: 0.6em;
}
li ol > li {
margin: 0;
}
li ol > li:before {
content: counters(item, ".") ") ";
}
ดูที่: http://jsfiddle.net/rLebz84u/2/
หรือhttp://jsfiddle.net/rLebz84u/3/อันนี้ พร้อมข้อความที่ถูกต้อง
นี่คือรหัสที่ถูกต้องถ้าคุณต้องการลูกคนแรก li ปรับขนาดของ CSS อื่น ๆ
<style>
li.title {
font-size: 20px;
counter-increment: ordem;
color:#0080B0;
}
.my_ol_class {
counter-reset: my_ol_class;
padding-left: 30px !important;
}
.my_ol_class li {
display: block;
position: relative;
}
.my_ol_class li:before {
counter-increment: my_ol_class;
content: counter(ordem) "." counter(my_ol_class) " ";
position: absolute;
margin-right: 100%;
right: 10px; /* space between number and text */
}
li.title ol li{
font-size: 15px;
color:#5E5E5E;
}
</style>
ในไฟล์ html
<ol>
<li class="title"> <p class="page-header list_title">Acceptance of Terms. </p>
<ol class="my_ol_class">
<li>
<p>
my text 1.
</p>
</li>
<li>
<p>
my text 2.
</p>
</li>
</ol>
</li>
</ol>