มี CSS ที่ไม่เท่ากับตัวเลือกหรือไม่?


116

มีบางอย่างเช่น! = (ไม่เท่ากัน) ใน CSS หรือไม่? เช่นฉันมีรหัสต่อไปนี้:

input {
 ... 
 ...
}

แต่สำหรับบางอินพุตฉันจำเป็นต้องโมฆะสิ่งนี้ ฉันต้องการทำเช่นนั้นโดยการเพิ่มคลาส "รีเซ็ต" ลงในแท็กอินพุตเช่น

<input class="reset" ... />

จากนั้นก็ข้ามแท็กนี้จาก CSS

ฉันจะทำเช่นนั้นได้อย่างไร?

วิธีเดียวที่ฉันเห็นคือเพิ่มคลาสบางส่วนในแท็กอินพุตและเขียน CSS ใหม่ดังนี้:

input.mod {
 ...
 ...
}

คุณตอบคำถามของคุณฉันคิดว่า ใส่สไตล์ใน input.mod และเพิ่มคลาส 'mod' ในแท็กอินพุตที่ต้องการ
Nazmul

คำตอบ:


157

ใน CSS3 คุณสามารถใช้:not()ตัวกรองได้ แต่เบราว์เซอร์บางตัวยังไม่รองรับ CSS3 อย่างสมบูรณ์ดังนั้นคุณต้องรู้ว่าคุณกำลังทำอะไรอยู่ซึ่งตอนนี้ เบราว์เซอร์หลักทั้งหมดรองรับ (และมีมาระยะหนึ่งแล้วนี่เป็นคำตอบเก่า ๆ ... )

ตัวอย่าง:

<input type="text" value="will be matched" />
<input type="text" value="will not be matched" class="avoidme" />
<input type="text" value="will be matched" />

และ CSS

input:not(.avoidme) { background-color: green; }

หมายเหตุ:วิธีแก้ปัญหานี้ไม่จำเป็นอีกต่อไป ฉันทิ้งไว้ที่นี่เพื่อดูบริบท

หากคุณไม่ต้องการใช้ CSS3 คุณสามารถตั้งค่าสไตล์ให้กับองค์ประกอบทั้งหมดจากนั้นตั้งค่าใหม่ด้วยคลาส

input { background-color: green; }
input.avoidme { background-color: white; }

โอ้พระเจ้า ... ฉันรู้แล้วว่ามันมีอยู่จริง :) ใช่แล้ว! ขอบคุณ
Alex Ivasyuv

2
การสนับสนุนส่วนใหญ่ขาดจาก IE8 (และรุ่นเก่ากว่า) หากใครสนใจ
โพลีฟิลล์

1
@ คุรุ: คุณสามารถเชื่อมโยง:not()ตัวเลือกได้หลายตัว: input:not(.avoidme):not(.avoidmetoo)จะหลีกเลี่ยงองค์ประกอบที่มีคลาสใดคลาสหนึ่งinput:not(.avoidme.andme)จะหลีกเลี่ยงองค์ประกอบที่มีทั้งสองคลาส
Tomas Aschan

1
@TomasLycken จริงโดยใช้ตัวเลือกหลายเป็นหนึ่งที่หากินใน CSS เช่น:not(.this.that) { }การทำงานพฤษภาคม แต่ถ้าคุณทำบางสิ่งบางอย่างเช่นคุณจะล้มลงคุณต้องห่วงโซ่เดซี่พวกเขาเช่น::not(.this, .that) { } :not(.this):not(.that)ฉันเข้าใจว่าคุณคงทราบเรื่องนี้ฉันกำลังพยายามช่วยผู้อ่านในอนาคต :)
สามารถ O 'Spam

1
ออกความคิดเห็นที่นี่เพื่อให้ผู้อ่านในอนาคต: ความคิดเห็น @SamSwift 웃 's ยังคงเป็นที่ถูกต้อง แต่การสนับสนุนสำหรับรายการจะ (อาจจะ) มาในอนาคต :not()แต่ในเวลานี้มีเพียงตัวเลือกเดียวที่ได้รับการสนับสนุนภายใน
Tomas Aschan

24

คุณยังสามารถทำได้โดย "ย้อนกลับ" การเปลี่ยนแปลงในคลาสรีเซ็ตเฉพาะใน CSS

INPUT { 
    padding: 0px;
}
INPUT.reset {
    padding: 4px;
}


6

คุณสามารถเข้าใกล้สิ่งนี้ได้โดยกำหนดเป้าหมายแอตทริบิวต์เช่นนี้:

input:not([type=checkbox]){ width:100%; }

ในกรณีนี้อินพุตทั้งหมดที่ไม่ใช่ประเภท "ช่องทำเครื่องหมาย" จะมีความกว้าง 100%


4

น่าสนใจเพียงแค่ลองใช้สิ่งนี้เพื่อเลือกองค์ประกอบ DOM โดยใช้ JQuery และใช้งานได้! :)

$("input[class!='bad_class']");

หน้านี้มี 168 div ซึ่งไม่มีคลาส 'comment-copy'

$("div[class!='comment-copy']").length => 168
$("div[class!='.comment-copy']").length => 168

11
[attr!="value"]เป็นตัวเลือกjQuery เท่านั้นapi.jquery.com/attribute-not-equal-selector
xec

สิ่งนี้เกี่ยวข้องกับ CSS อย่างไร
devlin carnate

ตัวเลือก "CSS" ของ @devlincarnate ได้เปลี่ยนเป็น JS ( ประมาณปี 2013 ) เพื่อให้มีคนค้นหา
Nick T

0

แทนที่จะใช้ class = "reset" คุณสามารถย้อนตรรกะได้โดยมี class = "valid" คุณสามารถเพิ่มสิ่งนี้ตามค่าเริ่มต้นและลบคลาสเพื่อรีเซ็ตสไตล์

จากตัวอย่างของคุณและโทมัส

input.valid {
 ... 
 ...
}

และ

<input type="text" value="will be matched" class="valid"/>
<input type="text" value="will not be matched" />
<input type="text" value="will be matched" class="valid"/>

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