CSS: ควบคุมพื้นที่ระหว่างสัญลักษณ์แสดงหัวข้อย่อยและ <li>


177

ฉันต้องการที่จะควบคุมเท่าใดพื้นที่แนวกระสุนผลักดันให้มัน<li>ไปทางขวาในหรือ<ol><ul>

นั่นคือแทนที่จะมีเสมอ

*  Some list text goes
   here.

ฉันต้องการที่จะเปลี่ยนเป็น

*         Some list text goes
          here.

หรือ

*Some list text goes
 here.

ฉันมองไปรอบ ๆ แต่สามารถหาคำแนะนำในการขยับบล็อกทั้งซ้ายหรือขวาตัวอย่างเช่นhttp://www.alistapart.com/articles/taminglists/


3
เกือบจะซ้ำซ้อนกับstackoverflow.com/questions/2441059/…
rds

คำตอบ:


161

ใส่เนื้อหาในspanซึ่งอยู่ในตำแหน่งที่ค่อนข้างแล้วคุณสามารถควบคุมพื้นที่โดยทรัพย์สินของleftspan

li span {
  position: relative;
  left: -10px;
}
<ul>
  <li><span>item 1</span></li>
  <li><span>item 2</span></li>
  <li><span>item 3</span></li>
</ul>


เพียงเพื่อชี้แจงแท็ก <span> สามารถเป็นความหมายเมื่อถูกกำหนดคลาสเช่น <span class = "tel"> 123-456-7890 </span> จะมีความหมายโดยนัย
ingyhere

4
+1 สำหรับการตอบคำถามของคนที่แต่งตัวประหลาดจริง ๆ ;) (แม้ว่าการขยายควรในชีวิตจริงมีคลาสต่อไปสำหรับการปฏิบัติที่ดีในอนาคตการป้องกันและความหมาย: ถ้าในอนาคตการพัฒนาจาวาสคริปต์หรือคุณสมบัติใหม่ ฯลฯ มีเหตุผลที่ดี เนื้อหาของคุณอาจยุ่งเหยิง)
user56reinstatemonica8

ใน Firefox ไม่มีการแสดงข้อความอย่างถูกต้องซ้อนกันกระสุนโดยใช้เคล็ดลับนี้
Jay Bhalodi

@ ในที่นี้ฉันสงสัยว่านี่เป็นเรื่องจริงเพราะฉันไม่สามารถหาสิ่งใด ๆ ที่พิสูจน์การอ้างสิทธิ์นี้ได้ คุณสามารถให้แหล่งข้อมูลใด ๆ
WoIIe

@ Wolle Hmmm มันเป็นความคิดเห็นเก่าและผมไม่แน่ใจว่าของความกังวล - ถ้ามันเป็นไปได้ว่า<SPAN>สามารถใช้ประโยชน์idหรือclassแท็กดูที่W3C หากคำถามคือว่ามันสามารถสื่อความหมายทางความหมายดูคำตอบนี้ ในทางเทคนิค<SPAN>แท็กเป็นองค์ประกอบแบบอินไลน์ที่ไม่ใช่ความหมายด้วยตัวเอง แต่ในบางวิธีที่ช่วยเพิ่มความยืดหยุ่นในการใช้ซ้ำ ทุกวันนี้ฉันเชื่อว่ามีใครสามารถใช้inline-blockdescriptor เพื่ออนุญาตให้มีตัวเลือกการจัดรูปแบบที่หลากหลาย
ingyhere

120

เพื่อสรุปคำตอบอื่น ๆ ที่นี่ - หากคุณต้องการควบคุมช่องว่างระหว่างสัญลักษณ์แสดงหัวข้อย่อยและข้อความใน<li>รายการอย่างละเอียดตัวเลือกของคุณคือ:

(1) ใช้ภาพพื้นหลัง:

<style type="text/css">
li {
    list-style-type:none;
    background-image:url(bullet.png);
}
</style>

<ul>
    <li>Some text</li>
</ul>

ข้อดี:

  • คุณสามารถใช้ภาพใดก็ได้ที่คุณต้องการสำหรับสัญลักษณ์แสดงหัวข้อย่อย
  • คุณสามารถใช้ CSS background-positionเพื่อจัดตำแหน่งภาพได้ทุกที่ที่คุณต้องการเมื่อเทียบกับข้อความโดยใช้พิกเซล, ems หรือ%

ข้อเสีย:

  • เพิ่มไฟล์ภาพพิเศษ (แม้ว่าจะเล็ก) ลงในหน้าของคุณเพิ่มน้ำหนักหน้า
  • หากผู้ใช้เพิ่มขนาดตัวอักษรในเบราว์เซอร์สัญลักษณ์แสดงหัวข้อจะยังคงขนาดเดิม นอกจากนี้ยังมีแนวโน้มที่จะได้รับตำแหน่งไกลออกไปเมื่อขนาดตัวอักษรเพิ่มขึ้น
  • หากคุณกำลังพัฒนาเลย์เอาต์ที่ 'ตอบสนอง' โดยใช้เปอร์เซ็นต์ความกว้างเท่านั้นอาจเป็นเรื่องยากที่จะรับสัญลักษณ์แสดงตำแหน่งที่คุณต้องการในช่วงความกว้างของหน้าจอ

2. ใช้ช่องว่างภายใน<li>แท็ก

<style type="text/css">
ul {padding-left:1em}
li {padding-left:1em}
</style>

<ul>
    <li>Some text</li>
</ul>

ข้อดี:

  • ไม่มีภาพ = ไฟล์ที่จะดาวน์โหลดน้อย 1 ไฟล์
  • โดยการปรับช่องว่างภายในบน<li>คุณสามารถเพิ่มพิเศษได้มากพื้นที่แนวนอนระหว่างกระสุนและข้อความตามที่คุณต้องการ
  • หากผู้ใช้เพิ่มขนาดข้อความระยะห่างและสัญลักษณ์แสดงหัวข้อควรปรับสัดส่วน

ข้อเสีย:

  • ไม่สามารถย้ายสัญลักษณ์แสดงหัวข้อย่อยไปที่ข้อความได้ใกล้เคียงกว่าเบราว์เซอร์เริ่มต้น
  • จำกัด เฉพาะรูปร่างและขนาดของกระสุนชนิดในตัวของ CSS
  • สัญลักษณ์แสดงหัวข้อต้องมีสีเดียวกับข้อความ
  • ไม่มีการควบคุมตำแหน่งแนวตั้งของสัญลักษณ์แสดงหัวข้อย่อย

(3) ตัดข้อความใน<span>องค์ประกอบเพิ่มเติม

<style type="text/css">
li {
    padding-left:1em;
    color:#f00; /* red bullet */
}
li span {
    display:block;
    margin-left:-0.5em;
    color:#000; /* black text */
}
</style>

<ul>
    <li><span>Some text</span></li>
</ul>

ข้อดี:

  • ไม่มีภาพ = ไฟล์ที่จะดาวน์โหลดน้อย 1 ไฟล์
  • คุณสามารถควบคุมตำแหน่งของกระสุนได้มากกว่าด้วยตัวเลือก (2) - คุณสามารถเลื่อนไปใกล้กับข้อความมากขึ้น (แม้ว่าจะมีความพยายามอย่างดีที่สุดของฉันดูเหมือนว่าคุณไม่สามารถเปลี่ยนตำแหน่งแนวตั้งได้โดยการเพิ่มpadding-topไปที่<span>คนอื่นอาจมี. วิธีแก้ปัญหาสำหรับสิ่งนี้แม้ว่า ... )
  • สัญลักษณ์แสดงหัวข้อย่อยอาจเป็นสีที่แตกต่างกับข้อความ
  • หากผู้ใช้เพิ่มขนาดตัวอักษรสัญลักษณ์แสดงหัวข้อควรปรับสัดส่วน (ให้คุณตั้งค่าช่องว่างภายใน & ขอบเป็น EMS ไม่ใช่ px)

ข้อเสีย:

  • ต้องใช้องค์ประกอบที่ไม่เป็นที่ต้องการ (ซึ่งอาจทำให้คุณเสียเพื่อนไปมากกว่านั้นในชีวิตจริง) แต่มันน่ารำคาญสำหรับผู้ที่ชอบรหัสของพวกเขาจะมีประสิทธิภาพและเป็นไปได้น้อยที่สุดและเป็นการละเมิดการนำเสนอและเนื้อหา HTML / CSS ที่ควรเสนอ)
  • ไม่มีการควบคุมขนาดและรูปร่างของกระสุน

นี่คือความหวังสำหรับฟีเจอร์สไตล์ลิสต์ใหม่ใน CSS4 ดังนั้นเราจึงสามารถสร้างสัญลักษณ์แสดงหัวข้อย่อยที่ชาญฉลาดโดยไม่ต้องใช้รูปภาพหรือมาร์กอัป :)


4
คำตอบที่ดี เพื่อให้การทำงาน # 2 ตรวจสอบให้แน่ใจว่าคุณรักษาตำแหน่งสไตล์รายการของคุณoutsideไว้
Tom Auger

องค์ประกอบ span คือการแก้ไขสำหรับฉัน ฉัน +1 คำตอบนี้เพียงเพราะฉันต้องการให้อัตรากำไรขั้นต้นติดลบกับการวางตำแหน่งสัมบูรณ์เชิงลบ - ด้วยเหตุผลที่ไม่ดี
FlipMcF

หากคุณมีข้อความที่ล้อมบรรทัดฉันก็พบว่าฉันต้องเพิ่มdisplay: block;องค์ประกอบการขยายเพื่อให้ข้อความที่ถูกพันไว้เรียงกันเช่นกัน (ฉันลงเอยด้วยการใช้แท็กจุดยึดแทนช่วง)
Kevin M

การใช้ภาพพื้นหลังเพื่อสิ่งใดก็ตามที่ไม่ได้เป็นเพียงความคิดที่แย่มาก ไม่สามารถบันทึกไม่พิมพ์และไม่ได้กล่าวถึงโดยโปรแกรมอ่านหน้าจอ การใช้ <span> เป็นวิธีที่ยอดเยี่ยมที่สุดในการแก้ปัญหานี้ paddings จะไม่ทำงานเพราะพวกเขาเปลี่ยนตำแหน่งของกระสุนด้วย
Bachsau

3
ฉันจะไม่ใช้ภาพพื้นหลังสำหรับสิ่งนี้ คุณสามารถใช้: ก่อนองค์ประกอบกับเนื้อหา: "•"; จากนั้นคุณใช้ช่องว่างภายในและตำแหน่งสัมบูรณ์บนองค์ประกอบนั้นก่อนที่จะควบคุม
Yann Chabot

37

สิ่งนี้ควรทำ อย่าลืมตั้งกระสุนของคุณไปด้านนอก คุณยังสามารถใช้องค์ประกอบ CSS หลอกถ้าคุณสามารถวางพวกเขาใน IE7 ลง ฉันไม่แนะนำให้ใช้องค์ประกอบหลอกสำหรับสิ่งนี้ แต่มันทำงานเพื่อควบคุมระยะทาง

ul {
  list-style: circle outside;
  width: 100px;
}

li {
  padding-left: 40px;
}

.pseudo,
.pseudo ul {
  list-style: none;
}

.pseudo li {
  position: relative;
}

/* use ISO 10646 for content http://la.remifa.so/unicode/named-entities.html */
.pseudo li:before {
  content: '\2192';
  position: absolute;
  left: 0;
}
<ul>
  <li>Any Browser really</li>
  <li>List item
    <ul>
      <li>List item</li>
      <li>List item</li>
    </ul>
  </li>
</ul>

<ul class="pseudo">
  <li>IE8+ only</li>
  <li>List item
    <ul>
      <li>List item with two lines of text for the example.</li>
      <li>List item</li>
    </ul>
  </li>
</ul>


5
ฉันไม่อยากเชื่อเลยว่าคำตอบนี้จะไม่ได้รับการยอมรับ เป็น CSS 100% ไม่ได้เพิ่มองค์ประกอบ <span> ที่เกินความจำเป็นใด ๆ และทำให้ฉันเข้าใจในที่สุดว่าทำไมตัวเลือกภายใน / ภายนอก! (และเป็นคำตอบที่ได้รับการยอมรับของคำถามซ้ำ ๆ ที่กล่าวถึง ... )
MindTailor

1
การใช้list-style-position: outsideและการเติมเต็มLIองค์ประกอบช่วยให้คุณสามารถเพิ่มระยะห่างระหว่างสัญลักษณ์แสดงหัวข้อย่อย แต่ก็ยังไม่สามารถทำงานได้นอกเหนือจากเบราว์เซอร์ที่ระบุ ดูถัง JSนี้
Mesagoma

4
ภาคผนวก: ในเบราว์เซอร์ที่ทันสมัย (IE9 + FF, Chrome, ฯลฯ ), การใช้เชิงลบtext-indentใน<UL>หรือ<LI>จะลบล้างเบราว์เซอร์บังคับใช้ระยะห่างระหว่างจุดกระสุนและ<LI>เนื้อหา นั่นคือเพิ่มpadding-leftดังที่แสดงด้านบนเพื่อเพิ่มระยะทางและลดtext-indentเพื่อลดระยะห่างระหว่างสัญลักษณ์แสดงหัวข้อย่อยและเนื้อหาตามที่ต้องการ
Mesagoma

1
อนิจจาสำหรับทั้งหมดข้างต้นกล่าวถึงเบราว์เซอร์สก์ท็อปถ้าเนื้อหาของนั้น<LI>ตัดเป็นเส้นสองเส้นที่ตามมาดังกล่าวจบลงด้วยการใหม่เยื้องขึ้นอยู่กับอัตรากำไรขั้นต้น / padding / text-indentเยื้องว่าเรามีการจัดการเพื่อยกเลิกการสำหรับบรรทัดแรกผ่าน เฮ้อ
Mesagoma

อีกตัวเลือกหนึ่งคือการใช้: ก่อนองค์ประกอบหลอกและตั้งค่าเนื้อหาเป็นสิ่งที่คุณต้องการ จากนั้นให้วางตำแหน่งองค์ประกอบเทียมตามต้องการ
เควิน

14

คำถามเก่า แต่: ก่อนองค์ประกอบหลอกทำงานได้ดีที่นี่

<style>
    li:before {
        content: "";
        display: inline-block;
        height: 1rem;  // or px or em or whatever
        width: .5rem;  // or whatever space you want
    }
</style>

มันใช้งานได้ดีจริง ๆ และไม่ต้องการกฎหรือ html เพิ่มเติมมากมาย

<ul>
    <li>Some content</li>
    <li>Some other content</li>
</ul>

ไชโย!


3
คำตอบที่ดีและเรียบง่าย ฉันจะเพิ่มการตั้งค่าmargin-left: -5px(หรือค่าอะไรก็ตาม) จะลดช่องว่างระหว่างสัญลักษณ์แสดงหัวข้อย่อยและ<li>องค์ประกอบ
binaryfunt

2
หมายเหตุ: สิ่งนี้ไม่รองรับการเยื้องการแขวน
Eric

คำตอบที่ยอดเยี่ยมมันทำงานได้อย่างสมบูรณ์แบบด้วยจำนวนงานที่น้อยที่สุด! ขอบคุณ!
KyleFarris

12

สำหรับlist-style-type: inline :

มันเกือบจะเหมือนกันกับคำตอบของ DSMann8 แต่น้อย css code

คุณเพียงแค่ต้อง

<style>
    li:before {
        content: "";
        padding-left: 10px;
    }
</style>

<ul>
    <li>Some content</li>
</ul>

ไชโย


ใช้งานได้ดีlist-style-position: insideเช่นกันซึ่งยอดเยี่ยมมาก!
Matt Dodge

11

คุณสามารถใช้แอpadding-leftททริบิวในรายการ ( ไม่ใช่ในรายการ!)


5
โปรดทราบงานนี้เฉพาะในกรณีที่มีการตั้งค่าเริ่มต้นlist-style-position outside
สิงหาคม

นี่ควรเป็นคำตอบที่ยอมรับได้อย่างน้อยสำหรับการใช้งานปกติ มันหลีกเลี่ยงการใช้<span>องค์ประกอบเพียงเพื่อการออกแบบ
eukras

7

การใช้การเยื้องข้อความบน li ทำได้ดีที่สุด

เยื้องข้อความ: -x px; จะย้ายกระสุนให้เข้าใกล้ li และในทางกลับกัน

การใช้ความสัมพันธ์เมื่อขยายระยะทางด้านซ้ายเชิงลบอาจทำงานไม่ถูกต้องกับ IE เวอร์ชันเก่า PS- หลีกเลี่ยงการให้ตำแหน่งมากที่สุดเท่าที่จะทำได้


สิ่งนี้มีพฤติกรรมแปลก ๆ บน Chrome สแนปไปยังพื้นที่เล็ก ๆ ที่ -5px;
Ian Warburton

7

นี่เป็นอีกวิธีการแก้ปัญหาโดยใช้องค์ประกอบ css เคาน์เตอร์และหลอก ฉันคิดว่ามันสวยงามกว่าเพราะไม่ต้องใช้มาร์กอัป html หรือ css พิเศษ:

ol,
ul {
    list-style-position: inside;
}

li {
    list-style-type: none;
}

ol {
    counter-reset: ol; //reset the counter for every new ol
}

ul li:before {
        content: '\2022 \00a0 \00a0 \00a0'; //bullet unicode followed by 3 non breakable spaces
}

ol li:before {
        counter-increment: ol;
        content: counter(ol) '.\00a0 \00a0 \00a0'; //css counter followed by a dot and 3 non breakable spaces
}

ฉันใช้ช่องว่างที่ไม่สามารถแยกได้เพื่อให้ระยะห่างมีผลกับบรรทัดแรกขององค์ประกอบรายการของฉันเท่านั้น (หากองค์ประกอบรายการมีความยาวมากกว่าหนึ่งบรรทัด) คุณสามารถใช้ช่องว่างภายในที่นี่แทน


7

คำถามเก่า แต่ยังเกี่ยวข้อง text-indentผมขอแนะนำให้ใช้ในเชิงลบ จะต้องเป็นlist-style-positionoutside

ข้อดี:

  • กระสุนอยู่ในตำแหน่งที่ถูกต้องโดยอัตโนมัติ
  • เปลี่ยนขนาดตัวอักษรไม่ทำลายตำแหน่งสัญลักษณ์แสดงหัวข้อย่อย
  • ไม่มีองค์ประกอบเพิ่มเติม (ไม่มี :: องค์ประกอบหลอกด้วย)
  • ใช้ได้กับทั้ง RTL และ LTR โดยไม่มีการเปลี่ยนแปลงใน CSS

จุดด้อย:

  • ลอง
  • ถึง
  • หา
  • หนึ่ง :)

2
ฉันลองใช้วิธีนี้ แต่เยื้องไม่ได้ผลสำหรับฉันหากมีตัวแบ่งบรรทัด การเยื้องข้อความจะเยื้องบรรทัดแรกเท่านั้น
แมตต์

6

รายการที่ไม่เรียงลำดับเริ่มต้นด้วยแท็ก ul แต่ละรายการในรายการเริ่มต้นด้วยรายการในรายการจะถูกทำเครื่องหมายด้วยสัญลักษณ์แสดงหัวข้อย่อย (วงกลมสีดำขนาดเล็ก) โดยค่าเริ่มต้น:

    <!DOCTYPE html>
    <html>
       <body>
          <h2>Normal List </h2>
          <ul>
             <li>Coffee</li>
             <li>Tea</li>
             <li>Milk</li>
          </ul>
       </body>
    </html>

เอาท์พุท:

<!DOCTYPE html>
<html>
<body>

<h2>Normal List </h2>

<ul>
  <li>Coffee</li>
  <li>Tea</li>
  <li>Milk</li>
</ul>

</body>
</html>

คุณสมบัติการเยื้องข้อความระบุการเยื้องของบรรทัดแรกในบล็อกข้อความ
หมายเหตุ: อนุญาตให้ใช้ค่าลบ บรรทัดแรกจะเยื้องไปทางซ้ายหากค่าเป็นลบ

<ul style='text-indent: -7px;'>
  <li>Coffee</li>
  <li>Tea</li>
  <li>Milk</li>
</ul>

ขอบคุณสำหรับคำตอบโปรดลองใส่หมายเหตุประกอบโซลูชันของคุณเพื่อความสะดวกในการทำความเข้าใจของผู้อื่น
cdomination

นี่คือคำตอบที่ดีที่สุดและควรได้รับการยอมรับ CSS ขั้นต่ำ!
KawaiKx

5

ดูเหมือนว่าคุณสามารถ (ค่อนข้าง) ควบคุมระยะห่างโดยใช้การเติมบนแท็ก <li>

<style type="text/css">
    li { padding-left: 10px; }
</style>

สิ่งที่จับได้คือมันดูเหมือนจะไม่อนุญาตให้คุณขยี้มันอย่างสบาย ๆ เหมือนเป็นตัวอย่างสุดท้ายของคุณ

สำหรับสิ่งที่คุณสามารถลองปิด list-style-type และการใช้ & bull;

<ul style="list-style-type: none;">
    <li>&bull;Some list text goes here.</li>
</ul>

5

ดูเหมือนว่าจะมีวิธีแก้ปัญหาที่สะอาดกว่าถ้าคุณต้องการลดระยะห่างระหว่างสัญลักษณ์แสดงหัวข้อย่อยและข้อความ:

li:before {
    content: "";
    margin-left: -0.5rem;
}

4

นอกจากนี้คุณยังสามารถใช้การเปลี่ยนภาพพื้นหลังเป็นอีกทางเลือกหนึ่งทำให้คุณสามารถควบคุมการวางตำแหน่งแนวตั้งและแนวนอนได้อย่างสมบูรณ์

ดูคำตอบของคำถามนี้


3
ul
{
list-style-position:inside;
} 

ความหมายและการใช้งาน

คุณสมบัติ list-style-position ระบุว่าตัวทำเครื่องหมายรายการควรปรากฏภายในหรือภายนอกการไหลของเนื้อหา

ที่มา: http://www.w3schools.com/cssref/pr_list-style-position.asp


1
นี่ไม่ได้ตอบคำถาม มันถามวิธีการควบคุมขนาดของการเยื้อง
ชื่อลึกลับหน้าจอ

0

คุณสามารถใช้ul li:beforeและภาพพื้นหลังและกำหนดposition: relativeและposition:absoluteให้กับliและli:beforeตามลำดับ วิธีนี้คุณสามารถสร้างภาพและจัดวางตำแหน่งได้ทุกที่ที่คุณต้องการเทียบกับ li


0

ใช้padding-left:1em; text-indent:-1emสำหรับ<li>แท็ก
จากนั้นlist-style-position: insideสำหรับ<ul>แท็ก

<ul style='list-style-position: inside;'>
  <li style='padding-left: 1em; text-indent: -1em;'>Item 1</li>
</ul>

0

วิธีแก้ไขปัญหาต่อไปนี้ทำงานได้ดีเมื่อคุณต้องการย้ายข้อความเข้าใกล้สัญลักษณ์แสดงหัวข้อย่อยและแม้ว่าคุณจะมีข้อความหลายบรรทัด

margin-right ช่วยให้คุณสามารถย้ายข้อความเข้าใกล้สัญลักษณ์แสดงหัวข้อย่อย

text-indent ทำให้แน่ใจว่าข้อความหลายบรรทัดยังคงเรียงกันอย่างถูกต้อง

li:before {
  content: "";
  margin-right: -5px; /* Adjust this to move text closer to the bullet */
}

li {
  text-indent: 5px; /* Aligns second line of text */
}
<ul>
  <li> Item 1 ... </li>
  <li> Item 2 ... this item has tons and tons of text that causes a second line! Notice how even the second line is lined up with the first!</li>
  <li> Item 3 ... </li>
</ul>

ป้อนคำอธิบายรูปภาพที่นี่


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.