2012-06-21 46 views
13

Cuando uso el tamaño de caja: border-box en CSS, supongo que el ancho total de un elemento se definirá en su valor de "ancho". Entonces, si digo que el ancho de una división es 20px y el borde derecho es 10px, terminaré con una caja que ocupará el espacio de 20px y la otra mitad es el borde derecho. Empujándolo hasta el punto en que establecen el ancho de 10px y el borde derecho, también, como aquí:¿Por qué tamaño de caja: border-box todavía muestra el borde con un ancho de 0px?

#box{ 
    overflow: hidden; 
    width: 10px; 
    box-sizing: border-box; 
    height: 100px; 
    background: black; 
    border-right: 10px solid red; 
}​ 

la caja única consistirá en el borde rojo. ¿Qué debería pasar cuando establezco el ancho en 0px? Pensé que lo haría desaparecer todo, pero no, el resultado es exactamente el mismo que el anterior: jsFiddle

Mi pregunta es si este es el comportamiento esperado. Me parece inconsistente Me gustaría hacer desaparecer una caja solo manipulando el ancho/alto. Gracias por cualquier entrada.

+0

¿Qué navegador está utilizando? No todos los navegadores admiten tamaño de caja directamente. Algunos tienen su propio tamaño de caja, como '-moz-box-sizing' y' -webkit-box-sizing'. Si quieres hacer desaparecer algo, considera usar 'display: none;' o 'visibility: hidden;' – Jrod

+0

También podría usar un martillo para romper un huevo ... pero estoy tratando de no hacerlo :) Es broma, realmente necesita el elemento para desaparecer así ... piensa en una rendija ... – Seka

+0

¿Te refieres a algún tipo de animación en la que lentamente reduces el ancho a nada? No estoy exactamente seguro de lo que quiere decir con una hendidura. Si pudiera explicar exactamente lo que está tratando de lograr, tal vez haya otra solución más adecuada. Como con la mayoría de las cosas, hay muchas maneras de hacerlo. Tal vez una garra es una mala elección, pero tal vez un martillo desgarrador esté a la vuelta de la esquina. – Jrod

Respuesta

14

El área de contenido es algo que queda después de restar el ancho del borde.

El ancho del contenido y la altura se calculan restando la frontera y relleno anchuras de los lados respectivos de la ‘width’ especificado y propiedades ‘altura’.

ancho especificado = 10 px
anchura border = 10 px
anchura contenido = ancho especificado (10 px) - ancho de borde (10 px)
ancho del contenido 10 - 10 = 0

Especificados width = 0 px
frontera width = 10 px
anchura contenido = ancho especificado (0 px) - ancho de borde (10 px)
anchura contenido 0 - 10 = -10 (que sería eliminar el 10 px utilizado por la frontera)

Pero

A medida que el ancho del contenido y la altura no puede ser negativo ([CSS21], sección 10.2), este cálculo se redondea a 0.

especificado width = 0 px
ancho del borde = 10 píxeles
Ancho del contenido = Ancho especificado (0 px) - ancho del borde (10 px)
Ancho del contenido 0 - 10 = 0 (que no elimina los 10 px utilizados por el borde)

Si no desea utilizar display:none; o visibility:hidden;, debe configurar tanto el width:XX; y la border-right:XX; a cero.

+0

Gracias por la respuesta; la clave estaba en entender que la frontera se queda por el resultado negativo, supongo. Pero, en tu opinión, ¿crees que es un comportamiento constante? Me pregunto porque en este último caso, border-box y content-box se comportan de la misma manera que me parece contradictorio. ¿Qué piensas? – Seka

+0

Acepto, el problema es que no se pueden permitir bloques de tamaño negativo, así que así es como decidieron tratar con ellos. No puedo pensar en una mejor alternativa. – codewaggle

+1

¡así es como se hace un triángulo! https://css-tricks.com/examples/ShapesOfCSS/ –

0

Tome un vistazo a esta captura de pantalla:

box metrics

La caja entera es 100x100px como era de esperar, pero la anchura real es 90px + 10px borde derecho. Entonces, cuando establece el ancho en 0, el ancho sigue siendo 0 (no puede tener ancho negativo), pero todavía tiene el borde de 10px.

+0

¿Pero por qué todavía tienes el borde? Porque después de las especificaciones no debería estar allí: "El ancho y el alto del contenido se calcula restando el borde y el ancho del relleno de los lados respectivos de las propiedades especificadas de 'ancho' y 'alto'. Como el ancho y el alto del contenido no pueden ser negativos ([CSS21], sección 10.2), este cálculo tiene piso en 0. " [ver border-box] (http://www.w3.org/TR/css3-ui/#box-sizing0) – Seka

+1

Eso es lo que está pasando. El ancho del contenido (ancho que no incluye bordes o relleno) es 0 porque, después de restar bordes y relleno, le queda un ancho negativo. Lo que hay que notar es cómo defines "contenido". – sachleen

+0

... por lo que el 'ancho' total del elemento debe estar a 0, ¿verdad? Si al definir width: 10px y border-right: 10px, obtengo una caja de 10px, debería obtener una caja de 0px si defino el ancho a 0px, ¿correcto? Reiterando a Paul Irish: "Ugh. Si digo que el ancho es de 200px [0px], vaya, será una caja de 200px [0px] de ancho, incluso si tengo 20px de relleno [borde]". [* {tamaño de caja: border-box} FTW] (http://paulirish.com/2012/box-sizing-border-box-ftw/) – Seka

Cuestiones relacionadas