Cuối cùng chúng ta hãy xem xét nguồn gốc của vấn đề
Các hộp kiểm được hiển thị bằng hình ảnh (người ta có thể đặt tùy chỉnh thông qua CSS). Đây là hộp kiểm (không được kiểm tra) trong FireFox, được đánh dấu bằng trình kiểm tra DOM:
Và đây là hộp kiểm chưa được xử lý tương tự trong Chrome:
Bạn có thể thấy lề (màu cam); đệm không có mặt (sẽ được hiển thị màu xanh lá cây). Vì vậy, cái giả giả này ở bên phải và dưới cùng của hộp kiểm? Đây là những phần của hình ảnh được sử dụng cho hộp kiểm . Đó là lý do tại sao việc sử dụng vertical-align: middle
không thực sự đủ và đó là nguồn gốc của các vấn đề trên trình duyệt chéo.
vậy chúng ta có thể làm gì?
Một lựa chọn rõ ràng là - thay thế hình ảnh! May mắn thay, người ta có thể thực hiện điều này thông qua CSS và thay thế chúng bằng các hình ảnh bên ngoài, hình ảnh base64 (in-CSS), svg trong CSS hoặc chỉ các phần tử giả. Đó là một cách tiếp cận mạnh mẽ (đa trình duyệt!) Và đây là một ví dụ về điều chỉnh như vậy bị đánh cắp từ câu hỏi này :
.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>
Bạn có thể muốn đọc một số bài viết chuyên sâu hơn về kiểu dáng như một số được liệt kê ở đây ; nó nằm ngoài phạm vi của câu trả lời này.
Ok, còn những gì về giải pháp không có tùy chỉnh hình ảnh hoặc giả giả?
TL; DR: có vẻ như điều này sẽ không hoạt động, thay vào đó hãy sử dụng hộp kiểm tùy chỉnh
Trước tiên, hãy lưu ý rằng nếu trong các trình duyệt khác, các biểu tượng giả bên trong biểu tượng hộp kiểm là tùy ý, thì không có giải pháp nhất quán. Để xây dựng một cái, chúng ta phải khám phá cấu trúc của những hình ảnh như vậy trong các trình duyệt hiện có.
Vì vậy, những trình duyệt nào có lề giả trong hộp kiểm? Tôi đã kiểm tra Chrome 75, Vivaldi 2.5 (dựa trên Chromium), FireFox 54 (đừng hỏi tại sao lại lỗi thời như vậy), IE 11, Edge 42, Safari ?? (mượn một phút, quên kiểm tra phiên bản). Chỉ Chrome và Vivaldi mới có lề giả như vậy (tôi nghi ngờ tất cả các trình duyệt dựa trên Chromium, như Opera).
Kích thước của những cái giả đó là bao nhiêu? Để tìm hiểu điều này, người ta có thể sử dụng hộp kiểm phóng to:
input {
zoom: 10;
box-shadow: 0 0 1px inset #999;
}
<input type=checkbox>
kết quả của tôi là ~ 7% chiều rộng / chiều cao và do đó 0,9-1,0px theo đơn vị tuyệt đối. Độ chính xác có thể được đặt câu hỏi, mặc dù: thử các giá trị khác nhau zoom
cho hộp kiểm. Trong các thử nghiệm của tôi ở cả Chrome và Vivaldi, kích thước tương đối của lề giả rất khác nhau ở zoom
các giá trị 10, 20 và ở các giá trị 11-19 (??):
scale
dường như phù hợp hơn:
input {
transform: scale(10) translate(50%, 50%);
box-shadow: 0 0 1px inset #999;
}
<input type=checkbox>
vì vậy có lẽ ~ 14% và 2px là các giá trị chính xác.
Bây giờ chúng ta đã biết (?) Kích thước của lề giả, hãy lưu ý rằng điều này là không đủ. Các kích thước của các biểu tượng hộp kiểm có giống nhau cho tất cả các trình duyệt không? Than ôi! Dưới đây là những gì trình kiểm tra DOM hiển thị cho các hộp kiểm chưa được lọc:
- FireFox: 13.3px
- Dựa trên Chromium: 12.8px cho toàn bộ, do đó 12.8 (100% - 14%) = 11px cho những gì được xem trực quan là hộp kiểm
- IE 11, Cạnh: 13px
- Safari: không áp dụng (những cái này nên được so sánh trên cùng một màn hình, tôi tin vậy)
Bây giờ trước khi chúng ta thảo luận về bất kỳ giải pháp hoặc thủ thuật nào, hãy hỏi: căn chỉnh chính xác là gì? Chúng ta đang cố gắng đạt được những gì? Ở một điểm nào đó, đó là vấn đề của hương vị, nhưng về cơ bản tôi có thể nghĩ đến các khía cạnh "tốt đẹp" sau đây:
văn bản và hộp kiểm trên cùng một đường cơ sở (Tôi cố tình không điều chỉnh kích thước hộp kiểm ở đây):
hoặc có cùng một dòng giữa về chữ cái viết thường:
hoặc cùng một dòng giữa về chữ in hoa (dễ dàng nhận thấy sự khác biệt cho kích thước phông chữ khác nhau):
và chúng tôi cũng phải quyết định xem kích thước của hộp kiểm có nên bằng chiều cao của chữ cái viết thường, chữ in hoa hay cái gì khác không (lớn hơn, nhỏ hơn hoặc giữa chữ thường và chữ hoa).
Đối với cuộc thảo luận này, hãy gọi một căn chỉnh đẹp nếu hộp kiểm nằm trên cùng một đường cơ sở với văn bản và có kích thước của chữ in hoa (một lựa chọn rất dễ tranh cãi):
Bây giờ chúng ta phải có những công cụ gì:
- điều chỉnh kích thước hộp kiểm
- nhận ra Chromium bằng hộp kiểm giả lề và đặt kiểu cụ thể
- điều chỉnh hộp kiểm / nhãn dọc
?
Về điều chỉnh kích thước hộp kiểm : có width
, height
, size
, zoom
, scale
(có tôi bị mất cái gì?). zoom
và scale
không cho phép đặt kích thước tuyệt đối, vì vậy họ có thể chỉ giúp điều chỉnh kích thước văn bản, không đặt kích thước trình duyệt chéo (trừ khi chúng tôi có thể viết quy tắc dành riêng cho trình duyệt). size
không hoạt động với Chrome (dù sao nó cũng hoạt động với IE cũ? Điều đó không thú vị lắm). width
và height
hoạt động trong Chrome và các trình duyệt khác, vì vậy chúng tôi có thể đặt kích thước chung, nhưng một lần nữa, trong Chrome, nó đặt kích thước của toàn bộ hình ảnh, chứ không phải chính hộp kiểm. Lưu ý: đó là tối thiểu (chiều rộng, chiều cao) xác định kích thước của hộp kiểm (nếu chiều rộng ≠ chiều cao, diện tích bên ngoài ô vuông được thêm vào "giả lề").
Một điều đáng tiếc là, các lề giả trong hộp kiểm Chrome không được đặt thành 0 cho bất kỳ chiều rộng và chiều cao nào, theo như tôi có thể thấy.
Tôi sợ rằng không có phương pháp chỉ đáng tin cậy CSS ngày nay.
Hãy xem xét căn chỉnh dọc. vertical-align
không thể đưa ra kết quả nhất quán khi được đặt thành middle
hoặc baseline
do lề giả của Chrome, tùy chọn thực sự duy nhất để có cùng "hệ tọa độ" cho tất cả các trình duyệt là căn chỉnh nhãn và nhập vào top
:
(trên hình: vertical-align: trên, dưới và dưới không có bóng hộp)
Vì vậy, kết quả nào chúng ta nhận được từ điều này?
input[type="checkbox"] {
height: 0.95em;
width: 0.95em;
}
label, input {
vertical-align: top;
}
<label><input type="checkbox">label</label>
Đoạn mã trên hoạt động với Chrome (trình duyệt dựa trên Chromium), nhưng các trình duyệt khác yêu cầu kích thước hộp kiểm nhỏ hơn. Dường như không thể điều chỉnh cả kích thước và căn chỉnh theo chiều dọc theo cách hoạt động xung quanh việc giải quyết hình ảnh hộp kiểm của Chromium. Đề nghị cuối cùng của tôi là: sử dụng hộp kiểm tùy chỉnh thay thế - và bạn sẽ tránh được sự thất vọng :)