Sesuatu yang saya sudah bertanya-tanya untuk sementara saat melakukan desain CSS.
Apakah tempat desimal dalam lebar CSS dihormati? Atau apakah mereka bulat?
.percentage {
width: 49.5%;
}
atau
.pixel {
width: 122.5px;
}
Sesuatu yang saya sudah bertanya-tanya untuk sementara saat melakukan desain CSS.
Apakah tempat desimal dalam lebar CSS dihormati? Atau apakah mereka bulat?
.percentage {
width: 49.5%;
}
atau
.pixel {
width: 122.5px;
}
Jawaban:
Jika itu persentase lebar, maka ya, itu dihormati . Seperti yang Martin tunjukkan, hal-hal rusak ketika Anda mencapai piksel fraksional, tetapi jika nilai persentase Anda menghasilkan nilai piksel bilangan bulat (misalnya 50,5% dari 200px dalam contoh) Anda akan mendapatkan perilaku yang masuk akal dan diharapkan.
Sunting: Saya telah memperbarui contoh untuk menunjukkan apa yang terjadi pada piksel fraksional (di Chrome nilainya terpotong, jadi 50, 50,5 dan 50,6 semuanya menunjukkan lebar yang sama).
Bahkan ketika angka dibulatkan saat halaman dicat, nilai penuh disimpan dalam memori dan digunakan untuk perhitungan anak berikutnya. Misalnya, jika kotak Anda dari 100,4999px cat ke 100px, itu anak dengan lebar 50% akan dihitung sebagai 0,5 * 100,4999 bukan 0,5 * 100. Dan seterusnya ke level yang lebih dalam.
Saya telah membuat sistem tata letak grid bersarang di mana lebar orang tua adalah ems, dan anak-anak adalah persen, dan termasuk hingga empat titik desimal di bagian hulu memiliki dampak yang nyata.
Kasing tepi, tentu saja, tetapi sesuatu yang perlu diingat.
Meskipun piksel fraksional mungkin tampak cocok pada elemen individual (seperti yang ditunjukkan oleh @SkillDrick dengan baik) , penting untuk mengetahui bahwa piksel fraksional benar-benar dihormati dalam model kotak yang sebenarnya .
Ini paling baik dilihat ketika elemen-elemen ditumpuk di samping (atau di atas) satu sama lain; dengan kata lain, jika saya menempatkan 400 0,5 pixel div secara berdampingan, mereka akan memiliki lebar yang sama dengan div 200 pixel tunggal. Jika mereka semua benar - benar dibulatkan hingga 1px (seperti yang terlihat pada elemen individual akan menyiratkan) kita akan mengharapkan div 200px menjadi setengah panjang.
Ini dapat dilihat dalam cuplikan kode runnable ini:
body {
color: white;
font-family: sans-serif;
font-weight: bold;
background-color: #334;
}
.div_house div {
height: 10px;
background-color: orange;
display: inline-block;
}
div#small_divs div {
width: 0.5px;
}
div#large_div div {
width: 200px;
}
<div class="div_house" id="small_divs">
<p>0.5px div x 400</p>
<div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div>
</div>
<br>
<div class="div_house" id="large_div">
<p>200px div x 1</p>
<div></div>
</div>
:nth-child(even)
atau :nth-child(odd)
, Anda perhatikan bahwa semuanya berwarna oranye atau seluruhnya berwarna biru - bukan campuran warna biru dan oranye (yang akan menjadi warna ungu yang samar-samar).
Lebar akan dibulatkan ke angka integer piksel .
Saya tidak tahu apakah setiap browser akan memutarnya dengan cara yang sama. Mereka semua tampaknya memiliki strategi yang berbeda ketika membulatkan persentase sub-pixel. Jika Anda tertarik dengan detail pembulatan sub-pixel di berbagai browser, ada artikel bagus tentang ElastiCSS .
sunting : Saya menguji demo @ Skilldrick di beberapa browser demi rasa ingin tahu. Ketika menggunakan nilai piksel fraksional (bukan persentase, mereka berfungsi seperti yang disarankan dalam artikel yang saya tautkan) IE9p7 dan FF4b7 tampaknya membulatkan ke piksel terdekat, sementara Opera 11b, Chrome 9.0.587.0 dan Safari 5.0.3 memotong tempat desimal. Bukannya aku berharap mereka memiliki kesamaan ...
Mereka tampaknya mengumpulkan nilai ke integer terdekat; tapi saya melihat ketidakkonsistenan dalam chrome, safari dan firefox.
Misalnya, jika 33,3% dikonversi ke 420,945px
chrome dan firexfox menunjukkannya sebagai 421px. sementara safari menunjukkan sebagai 420px.
Sepertinya chrome dan firefox mengikuti logika lantai dan langit-langit sementara safari tidak. Halaman ini tampaknya membahas masalah yang sama
Elemen harus melukis ke jumlah integer piksel, dan sebagai jawaban lain yang dibahas, persentase memang dihormati.
Catatan penting adalah bahwa piksel dalam hal ini berarti piksel css , bukan piksel layar, sehingga wadah 200px dengan anak 50,7499% akan dibulatkan menjadi piksel piksel 101px , yang kemudian dirender ke 202px pada layar retina, dan tidak 400 *. 507499 ~ = 203px.
Kepadatan layar diabaikan dalam perhitungan ini, dan tidak ada cara untuk melukis * elemen ke ukuran subpiksel retina tertentu. Anda tidak dapat memiliki latar belakang atau batas elemen yang diberikan kurang dari 1 css piksel , meskipun ukuran elemen sebenarnya bisa kurang dari 1 css piksel seperti yang ditunjukkan Sandy Gifford.
[*] Anda dapat menggunakan beberapa teknik seperti 0,5 offset kotak-bayangan, dll, tetapi properti model kotak yang sebenarnya akan melukis ke piksel CSS penuh.