J'ai l'extrait de code suivant (besoin de voir en mode plein écran), que j'essaie de placer l' <main>
élément directement sous l' <header>
élément. J'ai le <header>
dans une position fixe parce que je veux qu'il reste en haut de l'écran pendant que l'utilisateur fait défiler le contenu de l' <main>
élément. J'ai essayé tout ce que je sais, mais le mieux que je puisse trouver est de <header>
placer l' élément au-dessus de l' <main>
élément, ce qui coupe une grande partie du contenu.
La solution la plus proche possible que j'ai trouvée consiste à placer un rembourrage supérieur estimé sur l' <main>
élément afin qu'il efface le <header>
. Cependant, cette solution ne prend pas très bien en compte les différentes tailles d'écran, car j'utilise la taille rem au lieu de px. L'idée de rembourrage supérieur devient encore pire lorsque vous placez plusieurs éléments à l'intérieur de la <header>
hauteur relative ou basée sur un pourcentage. Sur une taille d'écran, tout peut être parfait, et sur une taille d'écran différente, le contenu peut être très différent.
Enfin, je sais que je peux utiliser jQuery pour définir dynamiquement le remplissage supérieur, mais cela ne semble pas toujours bien fonctionner. Vous vous demandez s'il existe une solution css / html pure.
Quelqu'un peut-il me dire ce qui me manque ici? Ma méthode de rembourrage supérieur est-elle la seule solution viable?
$(document).ready(function() {
$('#navToggle').click(function() {
$("div#bottom-container > nav").slideToggle();
});
$(window).resize(function() {
if(window.innerWidth >= "751") {
$("header > div#bottom-container > nav").show();
}else {
$("header > div#bottom-container > nav").hide();
}
});
$("header > div#bottom-container > nav > ul > li > a").click(function(e) {
if (window.innerWidth <= "750") {
if ($(this).siblings().size() > 0) {
e.preventDefault();
$(this).siblings().slideToggle("slow");
}
}
});
$("header > div#bottom-container > nav > ul > li").hover(function() {
if (window.innerWidth >= "751") {
if ($(this).children("nav").size() > 0) {
$(this).children("nav").stop().show();
}
}
},function(){
if (window.innerWidth >= "751") {
if ($(this).children("nav").size() > 0) {
$(this).children("nav").hide();
}
}
});
});
* {
margin: 0;
}
@media (min-width: 48rem) {
:root {
font-size: calc(1rem + ((1vw - .48rem) * 1.389));
}
}
body {
background: #eee;
font-family: "HelveticaNeue-Light", Arial;
height: auto !important;
}
#head-wrap{
margin: 0 auto;
position: relative;
width:100%;
}
#second-wrap{
position: fixed;
width:100%;
z-index:999;
}
main{
height:4000px;
position:relative;
padding-top:13rem;
}
header{
position: absolute;
top:0;
left:0;
width:100%;
overflow-x: hidden;
overflow-y: auto;
height:200rem;
}
#navToggle {
background-color: rgba(0, 0, 0, .15);
position: relative;
right: 0;
top: 0;
z-index:999;
height: 2.6rem;
}
#navToggle>a {
color: rgba(255, 255, 255, .85);
display: block;
font-size: 0.85em;
font-weight: 600;
padding: 0 2.5rem;
text-decoration: none;
transition: all 300ms ease;
padding-top:.9rem;
}
#bottom-container {
display: flex;
flex-direction: column;
text-align: center;
box-shadow: 2px 5px 10px 1px rgba(0, 0, 0, 0.55);
}
#bottom-container>nav {
background-color: rgb(250, 209, 14);
display: none;
flex: 1;
}
#bottom-container nav>ul {
list-style-type: none;
}
#bottom-container nav>ul>li {
position: relative;
}
#bottom-container nav>ul>li>a {
display: block;
color: rgba(0, 0, 0, .65);
padding: 1.3rem 0;
text-decoration: none;
}
#bottom-container nav>ul>li>a span.toggle {
background-color: rgba(0, 0, 0, .05);
color: rgba(0, 0, 0, .25);
padding: 2px 8px;
}
#bottom-container>nav>ul>li>nav {
display: none;
overflow: hidden;
position: absolute;
top:100%;
right: 5%;
width: 90%;
z-index: 100;
background-color: rgb(250, 250, 250);
margin-bottom:10rem;
}
header>nav>ul>li>nav>ul>li>a {
color: rgba(255, 255, 255, .85);
}
/*
/////////////////////////////////////////////////
/////////////////////////////////////////////////
//// THIS IS THE ONLY FIX I KNOW OF //////////
*/
main{
padding-top:5rem;
}
/*
////////////////////////////////////////////////
////////////////////////////////////////////////
*/
/* Medium screens */
@media all and (min-width: 751px) {
header{
overflow-y:visible;
overflow-x:visible;
padding-bottom:0;
}
#navToggle {
display: none;
}
#bottom-container {
background-color: rgb(250, 209, 14);
width: 100%;
border-top: calc(5vh + 2vw) solid yellow;
}
#bottom-container>nav {
display: block;
}
#bottom-container>nav>ul {
display: flex;
justify-content: center;
flex-direction: row;
height: 3rem;
}
#bottom-container nav>ul>li {
position: static;
flex:1;
display: flex;
justify-content: center;
align-items: center;
}
#bottom-container nav>ul>li>a {
padding: 0;
}
#bottom-container nav>ul>li>a span.toggle {
display: none;
}
#bottom-container >nav>ul>li>nav>ul>li{
line-height: 2.5rem;
}
#bottom-container>nav>ul>li>nav {
margin-top:-194.5rem;
}
}
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
</head>
<body>
<div id="head-wrap">
<div id="second-wrap">
<header>
<div id="navToggle"><a href="#">Menu</a></div>
<div id='bottom-container'>
<nav>
<ul>
<li><a href="#">ITEM ONE</a></li>
<li class="sub1">
<a href="#">ITEM TWO <span class="toggle">Expand</span></a>
<nav>
<ul>
<li><a href="#">Sub Item 1</a></li>
<li><a href="#">Sub Item 2</a></li>
<li><a href="#">Sub Item 3</a></li>
<li><a href="#">Sub Item 4</a></li>
</ul>
</nav>
<li><a href="#">ITEM THREE</a></li>
</ul>
</nav>
</div>
</header>
</div>
</div>
<main>
<p>content top not visible but should be able to see</P>
<p>line 1</P>
<p>line 2</P>
<p>line 3</P>
<p>line 4</P>
<p>line 5</P>
<p>line 6</P>
<p>line 7</P>
<p>line 8</P>
<p>line 9</P>
<p>line 10</P>
<p>line 11</P>
<p>line 12</P>
<p>line 13</P>
<p>line 14</P>
<p>line 15</P>
<p>line 16</P>
<p>line 17</P>
<p>line 18</P>
<p>line 19</P>
<p>line 20</P>
</main>
</body>
</html>
la source
main
élément. Clunky, mais ça fonctionne. Vous vous demandez s'il existe une meilleure solution.<header>
élément qui utilisent tous des pourcentages ou des hauteurs relatives. Cela rend<main>
presque inutile l' ajout d'un coussin supérieur fixe à l' élément. L'<main>
élément peut bien s'aligner sur une taille d'écran et être très éloigné sur une autre. On dirait que jQuery peut être ma seule solution ici avec une sauvegarde du pad supérieur css sur l'<main>
élément.position: sticky
developer.mozilla.org/en-US/docs/Web/CSS/position au lieu d'utiliser JS?Réponses:
J'ai fait le même résultat (corrigez-moi, si je me trompe), mais sans js. Et il semble que la hauteur de l'en-tête soit prise en compte par le contenu ci-dessous.
L'idée principale - de ne pas envelopper
<header>
et de l'appliquerposition: sticky
,z-index
n'est pas non plus nécessaire.Je n'ai pas utilisé exactement votre code, mais j'ai essayé de répéter le résultat. J'espère que vous trouverez quelques idées utiles pour votre problème.
Le code de certaines réponses lorsque la largeur de l'écran est petite et basculer le menu, il pousse vers le bas le contenu principal. Mon code ne contient pas ce problème.
la source
Veuillez supprimer les deux premiers conteneurs div supérieurs de l'élément d'en-tête car il n'est pas nécessaire d'envelopper l'en-tête. l'élément d'en-tête est déjà conteneur.
Veuillez supprimer
height:200rem;
dans le style d'en-tête etpadding-top: 13rem or 5rem
pour le style de l'élément principal.Enfin, veuillez mettre à jour la propriété de position du style d'en-tête à sticky au lieu de
absolute
et ajouter z-index.Ci-dessous, je l'ai testé et mis à jour la base de code.
la source
C'est en quelque sorte un hack grossier, mais vous pouvez créer un deuxième en-tête qui se cache derrière le vrai qui reste dans le flux de documents et pousse vers le bas
<main>
.Dupliquez simplement les éléments qui composent l'en-tête, donnez-leur une valeur inférieure
z-index
et passez-la deposition: fixed
àposition: relative
. Ensuite , il suffit de se débarrasser de la hauteur du caché<header>
élément et retirez lepadding-top
de<main>
.Edit: je ne sais pas pourquoi je n'y avais pas pensé avant. Il suffit de régler
#headwrap
et<main>
deposition: relative
. Ensuite, retirez leheight
on<main>
et réglez<body>
surdisplay: flex
etflex-direction: column
. Enfin, enveloppez le contenu de<main>
a<div>
.Ici, j'ai défini la hauteur du div à 4000px pour illustrer le défilement.
la source
la source
media-quires
mal parviennent à ajuster le rembourrage maintenant son bon fonctionnement s'il vous plaît vérifier et faites-le moi savoirne cherchez-vous pas la position: collante; en haut: 0; ? Vous voulez avoir un menu qui suit l'utilisateur quand il défile à droite? Essayez ensuite de remplacer # bottom-container par:
Et je pense que c'est tout. Mais l'un est sûr - vous devez repenser la façon dont vous avez créé toute cette structure car c'est désordonné. Vous pouvez obtenir les mêmes résultats avec:
html:
style.css:
Et pas de JS cuz si vous n'êtes pas obligé de ne pas l'utiliser. J'espère que ça aide.
la source
Je peux vous proposer un Vanilla-JavaScript au lieu de jQuery…
Essayez d'obtenir la taille de "header" lors du chargement de la page (événement onload) et ajoutez-la au remplissage de "main":
pour travailler, j'ai donné un "id" à la "tête" et aux éléments "principaux":
la source