El margen CSS agrega espacio fuera del elemento principal [duplicate]

6 minutos de lectura

avatar de usuario
jamietelin

Mis márgenes CSS no se comportan como quiero o espero que lo hagan. Parece que el margen superior de mi encabezado afecta las etiquetas div que lo rodean.

Esto es lo que quiero y espero:
Lo que quiero....

…pero esto es lo que termino con:
Lo que consigo...

Fuente:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Margin test</title>

<style type="text/css">
body {
    margin:0;
}
#page {
    margin:0;
    background:#FF9;
}
#page_container {
    margin:0 20px;
}
h1 {
    margin:50px 0 0 0;
}
</style>

</head>

<body>

<div id="page">
    <div id="page_container">
        <header id="branding" role="banner">
            <hgroup>
                <h1 id="site-title"><span><a href="#" title="Title" rel="home">Title</a></span></h1>
                <h2 id="site-description">Description</h2>
            </hgroup>
        </header>
    </div>
</div>

He exagerado el margen en este ejemplo. El margen predeterminado del navegador en h1-tag es algo más pequeño, y en mi caso uso Twitter Bootstrap, con Normalizer.css que establece el margen predeterminado en 10px. No es tan importante, el punto principal es; No puedo, no debo, No quiero cambie el margen en la etiqueta h1.

Supongo que es similar a mi otra pregunta; ¿Por qué no funciona este estilo de margen superior de CSS?. La pregunta es ¿cómo resuelvo este problema específico?

He leído algunos hilos sobre problemas similares, pero no he encontrado respuestas ni soluciones reales. sé agregar padding:1px; o border:1px; resuelve el problema Pero eso solo agrega nuevos problemas, ya que no quiero un relleno ni un borde en mis etiquetas div.

¿Tiene que haber una mejor, mejor práctica, solución? Esto debe ser bastante común.

  • ¿Comenzaste con un reinicio de CSS?

    – Diodeus – James MacFarlane

    26 de noviembre de 2012 a las 21:46

  • Yo uso Normalizer.css. Pero ese no es el problema. Si quito la etiqueta h1. No hay ningún problema. El problema es que quiero un margen en mi etiqueta h1 y eso afecta a los elementos circundantes.

    – jamietelin

    26 de noviembre de 2012 a las 21:48

  • @DavidThomas Estoy jugando con una demostración en este momento si quieres jugar jsfiddle.net/5RhFq/6

    – Calvino

    26 de noviembre de 2012 a las 21:55

  • no importa … j08691 lo ha resuelto 🙂 jsfiddle.net/5RhFq/7

    – Calvino

    26 de noviembre de 2012 a las 21:56

  • La explicación y algunas posibles soluciones ya fueron cubiertas en mi respuesta a su pregunta anterior…

    – BoltClock

    28 de noviembre de 2012 a las 6:16

Agregar overflow:auto para usted #page división

js Ejemplo de violín

y echa un vistazo márgenes colapsados mientras estás en eso.

  • Eso funciona. Encontré muchos ejemplos aquí ( seifi.org/css/… ) también y algunas buenas explicaciones. Ninguna solución es realmente 100% satisfactoria. Pero supongo que uno solo tiene que vivir con eso, el margen debe funcionar de esta manera o el formato del texto sería imposible. El 99% del tiempo funciona según sea necesario. Pero de vez en cuando surge el problema al diseñar un diseño. :PAGS

    – jamietelin

    26 de noviembre de 2012 a las 22:38

  • desbordamiento: oculto; también funcionó para mí y funcionó mejor para mí en mi escenario.

    – estuyam

    21 de diciembre de 2014 a las 15:24

  • eres un mago. este fue un comportamiento realmente extraño

    – suerte

    6 de diciembre de 2018 a las 16:33

  • Los márgenes colapsados ​​parecen increíblemente complicados de definir (muchas reglas, muchas excepciones), ¿para qué sirve?

    – estani

    26 de noviembre de 2019 a las 11:29

  • display: flex con flex-direction: column en el contenedor principal hace el mismo truco.

    – Maksim Shamihulau

    6 de diciembre de 2020 a las 7:32

avatar de usuario
Ziarno

Agregue cualquiera de las siguientes reglas:

float: left/right;
position: absolute;
display: inline-block;
overflow: auto/scroll/hidden;
clear: left/right/both;

Esto es causado por collapsing margins. Ver un artículo sobre este comportamiento aquí.

Según el artículo:

La especificación W3C define los márgenes colapsados ​​de la siguiente manera:

“En esta especificación, la expresión márgenes colapsados ​​significa que los márgenes contiguos (sin contenido no vacío, relleno o áreas de borde, o separación entre ellos) de dos o más cajas (que pueden estar una al lado de la otra o anidadas) se combinan para formar un solo margen.”

Esto también es cierto para los elementos padre-hijo.

Todas las respuestas incluyen una de las posibles soluciones:

Hay otras situaciones en las que los elementos no tienen sus márgenes colapsados:

  • elementos flotantes
  • elementos absolutamente posicionados
  • elementos de bloque en línea
  • elementos con desbordamiento establecidos en cualquier cosa que no sea visible (no colapsan los márgenes con sus elementos secundarios).
  • elementos borrados (no colapsan sus márgenes superiores con el margen inferior de su bloque principal).
  • el elemento raíz

  • clear: <any option> no parece funcionar, las otras soluciones funcionan en Google Chrome

    – Ferrygrande

    22 de enero de 2019 a las 12:54

avatar de usuario
jonbreizh

El problema era que los padres no tenían en cuenta la altura de los niños. agregando display:inline-block; lo hizo por mi

CSS completo

#page {
    margin:0;
    background:#FF9;
    display:inline-block;
    width:100%;
}

ver violín

avatar de usuario
Entre

Solo agrega border-top: 1px solid transparent; para usted #page elemento.

De w3.org

Dos márgenes son contiguos si y solo si:
– sin cuadros de línea, sin espacio libre, sin relleno y sin borde que los separe

Agrega la siguiente regla:

overflow: hidden;

Esto es causado por el colapso de los márgenes. Ver un artículo sobre este comportamiento aquí.

Según el artículo:

Si un elemento principal no tiene ningún relleno superior o menos margen superior que su primer elemento secundario, los elementos se representan de una manera que hace que el elemento principal parezca tener el margen del elemento secundario. Esto puede ocurrir en cualquier parte de una página donde se cumplan estas condiciones, pero tiende a ser más evidente en la parte superior de la página.

avatar de usuario
Trevor

Las soluciones en las otras respuestas no me funcionaron. Los bordes transparentes, el bloque en línea, etc., causaron otros problemas. En su lugar, agregué el siguiente css a mi elemento antepasado:

parent::after{
  content: "";
  display: inline-block;
  clear: both;
}

Dependiendo de su situación, esto puede causar sus propios problemas porque agrega espacio adicional después del último elemento secundario.

avatar de usuario
shiki suen

Mi enfoque cuando estaba creando estilos para XenForo 2.1, pero debería ser útil para usted: (Reemplace esas MENOS variables por sus valores reales. Además, el valor absoluto de los márgenes menores será igual a la altura del pseudo antes-después elementos.)

// The following two lines are to avoid top & bottom fieldset borders run out of the block body.
// (Do not tweak the CSS overflow settings, otherwise the editor menu won't be float above the block border.)
&:before {content: "\a0"; display: block; width: auto; margin-bottom: floor(-1 * @xf-lineHeightDefault * @xf-fontSizeSmall - @xf-borderSizeMinorFeature);}
&:after {content: "\a0"; display: block; width: auto; margin-top: floor(-1 * @xf-lineHeightDefault * @xf-fontSizeSmall - @xf-borderSizeMinorFeature);}

  • Vi tu publicación sobre sort en MacOS, puede intentar instalar GNU sort.

    – Felipe

    3 de enero a las 14:13

  • @Felipe Gracias. Lamento que el nivel de mi cuenta no sea lo suficientemente alto como para permitirme votar un comentario.

    – Shiki Suen

    3 ene a las 15:00

  • No te preocupes, ¿lo intentaste? GNU sort ?

    – Felipe

    3 ene a las 16:10

  • @Philippe Mismo error: Secuencia de bytes ilegal.

    – Shiki Suen

    4 de enero a las 4:30


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad