Nexus,
Допустим у меня сайта длиной 100%, мне нужно чтобы пользователь при прокручиваниии смог прокрутить весь сайт с начала до конца за 4 скрола. Может как то так, только на js window.scrollTop() + body.height() / 25 |
Цитата:
|
рони,
Извиняюсь, что ввёл в заблуждение излишней информацией. Перефразирую так, в независимости от длины моего сайта, мне нужно чтобы я его мог проскролить за четыре события скролом. Подобное можно реализовать? |
Nlk, что-то типа этого (Не довел до ума)?
https://jsfiddle.net/xu9swjj6/2/ |
Nexus,
очень помогли. Спасибо. |
Здравствуйте!
Хочу поздравить всех с наступающим Новым Годом! Скажите пожалуйста, не даёт мне покоя одно событие, почему отображение данных по координатам 'скрола' в разных браузерах отображается по разному. И как это исправить? Отлавливал 'скрол' с помощью данного выражения:
let scrolled = window.pageYOffset || document.documentElement.scrollTop;
document.getElementById('test_1').innerHTML = scrolled + 'px - Происходящий scroll';
document.getElementById('test_2').innerHTML = lastScrolled + 'px - Предыдущий scroll';
К примеру, результат при первом 'скроле' в Chrome: 100px - Происходящий scroll 0px - Предыдущий scroll ------------------------ ? К примеру, результат при первом 'скроле' в Firefox: 114px - Происходящий scroll 113px - Предыдущий scroll ---------------------- ? |
Цитата:
Цитата:
но возможно, вы не там траншею копать собрались:) |
|
Уточнение по заданному вопросу
Цитата:
Меня не смущает отсутствие стандарта по длине 'скрола' у разных браузеров. Дело в том, что к примеру в браузере Chrome при одном прокручивании страницы у меня происходит одно событие, а в Firefox за один 'скрол' целых шесть. Неплохое решение предложили вы ранее сделать просто задержку, но в последствии оказалось оно работает нестабильно. И потом, я очень понять почему так происходит. |
Цитата:
|
Nlk,
может сделать рефакторинг, вернутся к минимальному макету и сформулировать задачу по новой, возможно дверь где-то рядом. |
Цитата:
Ребята, подскажите пожалуйста. Очень долго уже ломаю голову) Проблема данного кода в том, что в некоторых браузерах, при единождом 'скроле' страницы, происходит сразу несколько событий. Поясню, в приведённом ниже коде при прокручивании страницы, должен активироваться последующийся блок кораллового цвета. Но в некоторых браузерах, при первом же 'скроле', у нас сразу активируется последний блок. По причине того, что за один 'скрол', класс .active успевает назначиться сразу всем последующим блокам, и остановиться на последнем.
<!DOCTYPE html><head><meta charset="UTF-8"><style>
body {min-height: 200vh;}
.page {height: 25vh; width: 100%; background: gray; border: 2px solid white;}
.active {background: coral;}
</style></head><body>
<section class="page"></section>
<section class="page"></section>
<section class="page"></section>
<section class="page"></section>
<script>'use strict';
window.addEventListener("DOMContentLoaded", function() {
document.addEventListener("scroll", eventScroll);
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 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;
}
});
</script></body></html>
|
Цитата:
ссылка снова на плавный скролл при нажатии на кнопки клавиатуры(вниз, вверх) |
Nlk,
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><style>
body {min-height: 200vh;}
.page {height: 25vh; width: 100%; background: gray; border: 2px solid white;}
.active {background: coral;}
</style></head><body>
<section class="page"></section>
<section class="page"></section>
<section class="page"></section>
<section class="page"></section>
<script>
window.addEventListener("DOMContentLoaded", function() {
document.addEventListener("scroll", eventScroll);
var pages = document.querySelectorAll(".page");
function showPage(pageIndex) {
[].forEach.call(pages, function(el, i) {
i === pageIndex ? el.classList.add("active") : el.classList.remove("active");
});
}
function eventScroll() {
for (var i = 0; i < pages.length; i++) {
if (0 < pages[i].getBoundingClientRect().top) {
break;
}
}
showPage(i);
}
eventScroll()
});
</script></body></html>
|
рони,
Заработало в Firefox, спасибо. Правда в Opera иногда прокручивает, но суть понятна спасибо большое, буду пробовать. |
Nlk,
if (-100 < pages[i].getBoundingClientRect().top) эксперементируйте. :) |
рони,
скажите пожалуйста, в приведённом ниже коде, помимо добавления класса к определённому элементу, можно ещё добавить другой класс к его двум соседним элементам справа и слева, используя методы nextElementSibling и previousElementSibling?
function showPage() {
[].forEach.call(pages, function(el, i) {
i == pageIndex ? el.classList.add("active") && el.nextElementSibling.classList.add("new") : el.classList.remove("active");
});
}
|
Nlk,
добавить можно, но как правильно отменить не знаю, алгоритм нужен или два цикла, первый для отмены всех классов второй для установки
function showPage() {
[].forEach.call(pages, function(el, i, p) {
el.classList.remove("active");
el.classList.remove("new");
});
[].forEach.call(pages, function(el, i, p) {
if(i == pageIndex ) {
el.classList.add("active");
el.nextElementSibling && el.nextElementSibling.classList.add("new");
el.previousElementSibling && el.previousElementSibling.classList.add("new");
/* или так
p[i-1] && p[i-1].classList.add("new");
p[i+1] && p[i+1].classList.add("new");
*/
}
});
}
|
рони,
огромное вам спасибо. Извините что так часто обращаюсь к вам за помощью. Но я снова с просьбой, когда я искал решение, касаемо уменьшения количества событий на один 'скрол' в браузере Mozilla. То натолкнулся на материал, про функцию debounce, которая не позволяет обработчику события выполниться более одного раза в заданный промежуток времени. Могу ли я проецировать это к своему коду и как? В интернете мне попался такой пример, но я не понимаю как могу его использовать:
// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds. If `immediate` is passed, trigger the function on the
// leading edge, instead of the trailing.
function debounce(func, wait, immediate) {
var timeout;
return function() {
var context = this, args = arguments;
var later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
};
// Usage
var myEfficientFn = debounce(function() {
// All the taxing stuff you do
}, 250);
window.addEventListener('resize', myEfficientFn);
|
Nlk,
var myEfficientFn = debounce(eventScroll, 250); document.addEventListener("scroll", myEfficientFn ); |
рони,
спасибо. Работает) |
Ребята, объясните пожалуйста, почему так получается что при наведении курсора на область с position:fixed и прокручивании, страница остаётся неподвижной. А при наведении курсора в любую другую область сайта при скроле всё нормально прокручивается.
|
Nlk, можно пример?
https://jsfiddle.net/uyh6exyj/ |
В коде приведённом ниже скрыт скролл страницы, это нужно оставить.
|
Nlk,
Пожалуйста, отформатируйте свой код! Для этого его можно заключить в специальные теги: js/css/html и т.п., например: [js] ... ваш код... [/js] О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting. |
Извиняюсь, поправил.
<!DOCTYPE html><html lang="ru"><head><meta charset="UTF-8"><style>
* {
padding: 0;
margin: 0;
box-sizing: border-box;
}
html, body{
min-height: 100%;
}
body{
overflow: hidden;
}
.wrap {
overflow-y: scroll;
width: calc(100% + 9px);
position: absolute;
top: 0;
bottom: 0;
right: 0;
left: 0;
}
.page {
height: 100vh;
width: 100%;
}
.active {
position: fixed;
top: 0;
height: 100px;
}
.page:nth-of-type(1) {background-color:#cccccc;}
.page:nth-of-type(2) {background-color:#afafaf;}
.page:nth-of-type(3) {background-color:#737373;}
.page:nth-of-type(4) {background-color:#404040;}
</style></head><body>
<section class="wrap">
<section class="page active"></section>
<section class="page"></section>
<section class="page"></section>
<section class="page"></section>
</section>
</body></html>
|
Альтернативное решение использовать position:sticky, правда его поддержка браузерами не так хороша.
|
Nlk, в какой ситуации потребовалось растягивать блок с контентом на весь экран и его потомка фиксировать сверху?
|
Nexus,
Full Page Slider, реализация может и своеобразная, но вопрос лишь в этом моменте. |
Nlk, не проще просто растянуть высоту обертки, отказавшись от её абсолютного позиционирования?
|
Nexus,
Буду пробовать, спасибо за совет! |
Скажите пожалуйста, а возможно с помощью js, элементу с свойством position:fixed насильно назначить другого родителя нежели viewport. Чтобы менять позиционирование не относительно окна браузера а относительно другого элемента родителя?
let parent = document.querySelector("wrap");
let child = document.querySelector("active");
parent.appendChild(child);
У меня 'ругается' что: Uncaught TypeError: Cannot read property 'appendChild' of null |
не лучше ли просто элементу задать позиционирование как :absolute? с помощью js
|
Nlk,
let parent = document.querySelector(".wrap");
let child = document.querySelector(".active");
parent.appendChild(child);
|
j0hnik,
К сожалению, свойство absolute не подходит для дальнейшей реализации кода. Dilettante_Pro, Спасибо исправил, но не смотря на это позиционирование осталось от viewport. Хочу попробовать вариант приведённый ниже, единственно не знаю как обращаться к классу active, ведь в начале загрузки страницы его нет, он добавляется впоследствии динамически по событию 'скрола'.
active && active.style.transform = "translateY("+wrap.scrollTop+"px)";
// или так
[].forEach.call(pages, function(el, i) {
if (el.classList.contains("active")) {
el.style.transform = "translateY("+wrap.scrollTop+"px)";
} else {};
|
:) можно не отвечать ... кто подскажет, что хочет сделать Nlk,?
|
рони,
:) я так понимаю, что экстрасенсов тут нет, и нужно приводить весь код. |
Цитата:
|
рони,
Каждый раз надеешься что дальше получиться завершить самому, но и за отсутствия опыта приходиться вновь и вновь обращаться за помощью. Сейчас все работает, спасибо вам, разместил по ссылке https://codecanyon.net/item/page-sli...lugin/22780197 |
Nlk,
не понимаю, видимо выпал из темы, ни оценить, ни подсказать не могу |
| Часовой пояс GMT +3, время: 05:57. |