ในที่สุดเรามาดูสาเหตุของปัญหา
ช่องทำเครื่องหมายจะแสดงผลโดยใช้ภาพ (หนึ่งอาจกำหนดให้คนที่กำหนดเองผ่าน CSS) นี่คือช่องทำเครื่องหมาย (ไม่ทำเครื่องหมาย) ใน FireFox เน้นด้วยตัวตรวจสอบ DOM:
และนี่คือช่องทำเครื่องหมายที่ไม่มีรูปแบบเดียวกันใน Chrome:
คุณสามารถเห็นระยะขอบ (สีส้ม); ไม่มีช่องว่างภายใน (จะแสดงเป็นสีเขียว) ดังนั้นอัตรากำไรหลอกแบบนี้ที่ด้านขวาและด้านล่างของช่องทำเครื่องหมายคืออะไร? เหล่านี้เป็นส่วนหนึ่งของภาพที่ใช้สำหรับช่อง นั่นเป็นสาเหตุที่การใช้vertical-align: middle
ไม่พอเพียงและเป็นสาเหตุของปัญหาข้ามเบราว์เซอร์
แล้วเราจะทำอย่างไรกับเรื่องนี้?
ตัวเลือกหนึ่งที่ชัดเจนคือ - แทนที่ภาพ! โชคดีที่เราสามารถทำสิ่งนี้ผ่าน CSS และแทนที่พวกเขาด้วยภาพภายนอก, base64 ภาพ (ใน CSS), in-CSS svg หรือเพียงแค่องค์ประกอบหลอก มันเป็นวิธีที่มีประสิทธิภาพ (ข้ามเบราว์เซอร์!) และนี่คือตัวอย่างของการปรับเช่นนี้ที่ถูกขโมยไปจากคำถามนี้ :
.checkbox-custom {
opacity: 0;
position: absolute;
}
.checkbox-custom,
.checkbox-custom-label {
display: inline-block;
vertical-align: middle;
margin: 5px;
cursor: pointer;
}
.checkbox-custom + .checkbox-custom-label:before {
content: '';
display: inline-block;
background: #fff;
border-radius: 5px;
border: 2px solid #ddd;
vertical-align: middle;
width: 10px;
height: 10px;
padding: 2px;
margin-right: 10px;
text-align: center;
}
.checkbox-custom:checked + .checkbox-custom-label:before {
width: 1px;
height: 5px;
border: solid blue;
border-width: 0 3px 3px 0;
transform: rotate(45deg);
-webkit-transform: rotate(45deg);
-ms-transform: rotate(45deg);
border-radius: 0px;
margin: 0px 15px 5px 5px;
}
<div>
<input id="checkbox-1" class="checkbox-custom" name="checkbox-1" type="checkbox">
<label for="checkbox-1" class="checkbox-custom-label">First Choice</label>
</div>
<div>
<input id="checkbox-2" class="checkbox-custom" name="checkbox-2" type="checkbox">
<label for="checkbox-2" class="checkbox-custom-label">Second Choice</label>
</div>
คุณอาจต้องการที่จะอ่านรายละเอียดเพิ่มเติมบางบทความในเชิงลึกเกี่ยวกับการจัดแต่งทรงผมอย่างเช่นบางที่ระบุไว้ที่นี่ ; มันอยู่นอกขอบเขตของคำตอบนี้
ตกลงยังไงเกี่ยวกับโซลูชันที่ไม่มีภาพที่กำหนดเองหรือองค์ประกอบหลอก?
TL; DR: ดูเหมือนว่าจะใช้งานไม่ได้ให้ใช้ช่องทำเครื่องหมายที่กำหนดเองแทน
อันดับแรกให้สังเกตว่าหากในเบราว์เซอร์อื่น ๆ ที่มีช่องว่างหลอกภายในไอคอนช่องทำเครื่องหมายไม่มีกฎเกณฑ์ที่สอดคล้องกัน ในการสร้างเราต้องสำรวจกายวิภาคของภาพดังกล่าวในเบราว์เซอร์ที่มีอยู่
ดังนั้นเบราว์เซอร์ใดที่มีระยะหลอกในช่องทำเครื่องหมาย ฉันได้ตรวจสอบ Chrome 75, Vivaldi 2.5 (ใช้ Chromium), FireFox 54 (ไม่ต้องถามว่าเพราะเหตุใดล้าสมัยเช่นนี้) IE 11, Edge 42, Safari ?? (ยืมมาหนึ่งนาทีลืมที่จะตรวจสอบเวอร์ชั่น) มีเพียง Chrome และ Vivaldi เท่านั้นที่มีอัตราหลอกหลอก (ฉันสงสัยว่าเบราว์เซอร์ที่ใช้โครเมียมทั้งหมดเช่นโอเปร่า)
ขนาดของมาร์จิ้นหลอกมีขนาดเท่าไหร่ ในการคิดออกนี้สามารถใช้ช่องทำเครื่องหมายซูม:
input {
zoom: 10;
box-shadow: 0 0 1px inset #999;
}
<input type=checkbox>
ผลลัพธ์ของฉันคือ ~ 7% ของความกว้าง / ความสูงและด้วยเหตุนี้ 0.9-1.0px ในหน่วยสัมบูรณ์ ความถูกต้องอาจถูกตั้งคำถามแม้ว่า: ลองค่าที่แตกต่างกันของzoom
สำหรับช่องทำเครื่องหมาย ในการทดสอบของฉันทั้งใน Chrome และ Vivaldi ขนาดสัมพัทธ์ของ pseudo-margin นั้นแตกต่างกันมากที่zoom
ค่า 10, 20 และที่ 11-19 (??):
scale
ดูเหมือนจะสอดคล้องกันมากขึ้น:
input {
transform: scale(10) translate(50%, 50%);
box-shadow: 0 0 1px inset #999;
}
<input type=checkbox>
ดังนั้นอาจ ~ 14% และ 2px เป็นค่าที่ถูกต้อง
ตอนนี้เรารู้ขนาดของ pseudo-margin แล้ว (โปรดทราบว่านี่ยังไม่เพียงพอ ขนาดของไอคอนช่องทำเครื่องหมายเหมือนกันสำหรับเบราว์เซอร์ทั้งหมดหรือไม่ อนิจจา นี่คือสิ่งที่ผู้ตรวจสอบ DOM แสดงสำหรับช่องทำเครื่องหมายที่ไม่มีรูปแบบ:
- FireFox: 13.3px
- ใช้โครเมียม: 12.8pxสำหรับทุกสิ่งดังนั้น 12.8 (100% - 14%) = 11pxสำหรับสิ่งที่มองเห็นเป็นช่องทำเครื่องหมาย
- IE 11, Edge: 13px
- Safari: n / a (สิ่งเหล่านี้ควรนำมาเปรียบเทียบในหน้าจอเดียวกันฉันเชื่อ)
ตอนนี้ก่อนที่เราจะหารือเกี่ยวกับการแก้ปัญหาหรือลูกเล่นลองถาม: การจัดแนวที่ถูกต้องคืออะไร? เราพยายามทำอะไรให้สำเร็จ ถึงจุดหนึ่งมันเป็นเรื่องของรสนิยม แต่โดยพื้นฐานแล้วฉันสามารถคิดถึงแง่มุมของการจัดแนว "ดี" ต่อไปนี้:
ข้อความและช่องทำเครื่องหมายบนพื้นฐานเดียวกัน (ฉันตั้งใจไม่ปรับขนาดช่องทำเครื่องหมายที่นี่):
หรือมีเส้นตรงกลางในรูปของตัวอักษรตัวเล็ก:
หรือบรรทัดกลางเดียวกันในรูปตัวพิมพ์ใหญ่ (ง่ายกว่าที่จะเห็นความแตกต่างของขนาดตัวอักษรที่แตกต่างกัน):
และเราต้องตัดสินใจด้วยว่าขนาดของช่องทำเครื่องหมายควรเท่ากับความสูงของตัวอักษรตัวพิมพ์เล็กตัวพิมพ์ใหญ่หรืออย่างอื่น (ใหญ่กว่าเล็กกว่าหรือเล็กกว่าหรือเล็กกว่า)
สำหรับการสนทนานี้ขอเรียกการจัดตำแหน่งที่ดีถ้าช่องทำเครื่องหมายอยู่บนพื้นฐานเดียวกันกับข้อความและมีขนาดของตัวอักษรพิมพ์ใหญ่ (ตัวเลือกที่มีเนื้อหาสูง):
ตอนนี้เราต้องใช้เครื่องมืออะไร:
- ปรับขนาดช่องทำเครื่องหมาย
- รับรู้ Chromium ด้วยช่องทำเครื่องหมายหลอกและกำหนดสไตล์ที่เฉพาะเจาะจง
- ปรับช่องทำเครื่องหมาย / การจัดตำแหน่งแนวตั้งฉลาก
?
เกี่ยวกับการปรับขนาดช่องทำเครื่องหมาย : มีwidth
, height
, size
, zoom
, scale
(ได้ฉันพลาดอะไรบางอย่าง?) zoom
และscale
ไม่อนุญาตให้ตั้งขนาดที่แน่นอนดังนั้นจึงอาจช่วยในการปรับขนาดข้อความเท่านั้นไม่ได้ตั้งค่าขนาดเบราว์เซอร์ข้าม (ยกเว้นกรณีที่เราสามารถเขียนกฎเฉพาะเบราว์เซอร์) size
ใช้งานไม่ได้กับ Chrome (ใช้งานได้กับ IE เก่าหรือไม่มันไม่น่าสนใจ) width
และheight
ทำงานใน Chrome และเบราว์เซอร์อื่น ๆ ดังนั้นเราจึงสามารถตั้งค่าขนาดทั่วไป แต่อีกครั้งใน Chrome จะกำหนดขนาดของภาพทั้งหมดไม่ใช่ช่องทำเครื่องหมายตัวเอง หมายเหตุ: เป็นขั้นต่ำ (ความกว้างความสูง) ซึ่งกำหนดขนาดของช่องทำเครื่องหมาย (หากความกว้าง≠ความสูงพื้นที่ด้านนอกกล่องกาเครื่องหมายสี่เหลี่ยมจะถูกเพิ่มเข้าไปใน "pseudo-margin")
สิ่งที่โชคร้ายคือช่องว่างหลอกใน Chrome ไม่ได้ถูกตั้งค่าเป็นศูนย์สำหรับความกว้างและความสูงใด ๆ เท่าที่ฉันเห็น
ฉันกลัวไม่มีความน่าเชื่อถือวิธี CSS เท่านั้นวันนี้
ลองพิจารณาการจัดตำแหน่งแนวตั้ง vertical-align
ไม่สามารถให้ผลลัพธ์ที่สอดคล้องกันเมื่อตั้งค่าเป็นmiddle
หรือbaseline
เนื่องจาก pseudo-margin ของ Chrome ตัวเลือกเดียวเท่านั้นที่จะได้รับ "ระบบพิกัด" ที่เหมือนกันสำหรับเบราว์เซอร์ทั้งหมดคือจัดแนวป้ายกำกับและอินพุตให้กับtop
:
(ในภาพ: จัดแนวตั้ง: ด้านบน, ด้านล่างและด้านล่างโดยไม่ต้องกล่องเงา)
แล้วเราจะได้ผลลัพธ์อะไรจากเรื่องนี้?
input[type="checkbox"] {
height: 0.95em;
width: 0.95em;
}
label, input {
vertical-align: top;
}
<label><input type="checkbox">label</label>
ตัวอย่างด้านบนทำงานร่วมกับ Chrome (เบราว์เซอร์ที่ใช้ Chromium) แต่เบราว์เซอร์อื่น ๆ ต้องการช่องทำเครื่องหมายที่มีขนาดเล็กกว่า ดูเหมือนว่าจะเป็นไปไม่ได้ที่จะปรับทั้งขนาดและการจัดแนวตั้งในลักษณะที่ทำงานกับมุมมองภาพของช่องทำเครื่องหมายของ Chromium คำแนะนำสุดท้ายของฉันคือ: ใช้ช่องทำเครื่องหมายที่กำหนดเองแทน - และคุณจะหลีกเลี่ยงความยุ่งยาก :)