เปลี่ยนสีสัญลักษณ์แสดงหัวข้อย่อยของรายการ HTML โดยไม่ต้องใช้ช่วง


88

ฉันสงสัยว่ามีวิธีเปลี่ยนสีของสัญลักษณ์แสดงหัวข้อย่อยในรายการหรือไม่

ฉันมีรายการดังนี้:

<ul>
   <li>House</li>
   <li>Car</li>
   <li>Garden</li>
</ul>

เป็นไปไม่ได้ที่ฉันจะใส่อะไรลงไปในตัว li เช่น 'span' og a 'p' ดังนั้นฉันสามารถเปลี่ยนสีของสัญลักษณ์แสดงหัวข้อย่อย แต่ไม่ใช่ข้อความด้วยวิธีที่ชาญฉลาดได้หรือไม่?

คำตอบ:


34

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

การใช้รูปภาพ

li { list-style-image: url(images/yourimage.jpg); }

ดู

รายการสไตล์ภาพ

โดยไม่ต้องใช้รูปภาพ

จากนั้นคุณต้องแก้ไขมาร์กอัป HTML และรวมช่วงในรายการและระบายสี li และ span ด้วยสีที่ต่างกัน


1
Jep นี้สามารถทำงานได้ แต่จริงๆแล้วฉันตัดสินใจที่จะใช้ภาพพื้นหลังจากนั้นก็ใช้ list-style-type: none; สิ่งนี้ทำให้ฉันมีอิสระในการจัดตำแหน่ง "สัญลักษณ์แสดงหัวข้อย่อย" มากกว่ารูปภาพสไตล์ลิสต์เล็กน้อย แต่คุณยังคงได้คำตอบ 1+ และถูกต้อง
Kim Andersen

6
ทำงานร่วมกับ data-uri svgs ได้เช่นกัน:list-style-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10"><circle fill="red" cx="5" cy="5" r="2"/></svg>');
Jon Surrell

การใช้วิธี @JonSurrell ฉันสามารถบรรลุผลลัพธ์ที่น่าพอใจมาก มันแย่เกินไปที่ไม่ใช่หนึ่งในคำตอบที่แนะนำ โซลูชันนี้เป็นแบบข้ามเบราว์เซอร์สำหรับโพสต์ IE8 และแก้ไขได้ง่ายเพื่อสร้างรูปร่างที่กำหนดเองที่น่าสนใจ
KoldBane

@KoldBane ดูคำตอบใหม่ของฉัน :)
Jon Surrell

@DimitryK โปรดดูคำตอบทั้งหมดที่ฉันเขียนและแสดงความคิดเห็นที่นั่น ทำงานได้ดีใน FF43
Jon Surrell

187

ฉันจัดการสิ่งนี้โดยไม่ต้องเพิ่มมาร์กอัป แต่ใช้li:beforeไฟล์. เห็นได้ชัดว่าสิ่งนี้มีข้อ จำกัด ทั้งหมดของ:before(ไม่มีการรองรับ IE แบบเก่า) แต่ดูเหมือนว่าจะใช้งานได้กับ IE8, Firefox และ Chrome หลังจากการทดสอบบางอย่างที่ จำกัด มาก รูปแบบสัญลักษณ์แสดงหัวข้อย่อยยังถูก จำกัด ด้วยสิ่งที่อยู่ในยูนิโค้ด

li {
  list-style: none;
}
li:before {
  /* For a round bullet */
  content: '\2022';
  /* For a square bullet */
  /*content:'\25A0';*/
  display: block;
  position: relative;
  max-width: 0;
  max-height: 0;
  left: -10px;
  top: 0;
  color: green;
  font-size: 20px;
}
<ul>
  <li>foo</li>
  <li>bar</li>
</ul>


5
นอกจากนี้คุณสามารถทำสิ่งเดียวกันกับรายการสั่งซื้อได้ที่jsfiddle.net/uZRGN
Nightfirecat

3
ยอดเยี่ยม. ด้วยการใช้งาน IE8 + ที่กว้างขนาดนี้ฉันคิดว่าตอนนี้น่าจะเป็นคำตอบ (หมายเหตุฉันเคยfont-size:1emได้รับกระสุนที่มีสัดส่วนที่ดีกว่า!)
EvilDr

ฉันไม่ชอบวิธีนี้เพราะจะเกิดอะไรขึ้นเมื่อมีคนพยายามที่จะแสดงไฟล์ ul โดยตั้งค่าประเภทรายการเป็นไม่มี หมายความว่าคุณต้องกำหนดขอบเขตสไตล์เหล่านี้ในบางคลาสเช่น ul.greenDisc
ctb

19

เราสามารถรวมlist-style-imageกับsvgs ซึ่งเราสามารถอินไลน์ใน css ได้ ! วิธีนี้ช่วยให้สามารถควบคุม "กระสุน" ได้อย่างไม่น่าเชื่อซึ่งสามารถกลายเป็นอะไรก็ได้

หากต้องการรับวงกลมสีแดงให้ใช้ css ต่อไปนี้:

ul {
  list-style-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10" width="10" height="10"><circle fill="red" cx="5" cy="5" r="2"/></svg>');
}

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

แอตทริบิวต์ความกว้าง / ความสูง

บางเบราว์เซอร์ต้องการwidthและheightตั้งค่าแอตทริบิวต์<svg>หรือไม่ก็ไม่แสดงอะไรเลย ในขณะที่เขียน Firefox เวอร์ชันล่าสุดแสดงปัญหานี้ ฉันได้ตั้งค่าคุณสมบัติทั้งสองในตัวอย่างแล้ว

การเข้ารหัส

ความคิดเห็นล่าสุดทำให้ฉันนึกถึงการเข้ารหัสสำหรับ data-uri นี่เป็นจุดที่เจ็บปวดสำหรับฉันเมื่อไม่นานมานี้และฉันสามารถแบ่งปันข้อมูลเล็กน้อยที่ฉันค้นคว้าได้

ข้อมูลจำเพาะข้อมูล URIซึ่งอ้างอิงข้อมูลจำเพาะ URIกล่าวว่า SVG ควรได้รับการเข้ารหัสตามสเป็ค URI นั่นหมายความว่าทุกประเภทของตัวอักษรที่ควรได้รับการเข้ารหัสเช่นกลายเป็น<%3C

แหล่งข้อมูลบางแห่งแนะนำการเข้ารหัส base64 ซึ่งควรแก้ไขปัญหาการเข้ารหัสอย่างไรก็ตามจะเพิ่มขนาด SVG โดยไม่จำเป็นในขณะที่การเข้ารหัส URI จะไม่ ฉันแนะนำให้เข้ารหัส URI

ข้อมูลเพิ่มเติม:

การสนับสนุนเบราว์เซอร์: > ie8.0

เทคนิค css บน svgs

mdn บน svgs


1
นี่เป็นคำตอบที่ดีที่สุดและยังใช้ได้กับตัวแปลงการนำเสนอเช่น Cleaver
พูดไม่ออก

1
ฉันชอบวิธีนี้มากเพราะสไตล์จะไม่ทำให้การใช้งาน ul ผิดปกติกล่าวคือเมื่อตั้งค่าประเภทรายการเป็นไม่มีและเนื่องจากไม่ได้ขึ้นอยู่กับการตัดเนื้อหาของ li ในรูปแบบอื่น ๆ ธาตุ. อย่างไรก็ตามมันไม่ทำงานสำหรับฉันใน IE11 หรือ Edge ... ?
ctb

@ctb ฉันไม่ได้ทดสอบเบราว์เซอร์เหล่านั้นโดยเฉพาะ แต่คุณอ่านข้อแม้การเข้ารหัสหรือไม่? คุณอาจไม่สามารถคัดลอก / วาง<svg>โค้ด"สวย" ได้โปรดลองรันผ่านตัวเข้ารหัส uri ก่อน
Jon Surrell

1
@JonSurrell ใช่ใช้งานได้เมื่อฉันเข้ารหัสรหัส svg ขอบคุณมาก
ctb

1
ฉันชอบคำตอบนี้เพราะรองรับขนาดสัมพัทธ์เช่น r = "1.5em"
plexoos

16

การสร้างโซลูชันของ @ Marc - เนื่องจากอักขระสัญลักษณ์แสดงหัวข้อย่อยแสดงผลแตกต่างกันไปตามแบบอักษรและเบราว์เซอร์ที่แตกต่างกันฉันจึงใช้เทคนิค css3 ต่อไปนี้กับ border-radius เพื่อสร้างสัญลักษณ์แสดงหัวข้อย่อยที่ฉันสามารถควบคุมได้มากกว่า:

li:before {
    content: '';
    background-color: #898989;
    display: inline-block;
    position: relative;
    height: 12px;
    width: 12px;
    border-radius: 6px;
    -webkit-border-radius: 6px;
    -moz-border-radius: 6px;
    -moz-background-clip: padding;
    -webkit-background-clip: padding-box;
    background-clip: padding-box;
    margin-right: 4px;
    top: 2px;
}

1
@ddilsaver คุณพูดถูกฉันกำลังตั้งค่าสีพื้นหลังในกฎอื่นที่เฉพาะเจาะจงสำหรับแต่ละรายการโฆษณา (ลูกค้าต้องการสีที่แตกต่างกันในแต่ละรายการ) ฉันได้อัปเดตแล้ว
jessica

2
ทางออกที่ดีมาก ฉันขอแนะนำให้เปลี่ยนรัศมีขอบเป็น 50% เพื่อให้ยืดหยุ่นขึ้นเล็กน้อยในกรณีที่ความสูง / ความกว้างเปลี่ยนไป
ทิม

11

ฉันรู้ว่านี่เป็นคำถามเก่า ๆ จริงๆ แต่ฉันกำลังเล่นกับสิ่งนี้และหาวิธีที่ฉันไม่เคยเห็นโพสต์ กำหนดสีให้รายการแล้วเขียนทับสีข้อความโดยใช้::first-lineตัวเลือก ฉันไม่ใช่ผู้เชี่ยวชาญดังนั้นอาจมีบางอย่างผิดปกติกับวิธีการนี้ที่ฉันขาดหายไป แต่ดูเหมือนว่าจะได้ผล

li {
  color: blue;
}

li::first-line {
  color: black;
}
<ul>
  <li>House</li>
  <li>Car</li>
  <li>Garden</li>
</ul>


วิธีง่ายๆที่ดีสำหรับรายการบรรทัดเดียว
planetClaire

6

การสร้างโซลูชัน @Marc และ @jessica - นี่คือโซลูชันที่ฉันใช้:

li { 
   position:relative;
}
li:before {
      content:'';
      display: block;
      position: absolute;
      width: 6px;
      height:6px;
      border-radius:6px;
      left: -20px;
      top: .5em;
      background-color: #000;
}

ฉันใช้emสำหรับขนาดฟอนต์ดังนั้นหากคุณกำหนดค่าของคุณtopให้เป็นค่า.5emนั้นจะถูกวางไว้ที่จุดกึ่งกลางของข้อความบรรทัดแรกเสมอ ฉันใช้left:-20pxเพราะเป็นตำแหน่งเริ่มต้นของสัญลักษณ์แสดงหัวข้อย่อยในเบราว์เซอร์: parent padding/2


2

ฉันชอบคำตอบของ Marc มากเช่นกัน - ฉันต้องการชุด UL สีต่างๆและเห็นได้ชัดว่าการใช้คลาสจะง่ายกว่า นี่คือสิ่งที่ฉันใช้สำหรับสีส้มเช่น:

ul.orange {
    list-style: none;
    padding: 0px;
}
ul.orange > li:before {
    content: '\25CF ';
    font-size: 15px;
    color: #F00;
    margin-right: 10px;
    padding: 0px;
    line-height: 15px;
}

นอกจากนี้ฉันพบว่ารหัสฐานสิบหกที่ฉันใช้สำหรับ "เนื้อหา:" นั้นแตกต่างจากของ Marc (วงกลมเลขฐานสิบหกนั้นดูเหมือนจะสูงเกินไปเล็กน้อย) อันที่ฉันใช้ดูเหมือนจะนั่งตรงกลางพอดี ฉันยังพบรูปทรงอื่น ๆ อีกมากมาย (สี่เหลี่ยมสามเหลี่ยมวงกลม ฯลฯ ) ที่นี่


1

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

ul {
  list-style-type: none;
}

li {
  position: relative;
}

li:before {
  content: '';
  display: block;
  position: absolute;
  width: 5px; /* adjust to suit your needs */
  height: 5px; /* adjust to suit your needs */
  border-radius: 50%;
  left: -15px; /* adjust to suit your needs */
  top: 0.5em;
  background: #f00; /* adjust to suit your needs */
}
<ul>
  <li>first</li>
  <li>second</li>
  <li>third</li>
</ul>

หมายเหตุ:

  • widthและheightควรมีค่าเท่ากันเพื่อให้พอยน์เตอร์ปัดเศษ
  • คุณอาจตั้งค่าborder-radiusเป็นศูนย์หากคุณต้องการมีsquareสัญลักษณ์แสดงหัวข้อย่อย

สำหรับรูปแบบสัญลักษณ์แสดงหัวข้อย่อยเพิ่มเติมคุณสามารถใช้รูปทรง css อื่น ๆhttps://css-tricks.com/examples/ShapesOfCSS/ (เลือกสิ่งนี้ที่ไม่ต้องการองค์ประกอบหลอกในการทำงานตัวอย่างเช่นสามเหลี่ยม)


1

:: เครื่องหมาย

คุณสามารถใช้::markerองค์ประกอบหลอก CSS เพื่อเลือกกล่องเครื่องหมายของรายการ (เช่นสัญลักษณ์แสดงหัวข้อย่อยหรือตัวเลข)

ul li::marker {
  color: red;
}

หมายเหตุ:ในขณะโพสต์คำตอบนี้ถือเป็นเทคโนโลยีทดลองและมีการนำไปใช้ใน Firefox และ Safari เท่านั้น (จนถึงขณะนี้)


ผ่านการทดสอบและใช้งานได้ใน Firefox และ Safari ปัจจุบัน ดูการสนับสนุนสำหรับเบราว์เซอร์อื่น ๆhttps://caniuse.com
แดเนียลส์

0

สร้างจากคำตอบของ @ ddilsaver ฉันต้องการที่จะใช้สไปรท์สำหรับกระสุน สิ่งนี้ดูเหมือนจะใช้ได้:

li {
  list-style: none;
  position: relative;
}

li:before {
  content:'';
  display: block;
  position: absolute;
  width: 20px;
  height: 20px;
  left: -30px;
  top: 5px;
  background-image: url(i20.png); 
  background-position: 0px -40px; /* or whatever offset you want */
}

0

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

ul,
ol {
  list-style: none;
  padding: 0;
  margin: 0 0 0 15px;
}
ul {}
ol {
  counter-reset: li;
}
li {
  padding-left: 1em; 
}
ul li {}
ul li::before,
ol li::before {
  color: #91be3c;
  display: inline-block;
  width: 1em;
}
ul li::before {
  content: "\25CF";
  margin: 0 0.1em 0 -1.1em;
}
ol li {
  counter-increment: li;
}
ol li::before {
  content: counter(li);
  margin: 0 0 0 -1em;
}

ผมเลือกตัวละครที่แตกต่างกันเพื่อแสดงกระสุนเฝ้าดูมันนี่ ฉันจำเป็นต้องปรับระยะขอบตามลำดับบางทีค่าอาจจะใช้ไม่ได้กับแบบอักษรที่คุณเลือก (ตัวเลขใช้แบบอักษรบนเว็บของคุณ)



0

เวอร์ชันอินไลน์ใช้ได้กับ Outlook Desktop:

<ul style="list-style:square;">
  <li style="color:red;"><span style="color:black;">Lorem.</span></li>
  <li style="color:red;"><span style="color:black;">Lorem.</span></li>
</ul>

JSFiddle

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