Algo que me he estado preguntando durante un tiempo mientras hacía diseño CSS.
¿Se respetan los lugares decimales en los anchos CSS? ¿O son redondeados?
.percentage {
width: 49.5%;
}
o
.pixel {
width: 122.5px;
}
Algo que me he estado preguntando durante un tiempo mientras hacía diseño CSS.
¿Se respetan los lugares decimales en los anchos CSS? ¿O son redondeados?
.percentage {
width: 49.5%;
}
o
.pixel {
width: 122.5px;
}
Respuestas:
Si es un ancho porcentual, entonces sí, se respeta . Como señaló Martin, las cosas se descomponen cuando se llega a píxeles fraccionarios, pero si sus valores porcentuales producen un valor de píxel entero (por ejemplo, 50.5% de 200 px en el ejemplo) obtendrá un comportamiento esperado y sensible.
Editar: he actualizado el ejemplo para mostrar lo que sucede con los píxeles fraccionarios (en Chrome los valores se truncan, por lo que 50, 50.5 y 50.6 muestran el mismo ancho).
Incluso cuando el número se redondea cuando se pinta la página, el valor completo se conserva en la memoria y se utiliza para el cálculo secundario posterior. Por ejemplo, si su caja de 100.4999px pinta a 100px, su hijo con un ancho del 50% se calculará como .5 * 100.4999 en lugar de .5 * 100. Y así sucesivamente a niveles más profundos.
He creado sistemas de diseño de cuadrícula profundamente anidados donde los anchos de los padres son ems y los hijos son porcentajes, e incluir hasta cuatro puntos decimales aguas arriba tuvo un impacto notable.
Estuche de borde, claro, pero algo a tener en cuenta.
Aunque puede parecer que los píxeles fraccionarios se redondean en elementos individuales (como @SkillDrick demuestra muy bien) es importante saber que los píxeles fraccionarios se respetan realmente en el modelo de caja real .
Esto se puede ver mejor cuando los elementos se apilan uno al lado del otro (o encima); en otras palabras, si tuviera que colocar 400 divisiones de 0.5 píxeles una al lado de la otra, tendrían el mismo ancho que una sola división de 200 píxeles. Si todos realmente se redondearon a 1px (como implicaría mirar elementos individuales) esperaríamos que el div de 200px sea la mitad de largo.
Esto se puede ver en este fragmento de código ejecutable:
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)
o :nth-child(odd)
, notará que todo es naranja o que todo es azul, no una mezcla de azul y naranja (lo que sería un vago tono púrpura).
El ancho se redondeará a un número entero de píxeles .
Sin embargo, no sé si cada navegador lo redondeará de la misma manera. Todos parecen tener una estrategia diferente al redondear los porcentajes de subpíxeles. Si está interesado en los detalles del redondeo de subpíxeles en diferentes navegadores, hay un excelente artículo sobre ElastiCSS .
editar : Probé la demostración de @ Skilldrick en algunos navegadores por curiosidad. Cuando se usan valores fraccionales de píxeles (no porcentajes, funcionan como se sugirió en el artículo que vinculé) IE9p7 y FF4b7 parecen redondearse al píxel más cercano, mientras que Opera 11b, Chrome 9.0.587.0 y Safari 5.0.3 truncan los lugares decimales. No es que esperara que tuvieran algo en común después de todo ...
Parecen redondear los valores al entero más cercano; pero veo inconsistencias en Chrome, Safari y Firefox.
Por ejemplo, si 33.3% se convierte a 420.945px
Chrome y Firexfox lo muestran como 421px. mientras que safari muestra sus 420px.
Parece que Chrome y Firefox siguen la lógica de piso y techo, mientras que Safari no. Esta página parece discutir el mismo problema.
Los elementos tienen que pintar a un número entero de píxeles, y como las otras respuestas cubren, los porcentajes se respetan.
Una nota importante es que los píxeles en este caso significan píxeles css , no píxeles de pantalla, por lo que un contenedor de 200 píxeles con un 50.7499% secundario se redondeará a 101 píxeles píxeles css , que luego se renderizarán en 202 píxeles en una pantalla de retina, y no en 400 *. 507499 ~ = 203px.
La densidad de la pantalla se ignora en este cálculo, y no hay forma de pintar * un elemento a tamaños específicos de subpíxeles de retina. No puede hacer que los fondos o bordes de los elementos se representen con un tamaño de píxel inferior a 1 css , aunque el tamaño real del elemento podría ser inferior a 1 píxel css, como lo mostró Sandy Gifford.
[*] Puedes usar algunas técnicas como 0.5 offset box-shadow, etc., pero las propiedades reales del modelo de caja pintarán a un píxel CSS completo.