#javascript #html #jquery #css
#javascript #HTML #jquery #css
Вопрос:
Я знаю, как показать или скрыть div. При прокрутке до раздела 2; div ‘banner’ должен быть виден в начале раздела sec2 (раздел) и скрываться, когда раздел sec2 заканчивается. Но не знаю, как проверить, закончился ли (в данном случае) ‘sec2’ . Это должно быть липким? под (липкой) панелью меню.
Это не реальный источник, а те же скрипты и настройки css. Потому что реальная страница слишком большая для публикации здесь.
$(window).scroll(function() {
var scrollTop = $(window).scrollTop();
var showbar = $('#sec2').height();
var showbar = showbar -25;
if ( scrollTop > showbar) {
$("#banner").fadeIn(700);
}else{
$("#banner").fadeOut(250);
}
});
html, body {
margin:0px;
height:100%;
width:100%;
padding:0;
scroll-behavior: smooth;
}
.container {
position: absolute;
width:100%;
min-height:100%;
height:100%;
text-align: center;
}
.wrapper{
position: relative;
width:100%;
max-width:1000px;
height:100%;
}
section {
display: block;
color:white;
height:100%;
}
#menubar{
position: -webkit-sticky;
position: sticky;
top:0px;
width:100%;
background-color:black;
height:25px;
text-align: center;
z-index:1000;
}
#menubar a {
margin:20px 20px 20px 20px;
text-decoration:none;
color:white;
font-weight:bold;
}
#menubar a:hover {
color:yellow;
}
#sec1 {
background-color:red;
}
#sec2 {
background-color:blue;
}
#sec3 {
background-color:green;
}
#banner {
display:none;
z-index:1000;
position: -webkit-sticky; /* Safari */
position: sticky;
top: 25;
height:35px;
color:black;
background-color:white;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container">
<div class="wrapper">
<div id="menubar">
<a href="#sec1">Section 1</a>
<a href="#sec2">Section 2</a>
<a href="#sec3">Section 3</a>
</div>
<div id="banner">Show this div only in section 2</div>
<section id="sec1"> bla </section>
<section id="sec2"> bla bla </section>
<section id="sec3"> bla bla bla </section>
</div>
</div>
<script>
function scrolled(o){
//visible height pixel scrolled = total height
if(o.offsetHeight o.scrollTop == o.scrollHeight){
var x = document.getElementById("#banner");
x.style.display = "block";
} else {
x.style.display = "none";
}}
</script>
Надеюсь, кто-нибудь сможет мне помочь.
Комментарии:
1. Установите для значения позиции заголовка значение sticky, а затем условно измените
display: none
в зависимости от того, где раздел 3 проходит верхний порог?
Ответ №1:
Я немного изменил структуру вашего html, обернув теги разделов в div:
<div class="sections">
<section id="sec1"> bla </section>
<section id="sec2"> bla bla </section>
<section id="sec3"> bla bla bla </section>
</div>
Это сделано для того, чтобы правило липкости работало на высоте всех разделов. И он также внес коррективы в css.
$(window).scroll(function() {
var scrollTop = $(window).scrollTop();
var showbar = $('#sec2').height();
var showbar_out = $('#sec3').height();
var showbar = showbar /*-25*/;
if ( scrollTop > showbar amp;amp; scrollTop < showbar_out) {
$("#banner").fadeIn(700);
}else{
$("#banner").fadeOut(250);
}
});
html, body {
margin:0px;
height:100%;
width:100%;
padding:0;
scroll-behavior: smooth;
}
.container {
position: absolute;
width:100%;
min-height:100%;
height:100%;
text-align: center;
}
.wrapper{
position: relative;
width:100%;
max-width:1000px;
/*height:100%;*/
}
.sections {
display: flex;
flex-direction: column;
}
section {
display: block;
color:white;
/*height:100%;*/
height: 100vh;
}
#menubar{
position: -webkit-sticky;
position: sticky;
top:0px;
width:100%;
background-color:black;
height:25px;
text-align: center;
z-index:1000;
}
#menubar a {
margin:20px 20px 20px 20px;
text-decoration:none;
color:white;
font-weight:bold;
}
#menubar a:hover {
color:yellow;
}
#sec1 {
background-color:red;
}
#sec2 {
background-color:blue;
}
#sec3 {
background-color:green;
}
#banner {
display:none;
z-index:1000;
position: -webkit-sticky; /* Safari */
position: sticky;
top: 25px;
height:35px;
color:black;
background-color:white;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container">
<div class="wrapper">
<div id="menubar">
<a href="#sec1">Section 1</a>
<a href="#sec2">Section 2</a>
<a href="#sec3">Section 3</a>
</div>
<div id="banner">Show this div only in section 2</div>
<div class="sections">
<section id="sec1"> bla </section>
<section id="sec2"> bla bla </section>
<section style="height: 200vh" id="sec3"> bla bla bla </section>
</div>
</div>
</div>
<script>
/* function scrolled(o){
//visible height pixel scrolled = total height
if(o.offsetHeight o.scrollTop == o.scrollHeight){
var x = document.getElementById("#banner");
x.style.display = "block";
} else {
x.style.display = "none";
}}*/
</script>
Комментарии:
1. Спасибо! это лучше, но все еще возникает проблема, заключающаяся в том, что баннер div не скрывается при запуске раздела 3. Но это работает при переходе к разделу 1.
2. Ах… точно. Есть такой недостаток. Я исправлю это чуть позже.
3. ты мой герой.. похоже, очень простое решение.
4. редактировать * обнаружена эта проблема .. все еще видна небольшая часть раздела 2, если вы перейдете от раздела 1 к разделу 3. * о: ( пока нет .. происходит что-то странное. Если я перехожу из раздела 1 в раздел 3. баннер отображается и начинает мигать. И когда я меняю раздел, он продолжает мигать.
5. У меня все работает хорошо. Скорее всего, мигание, о котором вы говорите, — это
fade
анимация, которая не успевает завершиться из-за задержки.
Ответ №2:
Создайте баннер внутри раздела и используйте position:fixed
для него, а с помощью трюка с обрезкой пути вы скроете его снаружи:
html,
body {
margin: 0px;
height: 100%;
width: 100%;
padding: 0;
scroll-behavior: smooth;
}
.container {
position: absolute;
width: 100%;
min-height: 100%;
height: 100%;
text-align: center;
}
.wrapper {
position: relative;
width: 100%;
max-width: 1000px;
height: 100%;
}
section {
display: block;
color: white;
height: 100%;
}
#menubar {
position: sticky;
top: 0px;
width: 100%;
background-color: black;
height: 25px;
text-align: center;
z-index: 1000;
}
#menubar a {
margin: 20px 20px 20px 20px;
text-decoration: none;
color: white;
font-weight: bold;
}
#menubar a:hover {
color: yellow;
}
#sec1 {
background-color: red;
}
#sec2 {
background-color: blue;
clip-path:inset(0); /* this will keep the banner inside sec2 */
}
#sec3 {
background-color: green;
}
#banner {
z-index: 1000;
position: fixed;
top: 25px;
height: 35px;
color: black;
background-color: white;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container">
<div class="wrapper">
<div id="menubar">
<a href="#sec1">Section 1</a>
<a href="#sec2">Section 2</a>
<a href="#sec3">Section 3</a>
</div>
<section id="sec1"> bla </section>
<section id="sec2">
<div id="banner">Show this div only in section 2</div>
bla bla </section>
<section id="sec3"> bla bla bla </section>
</div>
</div>
Комментарии:
1. Спасибо за помощь, это решение. Но ответ от Сергея Кузнецова работает именно так, как должен.