在固定的 flexbox 导航菜单下定位可滚动内容
Positioning scrollable content under fixed flexbox navigation menu
我有以下代码片段(需要在全屏模式下查看),我试图将 <main>
元素直接放在 <header>
元素下面。我将 <header>
置于固定位置,因为我希望它在用户滚动浏览 <main>
元素中的内容时保持在屏幕顶部。我已经尝试了所有我知道的方法,但我能想到的最好办法是将 <header>
元素放在 <main>
元素的顶部,这会切断大部分内容。
我想出的最接近的可能解决方案是在 <main>
元素上放置一个估计的顶部填充,这样它将清除 <header>
。但是,此解决方案不能很好地考虑各种屏幕尺寸,因为我使用的是 rem 大小而不是 px。当在 <header>
中放置多个使用相对或基于百分比的高度的元素时,顶部填充的想法会变得更糟。在一种屏幕尺寸上,所有内容都可能完美排列,而在不同的屏幕尺寸上,内容可能会相差甚远。
最后,我知道我可以使用 jQuery 来动态设置顶部填充,但它似乎并不总是那么有效。想知道是否有一个纯粹的 css/html 解决方案。
谁能告诉我我在这里缺少什么?我的顶部填充方法是唯一可行的解决方案吗?
$(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>
这是一个粗略的 hack,但您可以创建第二个 header,它隐藏在真实的文档流后面,并向下推 <main>
。
只需复制构成 header 的元素,给它们一个较低的 z-index
并将其从 position: fixed
切换为 position: relative
。然后去掉隐藏的 <header>
元素的高度并从 <main>
.
中删除 padding-top
$(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,
#hidden-wrap{
margin: 0 auto;
position: relative;
width:100%;
}
#hidden-wrap header {
height: inherit;
position: relative;
}
#second-wrap{
position: fixed;
width:100%;
z-index:999;
}
#second-wrap2{
position: relative;
width:100%;
z-index:998;
}
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,
#navToggle2{
background-color: rgba(0, 0, 0, .15);
position: relative;
right: 0;
top: 0;
z-index:999;
height: 2.6rem;
}
#navToggle>a,
#navToggle2>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,
#bottom-container2{
display: flex;
flex-direction: column;
text-align: center;
box-shadow: 2px 5px 10px 1px rgba(0, 0, 0, 0.55);
}
#bottom-container>nav,
#bottom-container2>nav{
background-color: rgb(250, 209, 14);
display: none;
flex: 1;
}
#bottom-container nav>ul,
#bottom-container2 nav>ul{
list-style-type: none;
}
#bottom-container nav>ul>li,
#bottom-container2 nav>ul>li{
position: relative;
}
#bottom-container nav>ul>li>a,
#bottom-container2 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,
#bottom-container2 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,
#bottom-container2>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,
#navToggle2{
display: none;
}
#bottom-container,
#bottom-container2{
background-color: rgb(250, 209, 14);
width: 100%;
border-top: calc(5vh + 2vw) solid yellow;
}
#bottom-container>nav,
#bottom-container2>nav{
display: block;
}
#bottom-container>nav>ul,
#bottom-container2>nav>ul{
display: flex;
justify-content: center;
flex-direction: row;
height: 3rem;
}
#bottom-container nav>ul>li,
#bottom-container2 nav>ul>li{
position: static;
flex:1;
display: flex;
justify-content: center;
align-items: center;
}
#bottom-container nav>ul>li>a,
#bottom-container2 nav>ul>li>a{
padding: 0;
}
#bottom-container nav>ul>li>a span.toggle,
#bottom-container2 nav>ul>li>a span.toggle{
display: none;
}
#bottom-container >nav>ul>li>nav>ul>li,
#bottom-container2 >nav>ul>li>nav>ul>li{
line-height: 2.5rem;
}
#bottom-container>nav>ul>li>nav,
#bottom-container2>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>
<div id="hidden-wrap">
<div id="second-wrap2">
<header>
<div id="navToggle2"><a href="#">Menu</a></div>
<div id='bottom-container2'>
<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>
</li>
</ul>
</nav>
</div>
</header>
</div>
</div>
<main>
<p>now you can see this text</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>
编辑:不知道为什么我之前没有想到这一点。只需将 #headwrap
和 <main>
设置为 position: relative
。然后,删除 <main>
上的 height
并将 <body>
设置为 display: flex
和 flex-direction: column
。最后,将 <main>
的内容包裹在一个 <div>
中。
在这里,我将 div 的高度设置为 4000px 以演示滚动。
$(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: 100vh;
display: flex;
flex-direction: column;
}
#head-wrap{
margin: 0 auto;
position: relative;
width:100%;
}
#second-wrap{
position: relative;
width:100%;
z-index:999;
}
main{
/*height:4000px;*/
position:relative;
overflow: auto;
/* padding-top:13rem; */
}
main>div {
height: 4000px;
}
header{
position: relative;
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>
<div>
<p>now you can see this text</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>
</div>
</main>
</body>
</html>
A simple fix, i used padding
in %
rather then rem
or px
$(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);
}
/*
/////////////////////////////////////////////////
/////////////////////////////////////////////////
//// Use padding in % //////////
*/
main {
padding-top: 11%;
}
@media (max-width:1200px) {
main {
padding-top: 12.5%;
}
}
@media (max-width:1023px) {
main {
padding-top: 14.5%;
}
}
@media (max-width:767px) {
main {
padding-top: 8%;
}
}
/*
////////////////////////////////////////////////
////////////////////////////////////////////////
*/
/* 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>
你不是在找 position: sticky; top: 0; 吗?您想在用户向右滚动时拥有跟随用户的菜单吗?然后尝试将 #bottom-container 更改为:
#bottom-container {
display: flex;
flex-direction: column;
text-align: center;
box-shadow: 2px 5px 10px 1px rgba(0, 0, 0, 0.55);
position: sticky;
top: 0;
z-index: 1;
}
我想就是这样。但有一个是肯定的——你需要重新考虑你是如何创建所有这些结构的,因为它太乱了。您可以通过以下方式获得相同的结果:
html:
<header>
<nav id="mobileMenu"><a href="#">Menu</a></nav>
<nav id='menu'>
<div class="menuItem">
<a href="#">ITEM ONE</a>
</div>
<div class="bigMenuItem">
HOVER ME
<div class="menuItemsCon">
<div class="menuItem"><a href="#">Sub Item 1</a></div>
<div class="menuItem"><a href="#">Sub Item 2</a></div>
<div class="menuItem"><a href="#">Sub Item 3</a></div>
<div class="menuItem"><a href="#">Sub Item 4</a></div>
</div>
</div>
<label class="bigMenuItem" for="inputClick">
CLICK ME
<input type="checkbox" name="input" id="inputClick" style="display:none;">
<div class="menuItemsCon click">
<div class="menuItem"><a href="#">Sub Item 1</a></div>
<div class="menuItem"><a href="#">Sub Item 2</a></div>
<div class="menuItem"><a href="#">Sub Item 3</a></div>
<div class="menuItem"><a href="#">Sub Item 4</a></div>
</div>
</label>
</nav>
</header>
<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>
</main>
style.css:
* {
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;
}
main{
height:100vh;
position:relative;
}
/*Changed classes*/
header{
position: sticky;
top:0;
z-index: 1;
}
a{
display: block;
color: rgba(0, 0, 0, .65);
text-decoration: none;
width: 100%;
height: 100%;
}
#mobileMenu{
display: none;
background-color: rgba(0, 0, 0, .15);
height: 2.6rem
}
#mobileMenu 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;
}
#menu{
background-color: rgb(250, 209, 14);
border-top: calc(5vh + 2vw) solid yellow;
display: flex;
z-index: 999;
box-shadow: 2px 5px 10px 1px rgba(0, 0, 0, 0.55);
}
@media only screen and (max-width:751px) {
#mobileMenu{
display: block;
}
#menu{
display: none;
}
}
#menu > .menuItem, #menu > .bigMenuItem{
width: calc(100%/3);
height: 3rem;
text-align: center;
line-height: 3rem;
}
#menu > .bigMenuItem{
position: relative;
cursor: pointer;
}
#menu > .bigMenuItem .menuItemsCon{
position: absolute;
top: 100%;
left: 0;
width: 100%;
z-index: -1;
opacity: 0;
position: relative;
top: -100vh;
transition: all .5s;
}
#menu > .bigMenuItem .menuItemsCon > .menuItem{
height: 3rem;
background-color: #FFF;
}
/* and if you want to click for submenu to show*/
#menu .bigMenuItem input:checked + .menuItemsCon, #menu .bigMenuItem:hover .menuItemsCon:not(.click){
opacity: 1;
top: 0;
}
没有 JS,因为如果您不需要,请不要使用它。希望对您有所帮助。
请删除 header 元素的前两个 div 容器,因为不需要包装 header。 header 元素已经是容器。
请删除 header 样式中的 height:200rem;
和主元素样式中的 padding-top: 13rem or 5rem
。
最后,请将header样式的位置属性更新为sticky而不是absolute
并添加z-index.
下面,我已经对其进行了测试并更新了代码库。
$(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;
}
main{
height:4000px;
position:relative;
}
header{
position: sticky;
z-index: 100;
top:0;
left:0;
width:100%;
}
#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{
/* remove padding top */
}
/*
////////////////////////////////////////////////
////////////////////////////////////////////////
*/
/* 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>
<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>
<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>
Run code snippet
我做了同样的结果(纠正我,如果我错了),但没有 js。看起来,无论 header 高度如何,下面的内容都会考虑。
主要思想 - 不要包装 <header>
并应用到它 position: sticky
,z-index
也没有必要。
我没有完全使用您的代码,但尝试重复结果。希望你能找到一些对你的问题有用的想法。
一些答案的代码当屏幕宽度较小并切换菜单时,它会下推主要内容。我的代码不包含该问题。
* {
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;
}
header {
width: 100%;
position: sticky;
top: 0;
box-shadow: 2px 5px 10px 1px rgba(0, 0, 0, 0.55);
}
.wrapper {
position: relative;
background-color: rgba(0, 0, 0, .15);
}
#navToggle {
display: inline-block;
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;
}
#navToggle:hover + #bottom-container, #bottom-container:hover {
visibility: visible;
opacity: 1;
transition: all 0.2s ease-in-out;
}
#bottom-container {
background-color: rgb(250, 209, 14);
width: 100%;
visibility: hidden;
opacity: 0;
position: absolute;
top: 100%;
left: 0;
}
#bottom-container > nav ul {
margin: 0;
padding: 0;
list-style-type: none;
}
#bottom-container > nav > ul {
display: flex;
flex-direction: column;
flex: 1;
align-items: center;
}
#bottom-container > nav > ul li {
display: flex;
justify-content: center;
width: 100%;
}
#bottom-container nav > ul > li > a {
display: block;
color: rgba(0, 0, 0, .65);
padding: 1.3rem 0;
text-decoration: none;
}
.sub1 {
position: relative;
}
.sub1 > nav {
position: absolute;
top: 100%;
left: 0;
visibility: hidden;
opacity: 0;
background-color: rgb(250, 250, 250);
width: 100%;
transition: all 0.2s ease-in-out;
}
.sub1 > nav ul li {
text-align: center;
}
.sub1 > a:hover + nav, .sub1 > a + nav:hover {
visibility: visible;
opacity: 1;
transition: all 0.2s ease-in-out;
}
#bottom-container nav>ul>li>a span.toggle {
background-color: rgba(0, 0, 0, .05);
color: rgba(0, 0, 0, .25);
padding: 2px 8px;
}
main {
height:4000px;
}
@media (min-width: 751px){
#bottom-container > nav > ul {
flex-direction: row;
height: 3rem;
}
#bottom-container nav>ul>li>a span.toggle {
display: none;
}
#bottom-container {
height: 100%;
border-top: calc(5vh + 2vw) solid yellow;
visibility: visible;
opacity: 1;
position: static;
}
#navToggle {
display: none;
}
}
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header>
<div class="wrapper">
<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>
</div>
</header>
<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>
我可以给你一个 Vanilla-JavaScript 而不是 jQuery …
尝试在页面加载(onload 事件)时获取 "header" 的大小,并将其添加到 "main" 的填充中:
window.addEventListener("load", function(e){
my_main.style.paddingTop = my_header.clientHeight + "px";
}, 1);
为了工作,我给了 "header" 和 "main" 元素一个 "id":
<header id="my_header"> <main id="my_main">
window.addEventListener("load", function(e){
my_main.style.paddingTop = my_header.clientHeight + "px";
}, 1);
* {
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;
}
header {
width: 100%;
position: sticky;
top: 0;
box-shadow: 2px 5px 10px 1px rgba(0, 0, 0, 0.55);
}
.wrapper {
position: relative;
background-color: rgba(0, 0, 0, .15);
}
#navToggle {
display: inline-block;
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;
}
#navToggle:hover + #bottom-container, #bottom-container:hover {
visibility: visible;
opacity: 1;
transition: all 0.2s ease-in-out;
}
#bottom-container {
background-color: rgb(250, 209, 14);
width: 100%;
visibility: hidden;
opacity: 0;
position: absolute;
top: 100%;
left: 0;
}
#bottom-container > nav ul {
margin: 0;
padding: 0;
list-style-type: none;
}
#bottom-container > nav > ul {
display: flex;
flex-direction: column;
flex: 1;
align-items: center;
}
#bottom-container > nav > ul li {
display: flex;
justify-content: center;
width: 100%;
}
#bottom-container nav > ul > li > a {
display: block;
color: rgba(0, 0, 0, .65);
padding: 1.3rem 0;
text-decoration: none;
}
.sub1 {
position: relative;
}
.sub1 > nav {
position: absolute;
top: 100%;
left: 0;
visibility: hidden;
opacity: 0;
background-color: rgb(250, 250, 250);
width: 100%;
transition: all 0.2s ease-in-out;
}
.sub1 > nav ul li {
text-align: center;
}
.sub1 > a:hover + nav, .sub1 > a + nav:hover {
visibility: visible;
opacity: 1;
transition: all 0.2s ease-in-out;
}
#bottom-container nav>ul>li>a span.toggle {
background-color: rgba(0, 0, 0, .05);
color: rgba(0, 0, 0, .25);
padding: 2px 8px;
}
main {
height:4000px;
}
@media (min-width: 751px){
#bottom-container > nav > ul {
flex-direction: row;
height: 3rem;
}
#bottom-container nav>ul>li>a span.toggle {
display: none;
}
#bottom-container {
height: 100%;
border-top: calc(5vh + 2vw) solid yellow;
visibility: visible;
opacity: 1;
position: static;
}
#navToggle {
display: none;
}
}
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header id="my_header">
<div class="wrapper">
<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>
</div>
</header>
<main id="my_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>
我有以下代码片段(需要在全屏模式下查看),我试图将 <main>
元素直接放在 <header>
元素下面。我将 <header>
置于固定位置,因为我希望它在用户滚动浏览 <main>
元素中的内容时保持在屏幕顶部。我已经尝试了所有我知道的方法,但我能想到的最好办法是将 <header>
元素放在 <main>
元素的顶部,这会切断大部分内容。
我想出的最接近的可能解决方案是在 <main>
元素上放置一个估计的顶部填充,这样它将清除 <header>
。但是,此解决方案不能很好地考虑各种屏幕尺寸,因为我使用的是 rem 大小而不是 px。当在 <header>
中放置多个使用相对或基于百分比的高度的元素时,顶部填充的想法会变得更糟。在一种屏幕尺寸上,所有内容都可能完美排列,而在不同的屏幕尺寸上,内容可能会相差甚远。
最后,我知道我可以使用 jQuery 来动态设置顶部填充,但它似乎并不总是那么有效。想知道是否有一个纯粹的 css/html 解决方案。
谁能告诉我我在这里缺少什么?我的顶部填充方法是唯一可行的解决方案吗?
$(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>
这是一个粗略的 hack,但您可以创建第二个 header,它隐藏在真实的文档流后面,并向下推 <main>
。
只需复制构成 header 的元素,给它们一个较低的 z-index
并将其从 position: fixed
切换为 position: relative
。然后去掉隐藏的 <header>
元素的高度并从 <main>
.
padding-top
$(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,
#hidden-wrap{
margin: 0 auto;
position: relative;
width:100%;
}
#hidden-wrap header {
height: inherit;
position: relative;
}
#second-wrap{
position: fixed;
width:100%;
z-index:999;
}
#second-wrap2{
position: relative;
width:100%;
z-index:998;
}
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,
#navToggle2{
background-color: rgba(0, 0, 0, .15);
position: relative;
right: 0;
top: 0;
z-index:999;
height: 2.6rem;
}
#navToggle>a,
#navToggle2>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,
#bottom-container2{
display: flex;
flex-direction: column;
text-align: center;
box-shadow: 2px 5px 10px 1px rgba(0, 0, 0, 0.55);
}
#bottom-container>nav,
#bottom-container2>nav{
background-color: rgb(250, 209, 14);
display: none;
flex: 1;
}
#bottom-container nav>ul,
#bottom-container2 nav>ul{
list-style-type: none;
}
#bottom-container nav>ul>li,
#bottom-container2 nav>ul>li{
position: relative;
}
#bottom-container nav>ul>li>a,
#bottom-container2 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,
#bottom-container2 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,
#bottom-container2>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,
#navToggle2{
display: none;
}
#bottom-container,
#bottom-container2{
background-color: rgb(250, 209, 14);
width: 100%;
border-top: calc(5vh + 2vw) solid yellow;
}
#bottom-container>nav,
#bottom-container2>nav{
display: block;
}
#bottom-container>nav>ul,
#bottom-container2>nav>ul{
display: flex;
justify-content: center;
flex-direction: row;
height: 3rem;
}
#bottom-container nav>ul>li,
#bottom-container2 nav>ul>li{
position: static;
flex:1;
display: flex;
justify-content: center;
align-items: center;
}
#bottom-container nav>ul>li>a,
#bottom-container2 nav>ul>li>a{
padding: 0;
}
#bottom-container nav>ul>li>a span.toggle,
#bottom-container2 nav>ul>li>a span.toggle{
display: none;
}
#bottom-container >nav>ul>li>nav>ul>li,
#bottom-container2 >nav>ul>li>nav>ul>li{
line-height: 2.5rem;
}
#bottom-container>nav>ul>li>nav,
#bottom-container2>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>
<div id="hidden-wrap">
<div id="second-wrap2">
<header>
<div id="navToggle2"><a href="#">Menu</a></div>
<div id='bottom-container2'>
<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>
</li>
</ul>
</nav>
</div>
</header>
</div>
</div>
<main>
<p>now you can see this text</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>
编辑:不知道为什么我之前没有想到这一点。只需将 #headwrap
和 <main>
设置为 position: relative
。然后,删除 <main>
上的 height
并将 <body>
设置为 display: flex
和 flex-direction: column
。最后,将 <main>
的内容包裹在一个 <div>
中。
在这里,我将 div 的高度设置为 4000px 以演示滚动。
$(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: 100vh;
display: flex;
flex-direction: column;
}
#head-wrap{
margin: 0 auto;
position: relative;
width:100%;
}
#second-wrap{
position: relative;
width:100%;
z-index:999;
}
main{
/*height:4000px;*/
position:relative;
overflow: auto;
/* padding-top:13rem; */
}
main>div {
height: 4000px;
}
header{
position: relative;
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>
<div>
<p>now you can see this text</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>
</div>
</main>
</body>
</html>
A simple fix, i used
padding
in%
rather thenrem
orpx
$(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);
}
/*
/////////////////////////////////////////////////
/////////////////////////////////////////////////
//// Use padding in % //////////
*/
main {
padding-top: 11%;
}
@media (max-width:1200px) {
main {
padding-top: 12.5%;
}
}
@media (max-width:1023px) {
main {
padding-top: 14.5%;
}
}
@media (max-width:767px) {
main {
padding-top: 8%;
}
}
/*
////////////////////////////////////////////////
////////////////////////////////////////////////
*/
/* 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>
你不是在找 position: sticky; top: 0; 吗?您想在用户向右滚动时拥有跟随用户的菜单吗?然后尝试将 #bottom-container 更改为:
#bottom-container {
display: flex;
flex-direction: column;
text-align: center;
box-shadow: 2px 5px 10px 1px rgba(0, 0, 0, 0.55);
position: sticky;
top: 0;
z-index: 1;
}
我想就是这样。但有一个是肯定的——你需要重新考虑你是如何创建所有这些结构的,因为它太乱了。您可以通过以下方式获得相同的结果:
html:
<header>
<nav id="mobileMenu"><a href="#">Menu</a></nav>
<nav id='menu'>
<div class="menuItem">
<a href="#">ITEM ONE</a>
</div>
<div class="bigMenuItem">
HOVER ME
<div class="menuItemsCon">
<div class="menuItem"><a href="#">Sub Item 1</a></div>
<div class="menuItem"><a href="#">Sub Item 2</a></div>
<div class="menuItem"><a href="#">Sub Item 3</a></div>
<div class="menuItem"><a href="#">Sub Item 4</a></div>
</div>
</div>
<label class="bigMenuItem" for="inputClick">
CLICK ME
<input type="checkbox" name="input" id="inputClick" style="display:none;">
<div class="menuItemsCon click">
<div class="menuItem"><a href="#">Sub Item 1</a></div>
<div class="menuItem"><a href="#">Sub Item 2</a></div>
<div class="menuItem"><a href="#">Sub Item 3</a></div>
<div class="menuItem"><a href="#">Sub Item 4</a></div>
</div>
</label>
</nav>
</header>
<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>
</main>
style.css:
* {
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;
}
main{
height:100vh;
position:relative;
}
/*Changed classes*/
header{
position: sticky;
top:0;
z-index: 1;
}
a{
display: block;
color: rgba(0, 0, 0, .65);
text-decoration: none;
width: 100%;
height: 100%;
}
#mobileMenu{
display: none;
background-color: rgba(0, 0, 0, .15);
height: 2.6rem
}
#mobileMenu 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;
}
#menu{
background-color: rgb(250, 209, 14);
border-top: calc(5vh + 2vw) solid yellow;
display: flex;
z-index: 999;
box-shadow: 2px 5px 10px 1px rgba(0, 0, 0, 0.55);
}
@media only screen and (max-width:751px) {
#mobileMenu{
display: block;
}
#menu{
display: none;
}
}
#menu > .menuItem, #menu > .bigMenuItem{
width: calc(100%/3);
height: 3rem;
text-align: center;
line-height: 3rem;
}
#menu > .bigMenuItem{
position: relative;
cursor: pointer;
}
#menu > .bigMenuItem .menuItemsCon{
position: absolute;
top: 100%;
left: 0;
width: 100%;
z-index: -1;
opacity: 0;
position: relative;
top: -100vh;
transition: all .5s;
}
#menu > .bigMenuItem .menuItemsCon > .menuItem{
height: 3rem;
background-color: #FFF;
}
/* and if you want to click for submenu to show*/
#menu .bigMenuItem input:checked + .menuItemsCon, #menu .bigMenuItem:hover .menuItemsCon:not(.click){
opacity: 1;
top: 0;
}
没有 JS,因为如果您不需要,请不要使用它。希望对您有所帮助。
请删除 header 元素的前两个 div 容器,因为不需要包装 header。 header 元素已经是容器。
请删除 header 样式中的 height:200rem;
和主元素样式中的 padding-top: 13rem or 5rem
。
最后,请将header样式的位置属性更新为sticky而不是absolute
并添加z-index.
下面,我已经对其进行了测试并更新了代码库。
$(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;
}
main{
height:4000px;
position:relative;
}
header{
position: sticky;
z-index: 100;
top:0;
left:0;
width:100%;
}
#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{
/* remove padding top */
}
/*
////////////////////////////////////////////////
////////////////////////////////////////////////
*/
/* 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>
<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>
<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>
Run code snippet
我做了同样的结果(纠正我,如果我错了),但没有 js。看起来,无论 header 高度如何,下面的内容都会考虑。
主要思想 - 不要包装 <header>
并应用到它 position: sticky
,z-index
也没有必要。
我没有完全使用您的代码,但尝试重复结果。希望你能找到一些对你的问题有用的想法。
一些答案的代码当屏幕宽度较小并切换菜单时,它会下推主要内容。我的代码不包含该问题。
* {
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;
}
header {
width: 100%;
position: sticky;
top: 0;
box-shadow: 2px 5px 10px 1px rgba(0, 0, 0, 0.55);
}
.wrapper {
position: relative;
background-color: rgba(0, 0, 0, .15);
}
#navToggle {
display: inline-block;
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;
}
#navToggle:hover + #bottom-container, #bottom-container:hover {
visibility: visible;
opacity: 1;
transition: all 0.2s ease-in-out;
}
#bottom-container {
background-color: rgb(250, 209, 14);
width: 100%;
visibility: hidden;
opacity: 0;
position: absolute;
top: 100%;
left: 0;
}
#bottom-container > nav ul {
margin: 0;
padding: 0;
list-style-type: none;
}
#bottom-container > nav > ul {
display: flex;
flex-direction: column;
flex: 1;
align-items: center;
}
#bottom-container > nav > ul li {
display: flex;
justify-content: center;
width: 100%;
}
#bottom-container nav > ul > li > a {
display: block;
color: rgba(0, 0, 0, .65);
padding: 1.3rem 0;
text-decoration: none;
}
.sub1 {
position: relative;
}
.sub1 > nav {
position: absolute;
top: 100%;
left: 0;
visibility: hidden;
opacity: 0;
background-color: rgb(250, 250, 250);
width: 100%;
transition: all 0.2s ease-in-out;
}
.sub1 > nav ul li {
text-align: center;
}
.sub1 > a:hover + nav, .sub1 > a + nav:hover {
visibility: visible;
opacity: 1;
transition: all 0.2s ease-in-out;
}
#bottom-container nav>ul>li>a span.toggle {
background-color: rgba(0, 0, 0, .05);
color: rgba(0, 0, 0, .25);
padding: 2px 8px;
}
main {
height:4000px;
}
@media (min-width: 751px){
#bottom-container > nav > ul {
flex-direction: row;
height: 3rem;
}
#bottom-container nav>ul>li>a span.toggle {
display: none;
}
#bottom-container {
height: 100%;
border-top: calc(5vh + 2vw) solid yellow;
visibility: visible;
opacity: 1;
position: static;
}
#navToggle {
display: none;
}
}
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header>
<div class="wrapper">
<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>
</div>
</header>
<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>
我可以给你一个 Vanilla-JavaScript 而不是 jQuery …
尝试在页面加载(onload 事件)时获取 "header" 的大小,并将其添加到 "main" 的填充中:
window.addEventListener("load", function(e){
my_main.style.paddingTop = my_header.clientHeight + "px";
}, 1);
为了工作,我给了 "header" 和 "main" 元素一个 "id":
<header id="my_header"> <main id="my_main">
window.addEventListener("load", function(e){
my_main.style.paddingTop = my_header.clientHeight + "px";
}, 1);
* {
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;
}
header {
width: 100%;
position: sticky;
top: 0;
box-shadow: 2px 5px 10px 1px rgba(0, 0, 0, 0.55);
}
.wrapper {
position: relative;
background-color: rgba(0, 0, 0, .15);
}
#navToggle {
display: inline-block;
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;
}
#navToggle:hover + #bottom-container, #bottom-container:hover {
visibility: visible;
opacity: 1;
transition: all 0.2s ease-in-out;
}
#bottom-container {
background-color: rgb(250, 209, 14);
width: 100%;
visibility: hidden;
opacity: 0;
position: absolute;
top: 100%;
left: 0;
}
#bottom-container > nav ul {
margin: 0;
padding: 0;
list-style-type: none;
}
#bottom-container > nav > ul {
display: flex;
flex-direction: column;
flex: 1;
align-items: center;
}
#bottom-container > nav > ul li {
display: flex;
justify-content: center;
width: 100%;
}
#bottom-container nav > ul > li > a {
display: block;
color: rgba(0, 0, 0, .65);
padding: 1.3rem 0;
text-decoration: none;
}
.sub1 {
position: relative;
}
.sub1 > nav {
position: absolute;
top: 100%;
left: 0;
visibility: hidden;
opacity: 0;
background-color: rgb(250, 250, 250);
width: 100%;
transition: all 0.2s ease-in-out;
}
.sub1 > nav ul li {
text-align: center;
}
.sub1 > a:hover + nav, .sub1 > a + nav:hover {
visibility: visible;
opacity: 1;
transition: all 0.2s ease-in-out;
}
#bottom-container nav>ul>li>a span.toggle {
background-color: rgba(0, 0, 0, .05);
color: rgba(0, 0, 0, .25);
padding: 2px 8px;
}
main {
height:4000px;
}
@media (min-width: 751px){
#bottom-container > nav > ul {
flex-direction: row;
height: 3rem;
}
#bottom-container nav>ul>li>a span.toggle {
display: none;
}
#bottom-container {
height: 100%;
border-top: calc(5vh + 2vw) solid yellow;
visibility: visible;
opacity: 1;
position: static;
}
#navToggle {
display: none;
}
}
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header id="my_header">
<div class="wrapper">
<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>
</div>
</header>
<main id="my_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>