Eu tenho o seguinte snippet (preciso visualizar no modo de tela cheia), que estou tentando colocar o <main>
elemento diretamente sob o <header>
elemento. Eu tenho o <header>
em uma posição fixa porque quero que ele fique na parte superior da tela enquanto o usuário rola pelo conteúdo do <main>
elemento. Eu tentei de tudo o que sei, mas o melhor que posso encontrar é <header>
colocar o elemento em cima do <main>
elemento, o que corta uma grande parte do conteúdo.
A solução mais próxima possível que eu encontrei é colocar um preenchimento superior com estimativa de valor no <main>
elemento para limpar o <header>
. No entanto, esta solução não conta muito bem com vários tamanhos de tela, pois estou usando o redimensionamento rem em vez de px. A idéia de preenchimento superior fica ainda pior ao colocar vários elementos dentro do <header>
que usam altura relativa ou percentual. No tamanho de uma tela, tudo pode ficar perfeito, e em um tamanho de tela diferente, o conteúdo pode ser muito diferente.
Por fim, sei que posso usar o jQuery para definir o preenchimento superior dinamicamente, mas nem sempre parece funcionar tão bem. Imaginando é que existe uma solução css / html pura.
Alguém pode me dizer o que estou perdendo aqui? Meu método de preenchimento superior é a única solução viável?
$(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>
fonte
main
elemento. Desajeitado, mas meio que funciona. Querendo saber se existe uma solução melhor.<header>
elemento que usam alturas percentuais ou relativas. Isso torna a adição de um bloco superior fixo ao<main>
elemento quase inútil. O<main>
elemento pode alinhar-se bem em um tamanho de tela e sair em outro. Parece que o jQuery pode ser minha única solução aqui, com um backup do CSS no<main>
elemento.position: sticky
developer.mozilla.org/en-US/docs/Web/CSS/position em vez de usar JS?Respostas:
Eu fiz o mesmo resultado (me corrija, se estiver errado), mas sem js. E parece que qualquer altura do cabeçalho é considerada pelo conteúdo abaixo.
A idéia principal - para não envolver
<header>
e aplicar a eleposition: sticky
,z-index
também não é necessário.Não usei exatamente o seu código, mas tentei repetir o resultado. Espero que você encontre algumas idéias úteis para o seu problema.
O código de algumas respostas quando a largura da tela é pequena e alterna o menu, pressiona o conteúdo principal. Meu código não contém esse problema.
fonte
Remova os primeiros dois principais contêineres div do elemento do cabeçalho, pois não há necessidade de quebrar o cabeçalho. O elemento do cabeçalho já é contêiner.
Remova
height:200rem;
no estilo do cabeçalho epadding-top: 13rem or 5rem
no estilo do elemento principal.Por fim, atualize a propriedade position do estilo do cabeçalho para sticky em vez de
absolute
e adicione o z-index.Abaixo, eu testei e atualizei a base de código.
fonte
Isso é uma espécie de invasão grosseira, mas você pode criar um segundo cabeçalho que se esconde atrás do real, que permanece no fluxo do documento e empurra o
<main>
.Apenas duplique os elementos que compõem o cabeçalho, diminua
z-index
e mude deposition: fixed
paraposition: relative
. Em seguida, basta se livrar da altura do oculto<header>
elemento e remover apadding-top
partir<main>
.Edit: Eu não sei por que eu não pensei nisso antes. Basta definir
#headwrap
e<main>
paraposition: relative
. Em seguida, remova oheight
ligado<main>
e defina<body>
paradisplay: flex
eflex-direction: column
. Por fim, envolva o conteúdo de<main>
em a<div>
.Aqui, defini a altura da div como 4000px para demonstrar a rolagem.
fonte
fonte
media-quires
mal gerenciar para ajustar o preenchimento agora está funcionando bem, por favor verifique e me avisevocê não está procurando posição: pegajosa; topo: 0; ? Você quer ter um menu que segue o usuário quando ele rola certo? Em seguida, tente alterar # container inferior para:
E eu acho que é isso. Mas um é certo - você precisa repensar como criou toda essa estrutura, porque é uma bagunça como o inferno. Você pode obter os mesmos resultados com:
html:
style.css:
E nenhum JS porque se você não precisar usá-lo. Eu espero que isso ajude.
fonte
Posso oferecer-lhe um Vanilla-JavaScript em vez de jQuery…
Tente obter o tamanho do "cabeçalho" quando a página carregar (evento onload) e adicione-o ao preenchimento de "main":
para trabalhar, dei um "id" ao "cabeçalho" e aos "principais" elementos:
fonte