ไม่: ตัวเลือกลูกคนแรก


811

ฉันมีdivแท็กที่มีหลายulแท็ก

ฉันสามารถตั้งค่าคุณสมบัติ CSS สำหรับulแท็กแรกเท่านั้น:

div ul:first-child {
    background-color: #900;
}

อย่างไรก็ตามความพยายามของฉันต่อไปนี้ในการตั้งค่าคุณสมบัติ CSS สำหรับแต่ละulแท็กยกเว้นแท็กแรกไม่ทำงาน:

div ul:not:first-child {
    background-color: #900;
}

div ul:not(:first-child) {
    background-color: #900;
}

div ul:first-child:after {
    background-color: #900;
}

ฉันจะเขียนใน CSS: "แต่ละองค์ประกอบยกเว้นองค์ประกอบแรก" ได้อย่างไร

คำตอบ:


1414

หนึ่งในรุ่นที่คุณโพสต์งานได้จริงสำหรับเบราว์เซอร์ที่ทันสมัย (ที่CSS เตอร์ระดับ 3ได้รับการสนับสนุน ):

div ul:not(:first-child) {
    background-color: #900;
}

หากคุณต้องการสนับสนุนเบราว์เซอร์รุ่นเก่าหรือหากคุณถูกจำกัด โดยข้อ จำกัด:notของตัวเลือก(จะยอมรับเฉพาะตัวเลือกอย่างง่ายเป็นอาร์กิวเมนต์) ดังนั้นคุณสามารถใช้เทคนิคอื่น:

กำหนดกฎที่มีขอบเขตมากกว่าสิ่งที่คุณตั้งใจและจากนั้น "เพิกถอน" แบบมีเงื่อนไขโดย จำกัด ขอบเขตของสิ่งที่คุณต้องการ:

div ul {
    background-color: #900;  /* applies to every ul */
}

div ul:first-child {
    background-color: transparent; /* limits the scope of the previous rule */
}

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


คุณรู้หรือไม่ว่าเวอร์ชันนี้ไม่รองรับ
Simon_Weaver

9
@Simon_Weaver: ในทางปฏิบัติทุกอย่าง แต่ IE <9 รองรับ แหล่งข้อมูลที่ดีที่จะได้รับชนิดของข้อมูลเป็นcaniuse.com
Jon

2
อืม .. ระวังข้อ จำกัด ของโซลูชันแรก: caniuse.com/#feat=css-not-sel-list อันที่สองฟังดูสมเหตุสมผลกว่าสำหรับฉัน ขอบคุณ!
iorrah

@iorrah ลิงก์ caniuse ของคุณใช้สำหรับรายการตัวเลือกและใช่การสนับสนุนยังคง จำกัด อยู่มาก OP ไม่ได้ใช้รายการตัวเลือก ดังนั้นฉันคิดว่าhttps://caniuse.com/#feat=css-sel3เหมาะสมกว่าด้วยการสนับสนุนที่ยอดเยี่ยมนอกเหนือจากยุคของ IE8
secretwep

ใช้งานได้แม้ไม่มีองค์ประกอบ div ตอนเริ่มต้นใน chrome
Achraf JEDAY

158

โซลูชัน CSS2 นี้ (" ulหลังจากนี้อีกครั้งul") ก็ใช้ได้เหมือนกันและได้รับการสนับสนุนจากเบราว์เซอร์เพิ่มเติม

div ul + ul {
  background-color: #900;
}

ซึ่งแตกต่าง:notและ:nth-siblingการเลือกพี่น้องที่อยู่ติดกันได้รับการสนับสนุนโดย IE7 +

ถ้าคุณมีJavaScriptเปลี่ยนแปลงคุณสมบัติเหล่านี้หลังจากที่โหลดหน้าเว็บที่คุณควรจะดูที่บางส่วนข้อบกพร่องที่รู้จักกันดีในIE7และIE8การใช้งานนี้ ดูลิงค์นี้

สำหรับหน้าเว็บคงที่ใด ๆ สิ่งนี้ควรจะทำงานได้อย่างสมบูรณ์


4
@Leven: ลิงค์ quirksmodeนั้นบอกว่าควรจะทำงานใน IE7 แต่เป็นแบบคงที่เท่านั้น หาก JS ของคุณวางองค์ประกอบอื่นไว้ข้างหน้าองค์ประกอบนั้นอาจไม่ได้รับการอัปเดตอย่างถูกต้อง นั่นเป็นปัญหาที่คุณเห็นหรือไม่?
Alex Quinn

อาจมีค่าสังเกตว่าในลำดับขององค์ประกอบเช่น: ul ul div ul(ที่องค์ประกอบเหล่านี้เป็นพี่น้อง) เฉพาะ ul ที่สองจะถูกเลือกเนื่องจากคนสุดท้ายไม่ได้ulก่อนหน้านี้เอง
Brian H.

79

เนื่องจากIE6-8:notไม่เป็นที่ยอมรับฉันขอแนะนำให้คุณทำสิ่งนี้:

div ul:nth-child(n+2) {
    background-color: #900;
}

เพื่อให้คุณเลือกทุกulในองค์ประกอบหลักของมันยกเว้นคนแรก

อ้างถึงคริส Coyer ของ"ที่มีประโยชน์: ที่ n-เด็กสูตร"บทความมากขึ้นตัวอย่างnth-child


ใครที่ยังคงใช้ IE6-8 ในปี 2019
เด็ก

15
หากพิจารณาคำตอบคือจาก 2013
aasukisuki


14

not(:first-child)ดูเหมือนจะไม่ทำงานอีกต่อไป อย่างน้อยด้วย Chrome และ Firefox เวอร์ชันที่ใหม่กว่า

ลองทำสิ่งนี้แทน:

ul:not(:first-of-type) {}

6
ทั้งคู่ทำงาน แต่มีความหมายแตกต่างกัน ul:not(:first-child)หมายถึง " ulองค์ประกอบใด ๆที่ไม่ได้เป็นลูกคนแรกของแม่" ดังนั้นมันจะไม่ตรงกันแม้แต่อันดับที่ 1 ulหากองค์ประกอบนั้นนำหน้าด้วยองค์ประกอบอื่น ( pหัวเรื่อง ฯลฯ ) ในทางตรงกันข้ามul:not(:first-of-type)หมายถึง " ulองค์ประกอบใด ๆยกเว้นที่ 1 ulในภาชนะ" คุณถูกที่ OP อาจต้องการพฤติกรรมหลัง แต่คำอธิบายของคุณค่อนข้างทำให้เข้าใจผิด
Ilya Streltsyn

9

คุณสามารถใช้ตัวเลือกใดก็ได้ด้วย not

p:not(:first-child){}
p:not(:first-of-type){}
p:not(:checked){}
p:not(:last-child){}
p:not(:last-of-type){}
p:not(:first-of-type){}
p:not(:nth-last-of-type(2)){}
p:not(nth-last-child(2)){}
p:not(:nth-child(2)){}

4

ฉันไม่มีโชคกับสิ่งที่กล่าวมา

นี่เป็นสิ่งเดียวที่ทำงานได้จริงสำหรับฉัน

ul:not(:first-of-type) {}

สิ่งนี้ใช้ได้กับฉันเมื่อฉันพยายามให้ปุ่มแรกปรากฏบนหน้าเว็บโดยไม่ได้รับผลกระทบจากตัวเลือกระยะขอบซ้าย

นี่เป็นตัวเลือกที่ฉันลองก่อน แต่มันไม่ได้ผล

ul:not(:first-child)


4

คุณสามารถใช้ตัวเลือกของคุณด้วย:notร้องเหมือนคุณสามารถใช้ตัวเลือกใด ๆ ภายใน:not()

any_CSS_selector:not(any_other_CSS_selector){
    /*YOUR STYLE*/
}

คุณสามารถใช้:notโดยไม่มีตัวเลือกพาเรนต์เช่นกัน

   :not(:nth-child(2)){
        /*YOUR STYLE*/
   }

ตัวอย่างเพิ่มเติม

any_CSS_selector:not(:first-child){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:first-of-type){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:checked){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:last-child){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:last-of-type){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:first-of-type){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:nth-last-of-type(2)){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:nth-last-child(2)){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:nth-child(2)){
    /*YOUR STYLE*/
}

0

อย่างที่ฉันใช้ul:not(:first-child)เป็นทางออกที่สมบูรณ์แบบ

div ul:not(:first-child) {
    background-color: #900;
}

เหตุใดจึงสมบูรณ์แบบเพราะโดยการใช้ul:not(:first-child)เราสามารถใช้ CSS กับองค์ประกอบภายใน ชอบli, img, span, aแท็กเป็นต้น

แต่เมื่อใช้โซลูชันอื่น ๆ :

div ul + ul {
  background-color: #900;
}

และ

div li~li {
    color: red;
}

และ

ul:not(:first-of-type) {}

และ

div ul:nth-child(n+2) {
    background-color: #900;
}

สิ่งเหล่านี้ จำกัด CSS ระดับ ul เท่านั้น สมมติว่าเราไม่สามารถใช้ CSS ในliฐานะ `div ul + ul li '

สำหรับองค์ประกอบระดับภายในโซลูชันแรกทำงานได้อย่างสมบูรณ์แบบ

div ul:not(:first-child) li{
        background-color: #900;
    }

และอื่น ๆ ...

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