【发布时间】:2018-07-09 14:31:23
【问题描述】:
背景: 我正在为一位艺术家制作一个页面,我在网站上遇到了一些有趣的行为。
我使用 flexbox 而不是 bootstrap 进行布局,因为该站点非常小并且没有大量元素。 Flexbox 非常适合对网站进行布局,尤其是针对不同媒体尺寸的更改。
然而,在最小的媒体尺寸中,移动布局,我遇到了一些麻烦。我喜欢 bootstrap 中可折叠菜单的外观,但是因为我没有使用 bootstrap,所以我从 font awesome 中获得了图标,现在我正在尝试使用 JavaScript 和 CSS 手动处理可折叠菜单属性。但是,如果不使用引导程序,我不确定为什么我的可扩展菜单仅在重复点击后才有效,而不是在第一次点击时有效。
期望: 在最小的媒体查询(窗口
问题: 这种情况会发生并切换,但只有在多次单击后才会发生。
问题: 1. 是什么导致可点击行为仅在点击几下后才起作用? 2. 为什么'none'的显示属性不能应用于'nav-left'项? 3.菜单显示时,除了使用margin来抵消出现的菜单项,有没有办法保证它们出现在汉堡按钮区域下方? (即我希望链接 1-3 在它们出现时显示在汉堡菜单下方)。
function menuToggle() {
var x = document.getElementById('nav-right');
var y = document.getElementsByClassName("nav-left");
if (x.style.display == "none") {
x.style.display = "flex";
y.style.display = "none";
} else {
x.style.display = "none";
y.style.display = "flex";
}
}
* {
margin: 0;
padding: 0;
}
html,
body {
background-color: gray;
height: 100%;
width: 100%;
}
.nav-left {
font-family: 'Kristi', cursive;
font-size: 5.5em;
color: #e319b6;
letter-spacing: 2px;
margin: 0;
padding: 0 0 0 50px;
}
.nav-left a {
text-decoration: none;
color: #e319b6;
}
.hamburger {
display: none;
}
li a {
text-decoration: none;
color: white;
}
li a:hover {
text-decoration: none;
color: #e319b6;
}
li {
padding: 50px 10px;
list-style: none;
font-family: 'Montserrat', sans-serif;
font-size: 1.7em;
font-weight: 100;
color: white;
display: inline-block;
}
@media (max-width:767px) {
.hamburger {
width: 100%;
padding: 2% 0;
display: flex;
color: white;
font-size: 2em;
justify-content: center;
background: rgba(0, 0, 0, .1);
position: absolute;
cursor: pointer;
border: none;
}
.pagenav {
width: 100%;
display: flex;
align-items: center;
flex-direction: column;
}
.nav-left {
width: 100%;
display: flex;
justify-content: center;
order: 2;
margin-top: 10%;
padding: 0;
}
#nav-right {
display: none;
justify-content: center;
width: 100%;
}
.nav {
width: 100%;
}
nav ul {
display: flex;
flex-direction: column;
width: 100%;
}
nav ul li {
display: flex;
justify-content: center;
width: 100%;
}
nav ul li {}
nav ul li:hover {
background: rgba(0, 0, 0, .8);
}
nav ul li:hover a {
color: #e319b6;
}
}
<head>
<meta charset="utf-8">
<title></title>
<!-- Font Awesome -->
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous">
</head>
<body>
<div class="pagenav">
<div class="nav-left">
placeholder
</div>
<button class="hamburger" onclick="menuToggle()">
<i class="fas fa-bars"></i>
</button>
<nav id="nav-right">
<ul>
<li><a href="reel.html">Link 1</a></li>
<li><a href="">Link 2</a></li>
<li><a href="">Link 3</a></li>
</ul>
</nav>
</div>
</body>
【问题讨论】:
-
您的脚本有一个错误:
y得到一个 HTML 集合,而不是一个元素。你可能想要y[0] -
您是否建议我改为给 div 一个“id”来定位,并将 y 目标替换为该目标“id”的 getElementById?无论出于何种原因,它似乎甚至可以针对我指定的类集合,但不是在第一次点击时。
-
chbchb55 解释了它在第一次点击时不起作用的原因,因为在函数的第一次传递中它读取
x.style.display,这等于"",而不是"none"。如果它确实等于"none",那么它将在第一遍中起作用 -
然后使用第一个索引
var y = document.getElementsByClassName("nav-left")[0];@PanayiotisSpanos 获取参考 -
@PanayiotisSpanos 关于它被分配
"none":实际上没有,但你的逻辑很好。问题是 JavaScript 在样式中修改的 DOM 元素属性默认情况下未设置为任何内容。您的逻辑是:好吧,它应该读取 CSS 值或元素显示具有的任何值。但它没有,默认情况下它没有(""),只有当你通过 JavaScript 更改它时它才有任何东西
标签: javascript css flexbox