如何将菜单更改为响应式引导菜单
我想在 codepen 中显示的示例中使用 bootstrap 5 响应式菜单,我尝试了几件事,但它一直在以一种或多种方式破坏。
https://codepen.io/KGuide/pen/WNogyyV
我想使用引导菜单并替换当前菜单,以便该菜单响应大屏幕悬停动画。
<nav>
<div>
<a href="#"><img src="images/logo.png"/></a>
<button type="button" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span></span>
</button>
<div>
<ul>
<li>
<a aria-current="page" href="#">Home</a>
</li>
<li>
<a href="#">Offers</a>
</li>
<li>
<a href="#">Pricing</a>
</li>
<li>
<a href="#" tabindex="-1" aria-disabled="true">Disabled</a>
</li>
</ul>
</div>
</div>
</nav>
<nav class="navbar navbar-expand-lg navbar-light p-5">
<div class="container">
<a class="navbar-brand" href="#"><img class="img-fluid" src="images/logo.png"/></a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="#">Home</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Offers</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Pricing</a>
</li>
<li class="nav-item">
<a class="nav-link disabled" href="#" tabindex="-1" aria-disabled="true">Disabled</a>
</li>
</ul>
</div>
</div>
</nav>
console.clear();
const nav = document.querySelector(".nav-container");
const blob = document.querySelector(".nav-container svg");
gsap.set(blob, {xPercent: -50, x:innerWidth / 2});
nav.addEventListener("mousemove", function(e){
gsap.to(blob, {duration: 0.2, x: e.clientX, overwrite: 'auto'});
});
nav.addEventListener("mouseleave", function(e){
gsap.to(blob, {duration:0.1, x: innerWidth / 2, overwrite: `auto`});
});
body{font-family: "Open Sans Condensed"; background: black;}
h1 {font-family: "Open Sans Condensed"; font-size: 2.2em; font-weight: 600;}
.c-hotel h3 {font-size: 1.2em; font-weight: 600;}
.logo {max-width: 160px;}
.nav-container nav {
display: flex;
justify-content: space-around;
background:white;
height:100px;
}
.nav-container nav a {
color: black;
text-decoration: none;
font-size: 20px;
font-family:"Roboto";
font-weight: 600;
color: #358E9D;
text-transform: uppercase;
padding: 10px 20px 20px 20px;
line-height: 70px;
}
.nav-container{position: relative;}
.nav-container svg{
position: absolute;
top:100%;
left:0;
height:20px;
z-index: 1;
}
.nav-container path{
fill:white;
}
回答
这是使用 Bootstrap 5.0 中导航栏的页面版本,中间带有用于更大显示的徽标。
更新
在我的原始答案中,我通过使用两个徽标来欺骗布局,一个用于移动设备,一个用于更大的显示器,以通过使用“justify-content-evenly”来获得四个链接周围的间距和徽标以匹配原始请求。这确实在所有项目之间以及浏览器边缘与第一个和最后一个项目之间提供了相等的空间,但它有重复的内容。
在我的更新中,我使用了一个徽标并拆分了两个导航栏折叠列表之间的链接。将链接拆分为两个单独的导航栏折叠列表,为大屏幕上的徽标提供了一个位于中间的位置。我order: 2过去常常将徽标从小屏幕上导航栏的左侧移动到更宽屏幕上的中间。
使用 flex-grow-1 将两个导航栏折叠 div 设置为扩展以适应可用空间。ul导航栏折叠 div 中的列表设置为w-100和justify-content-evenly将两个链接隔开。
因为有两个导航栏折叠 div,我修改了导航栏切换按钮以使用类值data-bs-target而不是 id,并列出了两个导航栏折叠 divaria-controls="navbarContent1 navbarContent2"的 id,两个 id 之间有一个空格。
虽然最初的问题是关于让 Bootstrap 5 导航栏工作以匹配示例,但我还修改了 Green Sock 动画 (GASP) 的设置:
- 添加了用于加载、调整大小、方向以配置或重新配置喘息设置的侦听器。
- 从 innerWidth 切换到 document.documentElement.clientWidth –innerWidth 包括宽度中的滚动条,如果有滚动条,它会将 blob 向右移动。clientWidth 避免了这个问题。
- 修改了 blob 的 svg 路径——原来的有点不平衡。
const nav = document.querySelector(".navbar");
const blob = document.querySelector("svg.nav-blob");
function initiateBlob() {
gsap.set(blob, {
xPercent: -50,
x: document.documentElement.clientWidth / 2
});
}
nav.addEventListener("mousemove", function(e) {
gsap.to(blob, {
duration: 0.2,
x: e.clientX,
overwrite: 'auto'
});
});
nav.addEventListener("mouseleave", function(e) {
gsap.to(blob, {
duration: 0.1,
x: document.documentElement.clientWidth / 2,
overwrite: 'auto'
});
});
window.addEventListener('load', initiateBlob, false);
window.addEventListener('resize', initiateBlob, false);
window.addEventListener('orientationchange', initiateBlob, false);
body {
font-family: "Open Sans Condensed";
background: black;
}
h1 {
font-family: "Open Sans Condensed";
font-size: 2.2em;
font-weight: 600;
}
.logo {
max-width: 160px;
}
a.nav-link {
color: black;
text-decoration: none;
font-size: 20px;
font-family: "Roboto";
font-weight: 600;
color: #358E9D;
text-transform: uppercase;
padding: 10px 20px 20px 20px;
}
.navbar-nav .nav-link {
padding-left: 1rem;
}
svg.nav-blob {
position: absolute;
top: 100%;
left: 0;
height: 20px;
z-index: 1;
display: none;
}
svg.nav-blob path {
fill: white;
}
@media (min-width:768px) {
.sr-md-only {
position: absolute;
left: -10000px;
top: auto;
overflow: hidden;
}
a.nav-link {
line-height: 70px;
}
.nav-item {
width: 6.75rem;
text-align: center;
}
.navbar-expand-md {
justify-content: space-evenly;
}
svg.nav-blob {
display: block;
}
.card-img, .card-img-top {
border-top-left-radius: 0;
border-top-right-radius: 0;
}
}
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet"/>
<link href="https://fonts.googleapis.com/css2?family=Open+Sans+Condensed:wght@300&family=Roboto:wght@300&display=swap" rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.6.0/gsap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/js/bootstrap.bundle.min.js"></script>
<nav>
<div>
<a href="/"><img src="https://dummyimage.com/200x70/b59ab5/fff.png&text=LOGO" alt="Logo image" /></a>
<button type="button" aria-controls="navbarContent1 navbarContent2" aria-expanded="false" aria-label="Toggle navigation">
<span></span>
</button>
<div>
<ul>
<li>
<a aria-current="page" href="#">HOME</a>
</li>
<li>
<a href="#">DINE</a>
</li>
</ul>
</div>
<div>
<ul>
<li>
<a href="#">HOTELS</a>
</li>
<li>
<a href="#">CONTACT</a>
</li>
</ul>
</div>
<svg viewBox="0 0 200 20">
<path d="M0 0 C60 0 60 18 100 18 C140 18 140 0 200 0 Z"></path>
</svg>
</div>
</nav>
<div>
<div>
<div>
<div>
<img src="https://via.placeholder.com/670x395.png" alt="Placeholder image">
<div>
<h2> HEADING ONE</h2>
</div>
</div>
</div>
<div>
<div>
<img src="https://via.placeholder.com/670x395.png" alt="Placeholder image">
<div>
<h2>HEADING TWO</h2>
<p>This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
</div>
</div>
</div>
</div>
</div>
<div>
<div>
<div>
<p>Section to give height to the page.</p>
</div>
</div>
</div>
我用相同大小的占位符图像替换了原始图像。
如何处理移动菜单的单独菜单项来自另一个问题的答案:Bootstrap 4 navbar with brand center and links on the left, center and right