অবশেষে সমস্যার উত্সটি একবার দেখে নেওয়া যাক
চেকবাক্সগুলি চিত্র ব্যবহার করে রেন্ডার করা হয় (কেউ CSS এর মাধ্যমে কাস্টমগুলি সেট করতে পারে)। ফায়ারফক্সে এটি একটি (যাচাই করা হয়নি) চেকবক্স রয়েছে যা ডিওএম পরিদর্শকের সাথে হাইলাইট হয়েছে:
এবং এখানে ক্রোমে একই স্টাইলহীন চেকবক্সটি রয়েছে:
আপনি মার্জিন (কমলা) দেখতে পারেন; প্যাডিং উপস্থিত নেই (সবুজ দেখানো হবে)। তাহলে ডানদিকে এবং চেকবক্সের নীচে এই সিউডো-মার্জিনটি কী? এই চেকবক্সটি জন্য ব্যবহৃত ইমেজ অংশ আছে । এজন্য কেবল ব্যবহার করা vertical-align: middle
সত্যই যথেষ্ট নয় এবং এটি ক্রস ব্রাউজার সমস্যার উত্স।
সুতরাং আমরা এই সম্পর্কে কি করতে পারি?
একটি সুস্পষ্ট বিকল্প হ'ল - চিত্রগুলি প্রতিস্থাপন করুন! সৌভাগ্যক্রমে, কেউ এটি সিএসএসের মাধ্যমে করতে পারেন এবং বাহ্যিক চিত্র, বেস 64 (ইন সিএসএস) চিত্রগুলি, ইন সিএসএস এসভিজি বা কেবল ছদ্ম-উপাদানগুলির সাথে প্রতিস্থাপন করতে পারেন। এটি একটি দৃust় (ক্রস ব্রাউজার!) পদ্ধতির এবং এই প্রশ্নটি থেকে চুরি হওয়া এই জাতীয় সমন্বয়ের উদাহরণ এখানে :
.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>
আপনি এখানে তালিকাবদ্ধ কিছু যেমন স্টাইলিং সম্পর্কে আরও কিছু গভীর-নিবন্ধ পড়তে চাইতে পারেন ; এটি এই উত্তর সুযোগ বাইরে।
ঠিক আছে, এখনও নো-কাস্টম-চিত্রগুলি বা সিউডো-উপাদানগুলির সমাধান সম্পর্কে কী?
টিএল; ডিআর: দেখে মনে হচ্ছে এটি কাজ করবে না, পরিবর্তে কাস্টম চেকবক্স ব্যবহার করুন
প্রথমে লক্ষ্য করা যাক যে অন্য ব্রাউজারগুলিতে যদি চেকবক্স আইকনের ভিতরে থাকা সিউডো-মার্জিনগুলি নির্বিচারে হয়, তবে কোনও সুসংগত সমাধান ছিল না। একটি তৈরি করতে, আমাদের বিদ্যমান ব্রাউজারগুলিতে এই জাতীয় চিত্রের এনাটমি অন্বেষণ করতে হবে।
তাহলে চেকবক্সগুলিতে কি ব্রাউজারগুলির সিউডো-মার্জিন রয়েছে? আমি ক্রোম 75, ভিভালদি 2.5 (ক্রোমিয়াম-ভিত্তিক), ফায়ারফক্স 54 (কেন এত পুরানো জিজ্ঞাসা করবেন না), আইই 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 (10 ) মানগুলিতে খুব আলাদা :
scale
আরও সুসংগত বলে মনে হচ্ছে:
input {
transform: scale(10) translate(50%, 50%);
box-shadow: 0 0 1px inset #999;
}
<input type=checkbox>
সুতরাং সম্ভবত ~ 14% এবং 2px সঠিক মান।
এখন যেহেতু আমরা সিডো-মার্জিনের আকার জানি (?), আসুন লক্ষ্য করুন যে এটি যথেষ্ট নয়। সমস্ত ব্রাউজারের জন্য চেকবক্স আইকনের আকারগুলি কি একই? হায়! আনস্টাইলযুক্ত চেকবক্সগুলির জন্য ডিওএম পরিদর্শক কী দেখায় তা এখানে:
- ফায়ারফক্স: 13.3px
- ক্রোমিয়াম-ভিত্তিক: পুরো জিনিসটির জন্য 12.8px , সুতরাং চেকবক্স হিসাবে দৃশ্যমানভাবে অনুধাবন করা হয় তার জন্য 12.8 (100% - 14%) = 11px
- আইই 11, প্রান্ত: 13px
- সাফারি: এন / এ (এগুলি একই পর্দার সাথে তুলনা করা উচিত, আমি বিশ্বাস করি)
এখন আমরা কোনও সমাধান বা কৌশল আলোচনা করার আগে আসুন জিজ্ঞাসা করি: একটি সঠিক প্রান্তিককরণ কী? আমরা কী অর্জন করার চেষ্টা করছি? নির্দিষ্ট বিন্দুতে এটি স্বাদের বিষয় তবে মূলত আমি নিম্নলিখিত "দুর্দান্ত" প্রান্তিককরণগুলির দিকগুলি সম্পর্কে ভাবতে পারি:
একই বেসলাইনটিতে পাঠ্য এবং চেকবাক্স (আমি ইচ্ছাকৃতভাবে এখানে চেকবক্সের আকারটি সামঞ্জস্য করি না):
ছোট হাতের অক্ষরের ক্ষেত্রে একই লাইন থাকে:
বা মূল অক্ষরের ক্ষেত্রে একই মাঝারি রেখা (বিভিন্ন ফন্টের আকারের জন্য পার্থক্যটি দেখতে আরও সহজ):
এবং এছাড়াও আমাদের সিদ্ধান্ত নিতে হবে যে চেকবাক্সের আকার ছোট হাতের অক্ষরের উচ্চতা, বড় বড় অক্ষর বা অন্য কোনও কিছুর (বৃহত্তর, ছোট বা ছোট এবং বড় হাতের মাঝখানে) সমান হওয়া উচিত।
এই আলোচনার জন্য আসুন চেকবক্সটি পাঠ্যের মতো একই বেসলাইনে থাকে এবং একটি মূলধন বর্ণের আকার থাকে (একটি অত্যন্ত তর্কযোগ্য পছন্দ):
এখন আমাদের কাছে কী সরঞ্জাম রয়েছে:
- চেকবক্সের আকার সামঞ্জস্য করুন
- ক্রোমিয়ামটিকে এর সিউডো-প্রান্তিক চেকবক্স দিয়ে সনাক্ত করুন এবং নির্দিষ্ট স্টাইল সেট করুন
- চেকবক্স / লেবেল উল্লম্ব সারিবদ্ধ সামঞ্জস্য করুন
?
সংক্রান্ত চেকবক্সটি আকার সমন্বয় : আছে width
, height
, size
, zoom
, scale
(আমি কিছু মিস করেছেন?)। zoom
এবং scale
নিখুঁত আকার সেট করার অনুমতি দেবেন না, সুতরাং তারা কেবল পাঠ্য আকারের সাথে সামঞ্জস্য করতে সহায়তা করতে পারে, ক্রস-ব্রাউজারের আকার সেট না করে (যদি না আমরা ব্রাউজার-নির্দিষ্ট বিধিগুলি লিখতে পারি)। size
Chrome এর সাথে কাজ করে না (এটি কী পুরানো IE এর সাথে কাজ করেছিল? যাইহোক, এটি এতটা আকর্ষণীয় নয়)। width
এবং height
ক্রোম এবং অন্যান্য ব্রাউজারগুলিতে কাজ করে, তাই আমরা একটি সাধারণ আকার নির্ধারণ করতে পারি, তবে আবার 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>
উপরের স্নিপেট ক্রোমের সাথে কাজ করে (ক্রোমিয়াম-ভিত্তিক ব্রাউজারগুলি) তবে অন্যান্য ব্রাউজারগুলিতে চেকবক্সের একটি ছোট আকারের প্রয়োজন। ক্রোমিয়ামের চেকবাক্সের ইমেজ কোর্কের চারপাশে কাজ করে এমনভাবে আকার এবং উল্লম্ব সারিবদ্ধ উভয়ই সামঞ্জস্য করা অসম্ভব বলে মনে হচ্ছে। আমার চূড়ান্ত পরামর্শটি হ'ল পরিবর্তে কাস্টম চেকবক্স ব্যবহার করুন - এবং আপনি হতাশাকে এড়াতে পারবেন :)