¿Por qué no tenemos box-sizing: margin-box;
? Por lo general, cuando ponemos box-sizing: border-box;
en nuestras hojas de estilo realmente nos referimos a lo primero.
Ejemplo:
Digamos que tengo un diseño de página de 2 columnas. Ambas columnas tienen un ancho del 50%, pero se ven un poco feas porque no hay canalón (espacio en el medio); A continuación se muestra el CSS:
.col2 {
width: 50%;
float: left;
}
Para aplicar una canaleta, puede pensar que podríamos establecer un margen derecho en la primera de las 2 columnas; algo como esto:
.col2:first-child {
margin-right: 24px;
}
Pero esto haría que la segunda columna se ajuste a una nueva línea, porque lo siguiente es cierto:
50% + 50% + 24px > 100%
box-sizing: margin-box;
resolvería este problema al incluir el margen en el ancho calculado del elemento. Me parece muy útil si no más útil que box-sizing: border-box;
.
box-sizing: margin-box;
?" Porque si bien los márgenes horizontales no colapsan, tal propuesta interferiría seriamente con el colapso del margen vertical. De todos modos, si desea proponer algo para la estandarización, Stack Overflow no es el lugar correcto. Prueba las listas de correo.border: xxx solid transparent;
, ya que el borde está incluido enborder-box
. Sin embargo, esto romperá algunas otras cosas, comobox-shadow
.box-sizing: margin-box
porque no funcionaría con el colapso del margen.Respuestas:
¿No podrías usar
width: calc(50% - 24px);
para tus cols? Luego establece tus márgenes.fuente
Creo que podríamos tener un
box-sizing: margin-box
. El modelo de caja css muestra exactamente cuáles son las posiciones de los márgenes de los marcos.Existen problemas menores, por ejemplo, los cuadros de margen pueden superponerse, pero no son difíciles de resolver.
Creo que la situación es la misma, como podemos ver con el
overflow-x
&overflow-y
combinaciones , con los divs posicionados absolutos en las celdas de la tabla, con la combinación de min | max-width | height con el tamaño de la caja, y así sucesivamente.Hay características, características realmente simples, que los desarrolladores del navegador simplemente no desarrollan.
En mi humilde opinión,
box-sizing: margin-box
fueron una característica muy útil. Otra característica útil fueron lasbox-sizing: padding-box
, existe al menos en el estándar, pero no se implementó en ninguno de los principales navegadores. ¡Ni siquiera en el cromo más nuevo!Nota: Comentario de @Oriol: Firefox implementó box-sizing: padding-box. Pero otros no, y fue eliminado de la especificación. Firefox lo eliminará en la versión 50. Triste.
fuente
box-sizing: padding-box
. Pero otros no, y fue eliminado de la especificación. Firefox lo eliminará en la versión 50. Triste.El chico en la parte superior pregunta si desea agregar margen al ancho total, incluidos el relleno y el borde. La cuestión es que el margen se aplica fuera del cuadro y el relleno y el borde no, cuando se usa
border-box
.He tratado de lograr la
border-margin
idea. Lo que he encontrado es que si usa el margen puede agregar una clase de.last
al último elemento (con margen, luego aplicar un margen de cero o usar:last-child/:last-of-type
). O agregue márgenes iguales en todos los sentidos (similar a la versión de relleno anterior).Ver ejemplos aquí: http://codepen.io/mofeenster/pen/Anidc
border-box
calcula el ancho del elemento + su relleno + su borde como el ancho total. Entonces, si tienes 2div
s que tienen un 50% de ancho, serán adyacentes. Si les agrega8px
relleno, entonces tendrá una canaleta de16px
. Combine eso con un elemento de envoltura, que también tiene relleno8px
, tendrá una cuadrícula muy bien distribuida con canales iguales por todos lados.Vea este ejemplo aquí: http://codepen.io/mofeenster/pen/vGgje
Este último es mi método favorito.
fuente
Estoy seguro de que todo esto es obvio, pero lo escribiré de todos modos porque ... bueno, necesito el ejercicio. ¿El siguiente resultado no sería tan eficiente como
box-sizing: margin-box;
:http://jsfiddle.net/Fg3hg/
box-sizing
se utiliza para controlar desde qué punto el relleno y el borde se evalúan según el tamaño general del elemento. Entonces, aunque no es kosher incluirpx
márgenes con un%
ancho (como suele ser siempre el caso), es más fácil calcular cuál debería ser la cantidad de porcentaje relativo porque no tiene que incorporar relleno y bordes al ancho definido.fuente
margin-box
manejaría los cálculos de márgenes multidimensionales?@media
puntos de interrupciónmax-width
ymin-width
funcionan bien. Supongo quemargin-box
podría reducir un poco la hinchazón, pero también obtengo razones por las que puede considerarse redundante.Esto se debe a que el atributo de tamaño de caja se refiere al tamaño de un elemento después de calcular los valores específicos de dimensión dados (relleno, bordes). "box-sizing: border-box" establece la altura / anchura de un elemento y tiene en cuenta el relleno y el ancho del borde. El alcance del margen de un elemento es mayor que el elemento en sí mismo, lo que significa que modifica el flujo de la página y sus elementos circundantes, por lo tanto, altera directamente la forma en que el elemento se ajusta dentro de su elemento primario en relación con sus elementos hermanos. En última instancia, un valor de atributo "cuadro de margen" causaría problemas importantes y es esencialmente lo mismo que establecer los elementos alto / ancho directamente.
fuente
En Codrops hay un par de buenos artículos sobre el tema del efecto de los márgenes y las filas forzadas a desbordarse. Sugieren usar la unidad rem o em con un CSS normalizador estableciendo el tamaño de fuente al 100% para todos los navegadores, luego, cuando se configuran anchos y márgenes, es fácil realizar un seguimiento del efecto en el ancho de la fila simplemente haciendo una nota en los comentarios para El ancho total. Una conversión de 16px a 1 em es la forma de calcular el total de ventanas objetivo con total.
Trabajando así para la etapa de desarrollo al menos y luego, si desea plantillas 'receptivas', puede convertir anchos a%, incluidos los anchos de margen.
La otra forma, a menudo más simple, que sugieren manejar las canaletas es usar el pseudo después y el
content: '';
de cada una de sus columnas que creo que funciona muy bien. Si establece una clase div que es la última columna definida, como final, puede seleccionar esa clase para que no tenga el pseudo después o una más amplia; el que mejor se adapte a su diseño.La ventaja adicional de usar este método de pseudoelemento es que también le proporciona un objetivo para las sombras que pueden dar un efecto más 3D y una mayor profundidad a la imagen plana en el monitor de los lectores. En este momento estoy experimentando con este efecto ampliando los efectos que se usan en los botones, 'ajustando' los gradientes y el índice z.
fuente
Las dimensiones de los elementos no reemplazados a nivel de bloque en flujo normal deben satisfacer
Cuando están demasiado restringidos, los navegadores deben ajustar el margen izquierdo o derecho. Creo que eso significa que el ancho del cuadro de margen debe ser igual al ancho del bloque contenedor (es decir, 100%).
Para su caso, los bordes transparentes
box-sizing: border-box
pueden funcionar como márgenes .fuente
Quizás establezca el borde en 0% de opacidad usando RGBA y use el borde como margen.
fuente
1px
separadas, cada una ocupando50%
espacio disponible? Eso es exactamente lomargin-box
que haría. O olvide el cuadro de margen y piense en el espacio disponible. No el 50% del contenedor principal, sino el 50% de lo que queda. No "calc", no "5% margin", no tal desastre ...Hay una situación interesante cuando se utiliza el tamaño de la caja dentro del contenido del cuerpo
sin contenido no hay cuadro de borde no da ningún valor en el margen izquierdo-derecho% recuento de estos algoritmos de recuento de dos cuadros
Por lo tanto, el margen no está planeado ...
fuente