CSS3: คลาสหลอกที่ไม่ถูกเลือก


108

ฉันรู้ว่ามี:checkedคลาสหลอกCSS3 อย่างเป็นทางการแต่มี:uncheckedคลาสหลอกและพวกเขารองรับเบราว์เซอร์เดียวกันหรือไม่

การอ้างอิงของ Sitepointไม่ได้กล่าวถึงอย่างใดอย่างหนึ่งอย่างไรก็ตามข้อมูลจำเพาะ whatwgนี้(อะไรก็ได้) ทำ

ฉันรู้ว่าผลลัพธ์เดียวกันนี้สามารถทำได้เมื่อรวมคลาสหลอก:checkedและ:not()คลาสหลอก แต่ฉันยังอยากรู้อยากเห็น:

input[type="checkbox"]:not(:checked) {
    /* styles */
}

แก้ไข:

w3c แนะนำเทคนิคเดียวกัน

คุณสามารถเลือกช่องทำเครื่องหมายที่ไม่ได้ทำเครื่องหมายโดยใช้คลาสหลอกเทียม:

:not(:checked)

คำตอบ:


104

:unchecked ไม่ได้กำหนดไว้ในข้อกำหนด Selectors หรือ CSS UI ระดับ 3 และไม่ปรากฏในระดับ 4 ของ Selectors

ในความเป็นจริงอ้างจาก W3C จะนำมาจาก Selectors 4 ข้อมูลจำเพาะ เนื่องจากSelectors 4แนะนำให้ใช้:not(:checked)จึงปลอดภัยที่จะสมมติว่าไม่มีการ:uncheckedหลอกที่เกี่ยวข้อง เบราว์เซอร์รองรับ:not()และ:checkedเหมือนกันจึงไม่น่ามีปัญหา

สิ่งนี้อาจดูเหมือนไม่สอดคล้องกับ:enabledและ:disabledสถานะโดยเฉพาะอย่างยิ่งเนื่องจากองค์ประกอบไม่สามารถเปิดใช้งานหรือปิดใช้งานได้ (กล่าวคือไม่มีการใช้ความหมายโดยสมบูรณ์) อย่างไรก็ตามดูเหมือนจะไม่มีคำอธิบายใด ๆ สำหรับความไม่สอดคล้องกันนี้

( :indeterminateไม่นับเนื่องจากองค์ประกอบไม่สามารถยกเลิกการเลือกตรวจสอบหรือไม่ระบุได้ในทำนองเดียวกันเนื่องจากไม่มีการใช้ความหมาย)


เพียงเพื่อเพิ่มคำตอบนี้ว่าการเลือก: not (: checked) ทำงานได้อย่างสมบูรณ์บน Chrome แต่ไม่ได้อยู่ใน IE (ทดสอบบน 9 และ 11)
Bruno Finger

@Bruno Finger:: ตรวจสอบและ: ไม่ (: ตรวจสอบ) ควรทำงานบน IE ทั้งคู่ยกเว้นทั้งคู่จะได้รับผลกระทบอย่างเท่าเทียมกันจากข้อผิดพลาดที่การเปลี่ยนสถานะที่ตรวจสอบไม่ได้อัปเดตรูปแบบขององค์ประกอบที่กำหนดเป้าหมายโดยสัมพันธ์กับการเลือก / ไม่เลือก ธาตุ.
BoltClock

35

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

input[type="checkbox"] {
  // Unchecked Styles
}
input[type="checkbox"]:checked {
  // Checked Styles
}

ฉันขอโทษที่นำกระทู้เก่ามาใช้ แต่รู้สึกว่าน่าจะใช้คำตอบที่ดีกว่านี้ได้

แก้ไข (3/3/2559):

ข้อมูลจำเพาะ W3C ระบุว่า:not(:checked)เป็นตัวอย่างสำหรับการเลือกสถานะที่ไม่ถูกตรวจสอบ อย่างไรก็ตามนี่เป็นสถานะที่ไม่ได้เลือกไว้อย่างชัดเจนและจะใช้เฉพาะรูปแบบเหล่านั้นกับสถานะที่ไม่ได้ทำเครื่องหมาย สิ่งนี้มีประโยชน์สำหรับการเพิ่มสไตล์ที่จำเป็นเฉพาะในสถานะที่ไม่ถูกเลือกและจะต้องลบออกจากสถานะที่เลือกหากใช้กับinput[type="checkbox"]ตัวเลือก ดูตัวอย่างด้านล่างสำหรับคำชี้แจง

input[type="checkbox"] {
  /* Base Styles aka unchecked */
  font-weight: 300; // Will be overwritten by :checked
  font-size: 16px; // Base styling
}
input[type="checkbox"]:not(:checked) {
  /* Explicit Unchecked Styles */
  border: 1px solid #FF0000; // Only apply border to unchecked state
}
input[type="checkbox"]:checked {
  /* Checked Styles */
  font-weight: 900; // Use a bold font when checked
}

หากไม่ใช้:not(:checked)ในตัวอย่างด้านบน:checkedตัวเลือกจะต้องใช้ a border: none;เพื่อให้ได้ผลเช่นเดียวกัน

ใช้input[type="checkbox"]สำหรับจัดแต่งทรงผมฐานเพื่อลดความซ้ำซ้อน

ใช้input[type="checkbox"]:not(:checked)สำหรับรูปแบบที่ไม่ได้เลือกไว้อย่างชัดเจนซึ่งคุณไม่ต้องการใช้กับสถานะที่เลือก


มีการใช้ css selectors อื่น ๆ ที่มีประโยชน์ / แสดงออกแม้ว่า: javascript, การทดสอบเบราว์เซอร์อัตโนมัติ
nruth

2
สิ่งนี้ไม่สามารถทำได้เสมอไป โดยเฉพาะอย่างยิ่งองค์ประกอบของแบบฟอร์มเป็นที่ทราบกันดีว่าไม่อนุญาตให้คุณเปลี่ยนกลับเป็นรูปลักษณ์เริ่มต้นผ่านกฎการเรียงซ้อน (แม้ว่าทำไมใคร ๆ ก็ต้องการให้เฉพาะการตรวจสอบหรืออินพุตที่ไม่ได้เลือกเท่านั้น แต่รูปลักษณ์ที่กำหนดเองในขณะที่ออกจากโรงกษาปณ์อื่น ๆ นั้นอยู่นอกเหนือฉัน)
BoltClock

อีกกรณีหนึ่งที่ทำไม่ได้: ปุ่มตัวเลือกมากกว่า 2 ปุ่ม ตัวอย่างเช่นคุณอาจต้องการสไตล์เดียวเมื่อตัวเลือก # 1 คือ: เลือกและอีกแบบเมื่อเลือกสิ่งอื่น วิธีแก้ไขคือ:not(:checked)
นาวิน

ถ้าคุณต้องการเพียงต้องการคนที่เฉพาะเจาะจงสไตล์ทำไมไม่ใช้:first-child, :last-childหรือตัวเลือกในการรวมกันกับ:nth-child จะไม่ครอบคลุมสถานการณ์ที่คุณระบุเว้นแต่ฉันจะเข้าใจความคิดเห็นของคุณผิด :checked:not(:checked)
Michael Stramel

@MichaelStramel ใส่ลำดับของ htmls ลงใน css? ไม่ขอบคุณ
inetphantom

3

ไม่มี: ไม่ได้เลือกคลาสหลอกอย่างไรก็ตามหากคุณใช้คลาสหลอกที่ตรวจสอบแล้วและตัวเลือกพี่น้องคุณสามารถแยกความแตกต่างระหว่างทั้งสองสถานะได้ ฉันเชื่อว่าเบราว์เซอร์ล่าสุดทั้งหมดรองรับคลาสหลอกที่ตรวจสอบแล้วคุณสามารถค้นหาข้อมูลเพิ่มเติมได้จากแหล่งข้อมูลนี้: http://www.whatstyle.net/articles/18/pretty_form_controls_with_css

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


-2

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

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