Я работаю над собственным сайтом и пока не разбираюсь в кодах. Когда я прокручиваю вниз, я хочу показать другое содержимое панели навигации, а когда я наверху, появляется оригинальная панель навигации. Я хочу, чтобы это было сделано в чистом JavaScript без каких-либо библиотек или фреймов. Пожалуйста, смотрите коды ниже, и я знаю, что коды не организованы. Я сделаю это позже.
var nav = document.querySelector("nav");
var hide = document.querySelector(".hide");
var appear = document.querySelector(".appear")
window.onscroll = function(){
if(document.body.scrollTop > 70){
hide.style.display = "block";
appear.style.display = "none"
} else {
hide.style.display = "none";
appear.style.display = "block"
}
}
nav{
list-style-type: none;
text-align: center;
background-color: #3FA9A5;
position: sticky;
top: 0;
}
.hide{
font-size: 70px;
font-family: 'Long Cang', cursive;
display: block;
}
.appear{
height: 70px;
display: none;
}
.appear img{
width: 210px;
}
ul{
margin: 0 auto;
padding: 0;
}
body{
margin: 0;
}
.container{
max-width: 1080px;
width: 95%;
margin: 10px auto;
display: grid;
grid-template-columns: 25% 50% 25%;
}
.text{
text-align: center;
}
.profile {
border: 1px solid black;
padding: 0 10px 20px 10px;
}
#main{
width: 100%;
}
.post{
margin-left: 4.165%;
}
#image{
width: 100%;
}
#post-divide{
margin-left: 10px;
margin-right: 10px;
}
.comments{
width: 100%;
margin-top: 68.5px;
padding-bottom: 293.5px;
border: 1px solid black;
}
h2{
text-align: center;
}
.center{
grid-column: 2;
}
<link rel="stylesheet" type="text/css" href="test.css">
<link href="https://fonts.googleapis.com/css?family=Indie+Flower|Long+Cang&display=swap" rel="stylesheet">
<title>test</title>
</head>
<body>
<nav>
<ul>
<li class="hide">Unknown</li>
<li class="appear"><img src="cat.png"></li>
</ul>
</nav>
<div class="container">
<div class="col-1">
<div class="profile text">
<img id="main" src="https://data.whicdn.com/images/86629641/superthumb.jpg?t=1384568664">
<hr>
<p>12 posts</p>
<p>instagram</p>
<button>Subscribe!</button>
</div>
</div>
<div class="col-1">
<div class="post">
<h2>TITLE</h2>
<div>
<img id="image" src="https://i.pinimg.com/originals/76/d4/8c/76d48cb2928845dfcfab697ac7cbcf1c.jpg">
</div>
<hr id="post-divide">
</div>
</div>
<div class="col-1">
<div class="comments text"></div>
</div>
<div class="col-1 center">
<div class="post">
<h2>TITLE</h2>
<div>
<img id="image" src="https://i.pinimg.com/originals/76/d4/8c/76d48cb2928845dfcfab697ac7cbcf1c.jpg">
</div>
<hr id="post-divide">
</div>
</div>
<div class="col-1">
<div class="comments text"></div>
</div>
</div>
Я думаю, что я должен что-то добавить в код JS, но не знаю почему. Буду благодарен, если вы посоветуете мне, как я могу написать код HTML / CSS, чтобы мне не пришлось создавать 2 панели навигации, если это возможно.
4 ответа
var hide = document.querySelector(".hide");
var appear = document.querySelector(".appear")
Таким образом, вы должны использовать селектор класса
Следующая инструкция:
document.querySelector("hide");
Будет ли запрашивать такие элементы, как:
<hide></hide>
Поскольку простые селекторы без префикса (div
, header
, span
) будут запрашивать целые теги элемента, а не классы или атрибуты.
Может быть, вы хотели запросить класс, используя .
:
document.querySelector(".hide");
Вы используете «спрятать» и «появляться» в качестве селекторов, но они не существуют в вашем HTML.
Вместо этого используйте «.hide» и «.appear» в вашем querySelector.
var hide = document.querySelector(".hide");
var appear = document.querySelector(".appear");
Поскольку обе навигационные панели имеют статические данные, я бы посоветовал оставить их обоих и следовать ответам парней, которые предложили обновить параметр querySelector. Или вы можете скрыть / показать данные внутри панели навигации (в вашем случае это всего лишь ul
элемент) и оставить всю панель навигации всегда видимой. Таким образом, вы можете поместить классы появляются / скрываются в ul
элемент вместо navbar
, а затем в JS получают их с document.querySelector('.navbar .hide')
и document.querySelector('.navbar .appear')
.
Использование framework / library определенно упростит это. Однако, если вы все еще хотите иметь только одну навигационную панель в чистом js / html / css (или это просто динамические данные), я, вероятно, сделал бы так:
Html:
<nav class="navbar">
<ul>
<li><img src="cat.png"></li>
</ul>
</nav>
Где-то в JS:
var navbarUl = document.querySelector('.navbar ul');
window.onscroll = function() {
if (document.body.scrollTop > 70) {
navbarUl.innerHtml = '';
navbarUl.appendChild(getTopNavbarHTML);
} else {
navbarUl.innerHtml = '';
navbarUl.appendChild(getNavbarHTML);
}
}
GetNavbarHTML и getTopNavbarHTML - вернут documentFragment
с элементами li
, подробнее см. https://www.w3schools.com/jsref/met_document_createdocumentfragment.asp
Но изменение DOM во время события прокрутки может значительно снизить производительность веб-приложения.
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Обратите внимание, что JavaScript — это НЕ Java. Включите все теги, относящиеся к вашему вопросу: например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [стройный] и т. д.