Как я могу последовательно реализовать противоречащие классы css в одной функции javascript, чтобы создать эффект постепенного появления/исчезновения на странице?

Я пытаюсь заставить веб-страницу отображать только один элемент за раз, когда элемент полностью находится в окне. Когда элемент не находится в окне, я хочу, чтобы он исчезал, а когда он полностью появляется в поле зрения, я хочу, чтобы он исчезал.

Как новичок, единственное, о чем я мог думать, когда делал это, это полностью удалить предыдущий класс и добавить противоположный, но независимо от того, как я пытался это сделать (в основном просто перемещая мои элементы[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}
}

(-вебкит- исключен)

В действии только мои команды непрозрачности, мои анимации "затухания" не работают... Есть какие-нибудь советы, что мне попробовать?

Смешивание атрибутов стиля и классов CSS только запутает вещи. Сделайте все это, назначив один класс CSS в коде JS. И установите конечное состояние анимации в свойствах CSS этого класса. Во время выполнения анимация переопределяет назначенные свойства класса CSS.

Richard 30.05.2019 08:12

Возможно, вы захотите использовать API InterSectionObserver, чтобы проверить, видны ли элементы или нет. Лично мне с ним намного легче работать. developer.mozilla.org/en-US/docs/Web/API/…

Azer 30.05.2019 09:20

Привет, Кэт, возможно, вы можете улучшить свой заголовок с помощью «показывать или исчезать элемент, если он полностью находится в окне просмотра» или что-то в этом роде. Это поможет понять основное требование.

Nico Diz 30.05.2019 15:49
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. используйте скрипт для добавления/удаления класса.
  2. Затем внутри класса поместите нужные стили.

<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.

Надеюсь, поможет.

Другие вопросы по теме