Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Выборка элементов querySelectorAll (https://javascript.ru/forum/events/71107-vyborka-ehlementov-queryselectorall.html)

Nlk 17.12.2017 19:18

Ребят, скажите пожалуйста почему при событии onscroll аргументы функции showPage остаются неизменными?

document.addEventListener("scroll", eventScroll);

let lastScrolled = 0;
function eventScroll() {
    const scrolled = window.pageYOffset || document.documentElement.scrollTop;
	if (scrolled < lastScrolled) {
		showPage(pageIndex - 1);
	} else {
		showPage(pageIndex + 1);
	}
	lastScrolled = scrolled;
}

let pageIndex = 0;
showPage(pageIndex);

function showPage(n) {
	const pages = document.querySelectorAll('.page');
	pages[pageIndex].classList.add("active");
}

рони 17.12.2017 19:42

Nlk,
макет сделайте минимальный

Nlk 17.12.2017 20:31

<section id="slider">
	<section class="page"></section>
	<section class="page"></section>
	<section class="page"></section>
	<section class="page"></section>
</section>

* {
	padding: 0;
	margin: 0;
	box-sizing: border-box;
}
html, body{
	min-height: 100%;
}
body {
	display: -webkit-box;
	display: -moz-box;
	display: -ms-flexbox;
	display: -webkit-flex;
	display: flex;
    flex-direction: column;
}
.page {
	-webkit-transition: opacity 1s;
	-moz-transition: opacity 1s;
	-o-transition: opacity 1s;
	transition: opacity 1s;
}
.page:nth-of-type(1) {
	background-color:red;
}
.page:nth-of-type(2) {
	background-color:green;
}
.page:nth-of-type(3) {
	background-color:yellow;
}
.page:nth-of-type(4) {
	background-color:gray;
}
.page:not(.active) {
	visibility: hidden !important;
	opacity: 0;
}


section {
	flex: 1 0 auto;
	height: 100vh;
	width: 100%;
	overflow: auto;
}

'use strict';
document.addEventListener("scroll", eventScroll);

let lastScrolled = 0;
function eventScroll() {
    const scrolled = window.pageYOffset || document.documentElement.scrollTop;
	if (scrolled < lastScrolled) {
		showPage(pageIndex - 1);
	} else {
		showPage(pageIndex + 1);
	}
	lastScrolled = scrolled;
}

let pageIndex = 0;
showPage(pageIndex);

function showPage(n) {
	const pages = document.querySelectorAll('.page');
	pages[pageIndex].classList.add("active");
}

рони 17.12.2017 21:26

Nlk,
scroll происходит несколько раз, pageIndex никак не изменется ...
возможно вы хотели что-то такое ...(код правильный, но скорее всего не то что вам нужно)
window.addEventListener("DOMContentLoaded", function() {
  document.addEventListener("scroll", eventScroll);
  var pages = document.querySelectorAll(".page");
  var lastScrolled = 0;
  function showPage() {
    [].forEach.call(pages, function(el, i) {
      i == pageIndex ? el.classList.add("active") : el.classList.remove("active");
    });
  }
  var pageIndex = 0;
  showPage();
  function eventScroll() {
    var scrolled = window.pageYOffset || document.documentElement.scrollTop;
    if (scrolled < lastScrolled) {
      --pageIndex;
    } else {
      ++pageIndex;
    }
    pageIndex < 0 && (pageIndex = 0);
    pageIndex > pages.length - 1 && (pageIndex = pages.length - 1);
    showPage();
    lastScrolled = scrolled;
  }
});

Nlk 19.12.2017 10:13

рони,
спасибо вам за хороший пример, помогло разобраться!

Nlk 19.12.2017 11:23

рони,
скажите, а скрипты которые вы даёте здесь можно использовать в своих проектах?
К примеру popup https://javascript.ru/forum/misc/553...tml#post367958

рони 19.12.2017 11:24

Nlk,
да

рони 19.12.2017 11:30

Nlk,
работа с scroll
devote,
https://javascript.ru/forum/dom-wind...tml#post312682
Malleys,
http://javascript.ru/forum/showthrea...811#post439811

Nlk 20.12.2017 14:56

рони,
спасибо за классный материал.
Столкнулся с трудностью не могу понять как реализован скролл на данном сайте без отображения полосы прокрутки..
https://html.nkdev.info/snow/home-9.html

рони 20.12.2017 15:05

Nlk,
https://alvarotrigo.com/fullPage/examples/apple.html

Nlk 20.12.2017 15:19

рони,
хотелось самому сделать, думал уже немного остаётся, лишь скролл убрать и плавные переходы. Но если вы порекомендовали библиотеку видимо там много заморочек для меня получиться?

рони 20.12.2017 15:28

Nlk,
то что вы хотите сделать, ничем не отличается от слайдера, если вы ещё не делали "свой" слайдер, начните с вертикального слайдера.

Nlk 20.12.2017 15:34

Ok. Спасибо. А касаемо отсутствующей полосы скрола, там видимо событие отлавливается иначе не по документу а по высоте слайда?

Nlk 20.12.2017 15:36

рони,
да и тот код с которым вы мне помогли ранее, это почти и есть слайдер за исключением тех нюансов которые я описал ранее со скролом.

рони 20.12.2017 15:52

Цитата:

Сообщение от Nlk
А касаемо отсутствующей полосы скрола, там видимо событие отлавливается иначе не по документу а по высоте слайда?

:-?
пример devote посмотрите внимательнее

Nlk 20.12.2017 15:57

рони,
Дело в том что он не сработал в строенном просмотре на сайте и я не обратил внимание на этот скрипт, а зря то что нужно, спасибо.

рони 20.12.2017 16:03

Цитата:

Сообщение от Nlk
не сработал в строенном

ранее было http сейчас https --- поэтому в старых примерах jquery сейчас может не загрузится, если там без s

рони 20.12.2017 16:14

Nlk,
http://www.thepetedesign.com/demos/o...roll_demo.html

Nlk 22.12.2017 14:01

рони,
Скажите пожалуйста, в чем может быть причина уязвимости данного кода, с которым вы помогли.
Дома всё прекрасно работает со всех браузеров, добавляет поочередно видимость к каждому блоку. А на работе проблемы с прокручиванием, смена слайдов происходит моментально с первого до последнего слайда. Разбирался с настройками колеса мыши ничего не помогло, пробовал с разных браузеров. Может preventDefault где нужно добавить?
window.addEventListener("DOMContentLoaded", function() {
  document.addEventListener("scroll", eventScroll);
  var pages = document.querySelectorAll(".page");
  var lastScrolled = 0;
  function showPage() {
    [].forEach.call(pages, function(el, i) {
      i == pageIndex ? el.classList.add("active") : el.classList.remove("active");
    });
  }
  var pageIndex = 0;
  showPage();
  function eventScroll() {
    var scrolled = window.pageYOffset || document.documentElement.scrollTop;
    if (scrolled < lastScrolled) {
      --pageIndex;
    } else {
      ++pageIndex;
    }
    pageIndex < 0 && (pageIndex = 0);
    pageIndex > pages.length - 1 && (pageIndex = pages.length - 1);
    showPage();
    lastScrolled = scrolled;
  }
});

Nlk 22.12.2017 14:03

К примеру, с данным примером, который приводил ранее всё работает и дома и на работе: https://html.nkdev.info/snow/home-9.html

рони 22.12.2017 14:26

Цитата:

Сообщение от Nlk
Дома всё прекрасно работает со всех браузеров,

не понимаю как он смог у вас заработать :) это было что-то вроде концепции ... которую нужно доводить до ума...
Цитата:

Сообщение от рони
scroll происходит несколько раз,

Цитата:

Сообщение от Nlk
document.addEventListener("scroll", eventScroll);

замените на
var timer;
  document.addEventListener("scroll", function() {
  window.clearInterval(timer);
  timer = window.setTimeout(eventScroll, 100)
});


может поможет.

Nlk 22.12.2017 15:26

рони,
С вашим опытом от концепции до практики тонкая грань)
Всё заработало, спасибо. Единственно что, за счёт таймера немного резковато происходит смена слайдов, в независимости от добавленного transition.

рони 22.12.2017 15:42

Nlk,
возьмите плагин и не мучайтесь.

Nlk 22.12.2017 15:53

рони,
это моя практика, я учусь за счёт этого. Помимо интересно. Спасибо что вы меня терпите и помогаете. Не хочу добавлять в свой проект плагины которые не до конца понимаю да и сложновато для меня разбирать более объёмный материал как готовые плагины.

Nlk 25.12.2017 16:31

Скажите пожалуйста, как отловить событие нижней точки элемента? В коде отметил место где делал попытки.
window.addEventListener("DOMContentLoaded", function() {
	/*document.addEventListener("scroll", eventScroll);*/
	let timer;
	document.addEventListener("scroll", function() {
		window.clearInterval(timer);
		timer = window.setTimeout(eventScroll, 100)
	});
		
	const pages = document.querySelectorAll(".page");
	let lastScrolled = 0;
		function showPage() {
		[].forEach.call(pages, function(el, i) {
			i == pageIndex ? el.classList.add("active") : el.classList.remove("active");
			// моя попытка
			let bottomPage = pages[i].getBoundingClientRect().bottom + window.pageYOffset;
			if (window.pageYOffset < bottomPage) {
				alert("hello");
				} else if (window.pageYOffset > bottomPage) {
				alert("bye");
			}
			// конец попытки
		});
	}
	let pageIndex = 0;
	
	showPage();
	function eventScroll() {
		let scrolled = window.pageYOffset || document.documentElement.scrollTop;
		if (scrolled < lastScrolled) {
			--pageIndex;
		} else {
			++pageIndex;
		}
		pageIndex < 0 && (pageIndex = 0);
		pageIndex > pages.length - 1 && (pageIndex = pages.length - 1);
		showPage();
		lastScrolled = scrolled;
	}
});


<section class="page"></section>
	<section class="page"></section>
	<section class="page"></section>
	<section class="page"></section>

Nlk 25.12.2017 16:33

Хочу пояснить, событие скрола имел в виду.

рони 25.12.2017 17:01

Nlk,
не осилил

Nlk 25.12.2017 18:19

рони,
Иногда сомнения одолевают, что застопорился и зря время трачу и в итоге ничего не получиться. И как дурачок, так долго делаю всего один скрипт.

рони 25.12.2017 18:44

Nlk,
на всякий случай.
https://javascript.ru/forum/misc/719...tml#post473403
там стрелками, но похоже вам для скролл тоже самое нужно.

Nlk 25.12.2017 18:55

рони,
спасибо, ознакомлюсь.

Nlk 26.12.2017 00:46

рони,
скажите пожалуйста, событие scrolla можно назначать не только на глобальный объект window но и на отдельный элемент страницы, к примеру к div блоку по его id? В таком случае вместо window и document используется id?
let scrolled = id.pageYOffset || id.documentElement.scrollTop;

рони 26.12.2017 01:15

Nlk,
:-? может вы об этом ?https://learn.javascript.ru/metrics#...left-scrolltop
id.scrollTop

Nlk 26.12.2017 02:15

рони,
я установил overflow-y: scroll на определённом блоке и когда прокручиваю страницу в этой области все нормально скролит, но само событие scroll не отлавливается глобально. Почему так?

рони 26.12.2017 09:53

Nlk,
не могу прокомментировать, может кто-то другой напишет

Nlk 27.12.2017 03:25

рони,
а не могли бы касаемо предыдущего скрипта подсказать, обнаружил уязвимость при быстром прокручивании страницы ловит ближайшее событие а дальше уже скролл заканчивается. Не сталкивались с подобным?

рони 27.12.2017 09:02

Nlk,
Цитата:

Сообщение от рони
не могу прокомментировать

лучше ответа пока, не придумал. :)

Nlk 27.12.2017 10:16

рони,
вы мне и так очень здорово помогли, спасибо.

Nexus 27.12.2017 10:41

Цитата:

Сообщение от Nlk
рони,
скажите пожалуйста, событие scrolla можно назначать не только на глобальный объект window но и на отдельный элемент страницы, к примеру к div блоку по его id? В таком случае вместо window и document используется id?

Не знаю верно ли вас понял, но:
https://jsfiddle.net/xu9swjj6/

P.S. Возможно в примере я неправильно определяю высоту и отступ от верхнего края.

Nlk 27.12.2017 13:52

Nexus,
Всё по полочкам, и с примером, спасибо большущее!
Скажите пожалуйста, а можно ограничить перемещение скрола на определённый интервал. К примеру, ограничить всю длину сайта до 4 перемещений скрола в независимости от длины конкретного скрола.

Nexus 27.12.2017 13:55

Nlk, не понял вопроса.


Часовой пояс GMT +3, время: 01:12.