html - ¿Por qué un elemento con posición: fijo se mueve con un hermano no posicionado?
css css3 (1)
Hay muchas preguntas sobre SO que cubren la respuesta a cómo solucionar esto (agregue
top: 0
), pero ninguna de ellas intenta explicar realmente el razonamiento detrás del movimiento del encabezado.
Tengo más curiosidad de por qué este es el caso.
<header>Project Header</header>
<main class="container" id="layout-mainContent">
<div class="row" id="first-row">somecontent</div>
</main>
header {
position: fixed;
}
#layout-maincontent {
margin-top: 90px; //moves header down.
}
Lista de preguntas similares pero sin razonamiento:
- Div de posición ''fija'' superior que se mueve con div de posición no
- el margen afecta la posición de otros elementos fijos
- el margen superior div hace que el encabezado fijo se mueva hacia abajo
Parece razonable pensar que el encabezado fijo se adhiere a la parte superior de la ventana del navegador y no debe moverse debido a otro div no posicionado, no secundario y no primario (también conocido como hermano). Esp. porque el encabezado fijo está fuera del flujo normal de documentos. MDN en posicionamiento fijo
Hipótesis: la confusión surge de la idea de que los elementos fijos son relativos a la ventana del navegador. Esto es cierto, pero se calcula utilizando la ventana gráfica. La ventana gráfica se calcula utilizando elementos que están dentro del flujo de documentos normal. Debido a que el primer div que está dentro del flujo de documentos es el div sin encabezado, la ventana gráfica comienza después de que se aplica el margen superior. Esto es solo especulación y me encantaría ver a alguien confirmarme o corregirme.
Con
position: fixed
, su elemento de
header
se elimina del flujo de documentos.
El primer elemento en flujo es
main
, que tiene
margin-top: 90px
en su código.
El elemento principal de este elemento es
body
, que normalmente tiene un
margin: 8px
predeterminado
margin: 8px
(consulte la
hoja de estilo predeterminada de HTML
).
Debido al
colapso del margen
CSS, el
margin-top: 8px
del elemento del
body
margin-top: 8px
se contrae con el
margin-top: 90px
del elemento
margin-top: 90px
.
Como resultado, ambos elementos, que ahora tienen el mismo margen, cambian 90px hacia abajo.
html {
background-color: green;
height: 100%;
}
body {
background-color: pink;
height: 100%;
}
header {
position: fixed;
border: 1px solid red;
}
main {
margin-top: 90px;
background-color:yellow;
}
<header>Project Header</header>
<main class="container" id="layout-mainContent">
<div class="row" id="first-row">somecontent</div>
</main>
La razón por la que se mueve el encabezado fijo es la siguiente:
-
Aunque el
bloque contenedor
para un elemento con
position: fixed
es la ventana gráfica ... -
Las propiedades de desplazamiento de CSS (
top
,bottom
,left
yright
) tienen un valor inicial deauto
, que mantiene el elemento donde normalmente estaría si estuviera en el flujo de documentos. -
Dicho de otra manera, cuando establece un elemento en
position: absolute
oposition: fixed
(otra forma deposition: absolute
), está especificando el tipo de posicionamiento que desea ... pero no lo está colocando en ningún lado. - No es hasta que defina los desplazamientos que el elemento está realmente posicionado.
-
Para cambiar el encabezado a la parte superior de la ventana gráfica, use
top: 0
.
html {
background-color: green;
height: 100%;
}
body {
background-color: pink;
height: 100%;
}
header {
position: fixed;
border: 1px solid red;
top: 0px; /* NEW */
}
main {
margin-top: 90px;
background-color:yellow;
}
<header>Project Header</header>
<main class="container" id="layout-mainContent">
<div class="row" id="first-row">somecontent</div>
</main>