आइए आखिरकार समस्या के स्रोत पर एक नज़र डालें
चेकबॉक्स छवियों का उपयोग करके प्रदान किए जाते हैं (सीएसएस के माध्यम से कस्टम सेट कर सकते हैं)। यहाँ फ़ायरफ़ॉक्स में एक (अनियंत्रित) चेकबॉक्स है, जिसे डोम इंस्पेक्टर के साथ हाइलाइट किया गया है:
और यहाँ क्रोम में वही अस्थिर चेकबॉक्स है:
आप मार्जिन (नारंगी) देख सकते हैं; पैडिंग मौजूद नहीं है (हरा दिखाया जाएगा)। तो क्या यह छद्म-मार्जिन दाईं ओर और चेकबॉक्स के नीचे है? ये चेकबॉक्स के लिए उपयोग की जाने वाली छवि के भाग हैं । इसलिए उपयोग करना vertical-align: middle
वास्तव में पर्याप्त नहीं है और यह क्रॉस-ब्राउज़र समस्याओं का स्रोत है।
तो हम इस बारे में क्या कर सकते हैं?
एक स्पष्ट विकल्प है - छवियों को बदलें! सौभाग्य से, कोई ऐसा सीएसएस के माध्यम से कर सकता है और उन लोगों को बाहरी छवियों, बेस 64 (इन-सीएसएस) छवियों, इन-सीएसएस एसवीजी या सिर्फ छद्म तत्वों के साथ बदल सकता है। यह एक मजबूत (क्रॉस-ब्राउज़र!) दृष्टिकोण है, और यहाँ इस सवाल से चुराए गए समायोजन का एक उदाहरण है :
.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: ऐसा लगता है कि यह काम नहीं करेगा, इसके बजाय कस्टम चेकबॉक्स का उपयोग करें
पहले, आइए ध्यान दें कि यदि अन्य ब्राउज़रों में चेकबॉक्स आइकन के अंदर छद्म मार्जिन मनमाना था, तो कोई सुसंगत समाधान नहीं था। एक का निर्माण करने के लिए, हमें मौजूदा ब्राउज़रों में ऐसी छवियों की शारीरिक रचना का पता लगाना होगा।
तो चेकबॉक्स में किन ब्राउज़रों के पास छद्म मार्जिन है? मैंने क्रोम 75, विवाल्डी 2.5 (क्रोमियम आधारित), फायरफॉक्स 54 (ऐसा पुराना क्यों नहीं है), IE 11, एज 42, सफारी की जाँच की है ?? (एक मिनट के लिए एक उधार लिया, संस्करण की जांच करना भूल गया)। केवल क्रोम और विवाल्डी में ऐसे छद्म मार्जिन हैं (मुझे सभी क्रोमियम-आधारित ब्राउज़र जैसे कि ओपेरा पर संदेह है)।
उन छद्म मार्जिन का आकार क्या है? यह पता लगाने के लिए एक ज़ूम किए गए चेकबॉक्स का उपयोग कर सकते हैं:
input {
zoom: 10;
box-shadow: 0 0 1px inset #999;
}
<input type=checkbox>
मेरा परिणाम ~ 7% चौड़ाई / ऊंचाई है और इसलिए 0.9-1.0px निरपेक्ष इकाइयों में है। सटीकता पर सवाल उठाया जा सकता है, हालांकि: zoom
चेकबॉक्स के लिए विभिन्न मूल्यों का प्रयास करें । क्रोम और विवाल्डी दोनों में मेरे परीक्षणों में छद्म-मार्जिन के सापेक्ष आकार 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 सही मान हैं।
अब जब हम छद्म-मार्जिन के आकार को जानते हैं (?), तो ध्यान दें कि यह पर्याप्त नहीं है। क्या चेकबॉक्स के आकार सभी ब्राउज़रों के लिए समान हैं? अफसोस! यहां बिना जांच किए गए चेकबॉक्स के लिए DOM इंस्पेक्टर क्या दिखाता है:
- फ़ायरफ़ॉक्स: 13.3px
- क्रोमियम-आधारित: 12.8px पूरी चीज़ के लिए, इसलिए 12.8 (100% - 14%) = 11px , जो नेत्रहीन चेकबॉक्स के रूप में माना जाता है
- आईई 11, एज: 13 पीएक्स
- सफ़ारी: n / a (ये एक ही स्क्रीन पर तुलना की जानी चाहिए, मुझे विश्वास है)
अब इससे पहले कि हम किसी समाधान या चाल पर चर्चा करें, आइए पूछते हैं: एक सही संरेखण क्या है ? हम क्या हासिल करने की कोशिश कर रहे हैं? कुछ हद तक यह स्वाद की बात है, लेकिन मूल रूप से मैं निम्नलिखित "अच्छे" संरेखण के पहलुओं के बारे में सोच सकता हूं:
एक ही आधार रेखा पर पाठ और चेकबॉक्स (मैं जानबूझकर यहाँ चेकबॉक्स का आकार समायोजित नहीं करता हूँ):
या लोअरकेस अक्षरों के संदर्भ में एक ही मध्य रेखा है:
या बड़े अक्षरों के संदर्भ में एक ही मध्य रेखा (विभिन्न फ़ॉन्ट आकार के लिए अंतर देखना आसान है):
और हमें यह भी तय करना होगा कि चेकबॉक्स का आकार लोअरकेस अक्षर की ऊंचाई के बराबर होना चाहिए, कैपिटल लेटर या कुछ और (बड़ा, छोटा या लोअरकेस और कैपिटल के बीच)।
इस चर्चा के लिए आइए एक संरेखण को अच्छा कहें यदि चेकबॉक्स पाठ के समान आधार रेखा पर है और इसमें बड़े अक्षर का आकार है (अत्यधिक तर्कपूर्ण विकल्प):
अब हमारे पास कौन से उपकरण हैं:
- चेकबॉक्स का आकार समायोजित करें
- क्रोमियम को उसके छद्म मार्जिन वाले चेकबॉक्स से पहचानें और विशिष्ट शैलियों को सेट करें
- चेकबॉक्स / लेबल वर्टिकल अलाइनमेंट समायोजित करें
?
के बारे में चेकबॉक्स आकार समायोजन : देखते हैं width
, height
, size
, zoom
, scale
(मैं कुछ छूट गया है?)। zoom
और scale
पूर्ण आकार सेट करने की अनुमति नहीं देते हैं, इसलिए वे केवल पाठ आकार को समायोजित करने में मदद कर सकते हैं, क्रॉस-ब्राउज़र आकार सेट नहीं कर सकते (जब तक कि हम ब्राउज़र-विशिष्ट नियम नहीं लिख सकते)। size
Chrome के साथ काम नहीं करता है (क्या यह पुराने IE के साथ काम करता है? वैसे भी, यह उतना दिलचस्प नहीं है)। width
और height
क्रोम और अन्य ब्राउज़रों में काम करते हैं, इसलिए हम एक सामान्य आकार सेट कर सकते हैं, लेकिन फिर से, क्रोम में यह पूरी छवि का आकार सेट करता है, चेकबॉक्स ही नहीं। नोट: यह न्यूनतम (चौड़ाई, ऊंचाई) है जो एक चेकबॉक्स के आकार को परिभाषित करता है (यदि चौड़ाई, ऊंचाई, चेकबॉक्स वर्ग के बाहर का क्षेत्र "छद्म-मार्जिन" में जोड़ा जाता है)।
एक दुर्भाग्यपूर्ण बात यह है कि क्रोम चेकबॉक्स में छद्म मार्जिन किसी भी चौड़ाई और ऊंचाइयों के लिए शून्य पर सेट नहीं है, जहां तक मैं देख सकता हूं।
मुझे डर है कि इन दिनों कोई विश्वसनीय CSS-only विधि नहीं है।
आइए ऊर्ध्वाधर संरेखण पर विचार करें। Chrome के छद्म-मार्जिन के कारण या उसके vertical-align
सेट होने पर लगातार परिणाम नहीं दे सकते , सभी ब्राउज़रों के लिए समान "समन्वय प्रणाली" प्राप्त करने का एकमात्र वास्तविक विकल्प लेबल और इनपुट संरेखित करना है :middle
baseline
top
(चित्र पर: वर्टिकल-अलाइन: बॉक्स-शैडो के बिना ऊपर, नीचे और नीचे)
तो इससे हमें क्या परिणाम मिलता है?
input[type="checkbox"] {
height: 0.95em;
width: 0.95em;
}
label, input {
vertical-align: top;
}
<label><input type="checkbox">label</label>
ऊपर स्निपेट क्रोम (क्रोमियम-आधारित ब्राउज़र) के साथ काम करता है, लेकिन अन्य ब्राउज़रों को चेकबॉक्स के छोटे आकार की आवश्यकता होती है। ऐसा लगता है कि क्रोमियम के चेकबॉक्स छवि क्विक के आसपास काम करने वाले एक तरह से आकार और ऊर्ध्वाधर संरेखण दोनों को समायोजित करना असंभव है। मेरा अंतिम सुझाव है: इसके बजाय कस्टम चेकबॉक्स का उपयोग करें - और आप निराशा से बचेंगे :)