Я пытаюсь заставить веб-страницу отображать только один элемент за раз, когда элемент полностью находится в окне. Когда элемент не находится в окне, я хочу, чтобы он исчезал, а когда он полностью появляется в поле зрения, я хочу, чтобы он исчезал.
Как новичок, единственное, о чем я мог думать, когда делал это, это полностью удалить предыдущий класс и добавить противоположный, но независимо от того, как я пытался это сделать (в основном просто перемещая мои элементы[i].style.animation = 'none' или null и изменение синтаксиса операторов if.)
Мой javascript (в файле HTML):
<script>
window.onscroll=function(){fade()};
function fade(){
var elements = document.querySelectorAll('.block1,.block2');
for (var i = 0; i < elements.length; i++) {
if (elements[i].offsetTop>window.pageYOffset && elements[i].offsetTop+elements[i].clientHeight<window.pageYOffset+window.innerHeight){
elements[i].style.animation='none';
elements[i].style.animation=null;
elements[i].className+ = " pageFade";
elements[i].style.opacity = "1";
}
else{
elements[i].style.animation='none';
elements[i].style.animation=null;
elements[i].className+ = " outFade";
elements[i].style.opacity = "0";
}
}
}
</script>
Мой CSS
.pageFade{
animation:reveal 1.5s ease-in-out 1;
-webkit-animation-name:reveal 1.5s ease-out 1;
}
@keyframes reveal{
0%{opacity:0}
100%{opacity:1}
}
.outFade{
animation:unreveal 1.5s ease-in-out 1;
-webkit-animation-name:unreveal 1.5s ease-out 1;
}
@keyframes unreveal{
0%{opacity:1}
100%{opacity:0}
}
(-вебкит- исключен)
В действии только мои команды непрозрачности, мои анимации "затухания" не работают... Есть какие-нибудь советы, что мне попробовать?
Возможно, вы захотите использовать API InterSectionObserver
, чтобы проверить, видны ли элементы или нет. Лично мне с ним намного легче работать. developer.mozilla.org/en-US/docs/Web/API/…
Привет, Кэт, возможно, вы можете улучшить свой заголовок с помощью «показывать или исчезать элемент, если он полностью находится в окне просмотра» или что-то в этом роде. Это поможет понять основное требование.
<div class = "block">BLOCK 1</div>
<div class = "block">BLOCK 2</div>
<style>
.block {
width: 90px; height: 150px; background: red; margin: 6px;
transition: opacity .9s ease-in-out;
opacity: 1;
}
.fade { opacity: 0; }
</style>
<script>
function handleFade(){
// use const in a var that is never reasigned
const elements = document.querySelectorAll('.block');
// using forEach is clearer and more declarative
elements.forEach(element => {
// add a more expressive name to the conditions
const condition1 = element.offsetTop > window.pageYOffset;
const condition2 = element.offsetTop + element.clientHeight <
window.pageYOffset + window.innerHeight;
// clean your if condition
if (condition1 && condition2) element.classList.remove('fade');
else element.classList.add('fade');
});
}
// execute handleFade at the beginning in case user does not scroll.
handleFade();
// remove redundant anonymous function
window.onscroll = handleFade;
</script>
Кроме того, я рекомендую этот пост, чтобы узнать как проверить, находится ли какая-либо часть элемента за пределами области просмотра с помощью ванильного js.
Надеюсь, поможет.
Смешивание атрибутов стиля и классов CSS только запутает вещи. Сделайте все это, назначив один класс CSS в коде JS. И установите конечное состояние анимации в свойствах CSS этого класса. Во время выполнения анимация переопределяет назначенные свойства класса CSS.