Zastanawiam się przez chwilę, projektując CSS.
Czy przestrzegane są miejsca dziesiętne w szerokości CSS? A może są zaokrąglone?
.percentage {
width: 49.5%;
}
lub
.pixel {
width: 122.5px;
}
Jeśli jest to szerokość procentowa, to tak, jest przestrzegana . Jak zauważył Martin, rzeczy ulegają rozpadowi, gdy dochodzi do pikseli ułamkowych, ale jeśli wartości procentowe dają liczbę całkowitą (np. 50,5% z 200 pikseli w przykładzie), otrzymasz rozsądne, oczekiwane zachowanie.
Edit: Mam zaktualizowany przykład, aby pokazać, co dzieje się ułamkowych pikseli (w Chrome wartości są obcinane, więc 50, 50.5 i 50.6 wszystkie wykazują taką samą szerokość).
Nawet gdy liczba jest zaokrąglana podczas malowania strony, pełna wartość jest zachowywana w pamięci i używana do późniejszych obliczeń potomnych. Na przykład, jeśli twoje pudełko o wielkości 100.4999px maluje do 100px, to dziecko o szerokości 50% zostanie obliczone jako .5 * 100.4999 zamiast .5 * 100. I tak dalej na głębsze poziomy.
Stworzyłem głęboko zagnieżdżone systemy układu siatki, w których szerokość rodziców to ems, a dzieci to procenty, a uwzględnienie do czterech miejsc po przecinku powyżej miało zauważalny wpływ.
Obudowa Edge, jasne, ale należy o tym pamiętać.
źródło
Chociaż piksele ułamkowe mogą wydawać się zaokrąglać w górę na poszczególnych elementach (jak pokazuje to bardzo dobrze @SkillDrick ) , ważne jest, aby wiedzieć, że piksele ułamkowe są faktycznie przestrzegane w rzeczywistym modelu pudełkowym .
Najlepiej widać to, gdy elementy są ułożone obok siebie (lub na sobie); innymi słowy, gdybym umieścił obok siebie 400 div pikseli 0,5, miałyby taką samą szerokość jak div 200 pikseli. Jeśli wszyscy oni rzeczywiście w zaokrągleniu do 1px (jak patrząc na poszczególne elementy oznaczałoby) chcielibyśmy oczekiwać 200px div być o połowę krótszy.
Można to zobaczyć w tym fragmencie kodu:
źródło
:nth-child(even)
lub:nth-child(odd)
, zauważysz, że albo cała rzecz jest pomarańczowa, albo cała rzecz jest niebieska - nie jest to mieszanina niebieskiego i pomarańczowego (który byłby jakimś niejasnym fioletowym odcieniem).Szerokość zaokrągla się do całkowitej liczby pikseli .
Nie wiem jednak, czy każda przeglądarka dokona tego w ten sam sposób. Wszystkie wydają się mieć inną strategię przy zaokrąglaniu wartości procentowych subpikseli. Jeśli interesują Cię szczegóły zaokrąglania subpikseli w różnych przeglądarkach, znajdziesz doskonały artykuł na temat ElastiCSS .
edycja : Testowałem demo @ Skilldrick w niektórych przeglądarkach ze względu na ciekawość. Gdy używasz ułamkowych wartości pikseli (a nie wartości procentowych, działają one zgodnie z sugestią w powiązanym artykule) IE9p7 i FF4b7 wydają się zaokrąglać do najbliższego piksela, podczas gdy Opera 11b, Chrome 9.0.587.0 i Safari 5.0.3 obcinają miejsca dziesiętne. Nie dlatego, że miałem nadzieję, że mają coś wspólnego…
źródło
Wydają się zaokrąglać wartości do najbliższej liczby całkowitej; ale widzę niespójność w Chrome, Safari i Firefox.
Na przykład, jeśli 33,3% konwertuje na 420,945px
chrome i firexfox pokazują go jako 421px. podczas gdy safari pokazuje 420px.
Wygląda na to, że chrome i firefox podążają za logiką podłogi i sufitu, podczas gdy safari tego nie robi. Ta strona wydaje się omawiać ten sam problem
http://ejohn.org/blog/sub-pixel-problems-in-css/
źródło
Elementy muszą malować do całkowitej liczby pikseli, a ponieważ inne odpowiedzi obejmują, wartości procentowe są rzeczywiście przestrzegane.
Ważną uwagą jest to, że piksele w tym przypadku oznaczają piksele css , a nie piksele ekranowe, więc pojemnik 200px z 50.7499% dzieckiem zostanie zaokrąglony do 101px pikseli css , które następnie zostaną wyrenderowane na 202px na ekranie siatkówki, a nie 400 *. 507499 ~ = 203px.
Gęstość ekranu jest pomijana w tych obliczeniach i nie ma sposobu na pomalowanie * elementu o określonych rozmiarach subpikseli siatkówki. Nie można renderować tła lub obramowań elementów w rozmiarze mniejszym niż 1 piksel css wielkości, choć rozmiar właściwy element mógłby być mniejszy niż 1 piksel css jak Sandy Gifford pokazał.
[*] Możesz użyć niektórych technik, takich jak przesunięcie pola cienia o 0,5, itp., Ale rzeczywiste właściwości modelu pola zostaną pomalowane do pełnego piksela CSS.
źródło