#javascript #html #jquery #css
#javascript #HTML #jquery #css
Вопрос:
Вот что я пытаюсь сделать:
В position:sticky div есть прямоугольник (id = mysquare). После небольшой прокрутки ширина mysquare должна уменьшиться с помощью анимации jquery. Затем, при прокрутке назад, mysquare должен мгновенно вернуться к своей первоначальной ширине.
Проблема:
Бит анимации работает нормально. Что не работает, так это возврат к исходной ширине mysquare. При прокрутке назад после того, как mysquare уменьшится до 100 пикселей, он останется прежним (хотя теоретически он должен вернуться к 150 пикселям).
var headheight = $(".myheading").height();
$(function() {
$(window).scroll(function() {
if ($(this).scrollTop() > headheight) {
//if scrolled past myheading
//Gradually change the width of the square to 100px, from 150px
$("#mysquare").animate({
width: "100px",
}, 1500);
}
if ($(this).scrollTop() < headheight) {
//If not scrolled past myheading
//Keep the square big
$("#mysquare").width("150px");
}
})
});
div.sticky {
position: -webkit-sticky;
position: sticky;
top: 0;
background-color: yellow;
padding: 10px;
font-size: 20px;
}
#mysquare {
height: 50px;
background-color: #555;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>
<div class="myheading" style="height: 50px;"></div>
<div class="sticky">Hello
<div id="mysquare" style="width 150px;">
</div>
</div>
<main style="height:500px;"></main>
</body>
</html>
JSFiddle: https://jsfiddle.net/82n16x07/7 /
Кстати, mysquare, похоже, занимает всю ширину экрана при первой загрузке. Любая помощь в этом также будет оценена.
Комментарии:
1. Почему бы не использовать IntersectionObserver для этого? Проверьте, отображается ли ваш заголовок или нет, а затем добавьте желаемую анимацию.
2. @cloned Я посмотрю на это, поскольку это определенно кажется более чистым. Однако, похоже, это не решает корень моей проблемы, которая связана с шириной mysquare, не возвращающейся после прокрутки назад.
Ответ №1:
после анимации вам нужно удалить элемент и заменить его, чтобы применить другой css
var headheight = $(".myheading").height();
$(function() {
$(window).scroll(function() {
if ($(this).scrollTop() > headheight) {
//if scrolled past myheading
//Gradually change the width of the square to 100px, from 150px
$("#mysquare").animate({
width: "100px",
}, 1500);
}
if ($(this).scrollTop() < headheight) {
var elm = document.getElementById('mysquare');
var newone = elm.cloneNode(true);
elm.parentNode.replaceChild(newone, elm);
//If not scrolled past myheading
//Keep the square big
$("#mysquare").width("500px");
}
})
});
div.sticky {
position: -webkit-sticky;
position: sticky;
top: 0;
background-color: yellow;
padding: 10px;
font-size: 20px;
}
#mysquare {
height: 50px;
background-color: #555;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>
<div class="myheading" style="height: 50px;"></div>
<div class="sticky">Hello
<div id="mysquare" style="width 150px;">
</div>
</div>
<main style="height:500px;"></main>
</body>
</html>
Ответ №2:
Ваша первоначальная проблема с шириной вызвана неправильной style
директивой с отсутствующим двоеточием:
<div id="mysquare" style="width 150px;">
должно быть:
<div id="mysquare" style="width: 150px;">
Основная проблема вызвана тем фактом, что animate()
функция вызывается повторно, когда условие прокрутки истинно, и эти вызовы функций накапливаются. Если вы подождете достаточно долго, они очистятся, и поле вернется к своему нормальному размеру.
Чтобы исправить это, вы можете добавить shrunk
флаг, чтобы определить, уменьшено поле или нет, и проверить этот флаг, чтобы определить, следует ли выполнять новый animate()
вызов.
var headheight = $(".myheading").height();
var shrunk=false;
$(function() {
$(window).scroll(function() {
if ($(this).scrollTop() > headheight amp;amp; !shrunk) {
//if scrolled past myheading
//Gradually change the width of the square back to the size of the new image
shrunk=true;
$("#mysquare").animate({
width: "100px",
}, 1500);
}
if ($(this).scrollTop() < headheight) {
//If not scrolled past myheading
//Keep the square big
shrunk=false;
$("#mysquare").width("150px");
}
})
});
div.sticky {
position: -webkit-sticky;
position: sticky;
top: 0;
background-color: yellow;
padding: 10px;
font-size: 20px;
}
#mysquare {
height: 50px;
width:150px;
background-color: #555;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>
<div class="myheading" style="height: 50px;"></div>
<div class="sticky">Hello
<div id="mysquare" style="width: 150px;">
</div>
</div>
<main style="height:500px;"></main>
</body>
</html>
Ответ №3:
Просто попробуйте с этим. надеюсь, это сработает для вас.
var lastScrollTop = 0;
$(window).scroll(function(event){
var thisScrolltop = $(this).scrollTop();
if (thisScrolltop > lastScrollTop){
// write code here, when down scroll
} else {
// write code here, when up scroll
}
lastScrollTop = thisScrolltop;
});