Форум программистов, компьютерный форум, киберфорум
jQuery
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 20.08.2013
Сообщений: 11

Прокрутка на сайте. Внимание! НОВИЧОК

20.08.2013, 15:57. Показов 1941. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

Сейчас опишу, что я хочу получить, а ниже сам вопрос.

Есть страница, на который друг за другом расположены дивы высотой и шириной в 100%. Назову их слайдами.
Моя задача с помощью колесика мыши моментально менять слайд: колесико вниз открывает следующий слайд, назад - предыдущий.
Та же ситуация и с кнопками на клавиатуре: вниз\вверх.

Подскажите, как реализовать? Либо с чем ознакомиться, хотя бы дайте начальный толчок

Добавлено через 1 час 12 минут
Что скажете, если на событие колесико вниз происходит перемещение на якорь внутри слайда?
JavaScript
1
2
3
4
5
6
7
8
9
<script> 
$(window).scroll(function(event){
   var st = $(this).scrollTop();
   if (st > lastScrollTop){
       location.href = 'index.html#slide'+st
   }
   lastScrollTop = st;
});
</script>
Добавлено через 8 минут
Точнее:
JavaScript
1
2
3
4
5
6
<script> 
$(window).scroll(function(event){
   var st = $(this).scrollTop();
       location.href = 'index.html#slide'+st
});
</script>
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.08.2013, 15:57
Ответы с готовыми решениями:

Увеличение\уменьшение радиуса круга. Внимание! НОВИЧОК
Доброе время суток! Подскажите, как реализовать следующую задачу: Есть круг радиуса N, при нажатии на ссылку плавно радиус круга...

Новичок на сайте
Всем привет.В институте работаю с Delphi 7 версии.Хотел бы скачать на домашний ПК. Пытался скачать уже 2 раза и оба раза попадались...

Не работает прокрутка на сайте
При наведении на блок со свойством fixed, перестает скролиться страница, в чем ошибка? &lt;body&gt; &lt;div...

11
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
20.08.2013, 16:22
не очень удачное решение

onscroll - событие как бы многократное,
т.е. если вы даже очень аккуратно повернули колёсико всего на одно "деление",
то браузер сработает не один раз, а несколько
сколько именно раз - зависит от конкретной версии конкретного браузера

не так давно в рамках темы Медленная прокрутка связанных скролов в FireFox я создал тестовую страничку
http://codecenter.awardspace.com/test_scroll.html
и вы сами сможете убедиться, что в разных браузерах onscroll работает по-разному

итоговый совет: откажитесь от этой вашей идеи, иначе погрязнете в выработке универсального кроссбраузерного решения, но так его и не найдёте
0
0 / 0 / 0
Регистрация: 20.08.2013
Сообщений: 11
20.08.2013, 17:15  [ТС]
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<script type="text/javascript">
function addEvent(elm, evType, fn, useCapture) {
        if (elm.addEventListener) {
                elm.addEventListener(evType, fn, useCapture);
        return true;
        }
        else if (elm.attachEvent) {
                var r = elm.attachEvent('on' + evType, fn);
                return r;
        }
        else {
                elm['on' + evType] = fn;
        }
}
 
function wheel(event){
    var delta = 0;
    if (!event) event = window.event; // Событие IE.
    // Установим кроссбраузерную delta
    if (event.wheelDelta) {
        // IE, Opera, safari, chrome - кратность дельта равна 120
        delta = event.wheelDelta/120;
    } else if (event.detail) {
        // Mozilla, кратность дельта равна 3
        delta = -event.detail/3;
    }
    if (delta) {
        // Отменим текущее событие - событие поумолчанию (скролинг окна).
        if (event.preventDefault) {
            event.preventDefault();
        }
        event.returnValue = false; // для IE
 
        // если дельта больше 0, то колесо крутят вверх, иначе вниз
        if (delta < 0) {
location.href = 'index 3.html#slide7' }
    else {
location.href = 'index 3.html#slide5' }
        
    }
}
 
addEvent(window, 'mousewheel', wheel);
addEvent(window, 'DOMMouseScroll', wheel);
</script>
а если так?)

Но у меня все равно не работает.

Добавлено через 31 минуту
Точнее верхний код работает, но не могу доделать.
Куки использовать?

Добавлено через 14 минут
Не понимаю, что не так о_О
в боди онлоад завожу куки со значением 1, а затем при прокрутке колесика считываю куки и в зависимости от значения перехожу по якорю.

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
function setCookie(name,value,min) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (min*60*1000));
        var expires = "; expires=" + date.toGMTString();
    }
    else var expires = "";
    document.cookie = name + "=" + escape(value) + expires + "; path=/";
}
 
 
function readCookie(cookieName) {
    var re = new RegExp('[; ]'+cookieName+'=([^\\s;]*)');
    var sMatch = (' '+document.cookie).match(re);
    if (cookieName && sMatch) return unescape(sMatch[1]);
}
 
 
function addEvent(elm, evType, fn, useCapture) {
        if (elm.addEventListener) {
                elm.addEventListener(evType, fn, useCapture);
        return true;
        }
        else if (elm.attachEvent) {
                var r = elm.attachEvent('on' + evType, fn);
                return r;
        }
        else {
                elm['on' + evType] = fn;
        }
}
 
function wheel(event){
    var delta = 0, lastS;
    lastS = ReadCookie("slide")
    if (!event) event = window.event; // Событие IE.
    // Установим кроссбраузерную delta
    if (event.wheelDelta) {
        // IE, Opera, safari, chrome - кратность дельта равна 120
        delta = event.wheelDelta/120;
    } else if (event.detail) {
        // Mozilla, кратность дельта равна 3
        delta = -event.detail/3;
    }
    if (delta) {
        // Отменим текущее событие - событие поумолчанию (скролинг окна).
        if (event.preventDefault) {
            event.preventDefault();
        }
        event.returnValue = false; // для IE
 
        // если дельта больше 0, то колесо крутят вверх, иначе вниз
        if (delta < 0) {
lastS = lastS+1
location.href = 'index 3.html#slide'+lastS }
    else {
if (lastS>1) {
lastS = lastS-1
location.href = 'index 3.html#slide'+lastS }
}    
SetCookie("slide",lastS}    
    }
}
 
addEvent(window, 'mousewheel', wheel);
addEvent(window, 'DOMMouseScroll', wheel);
</script>
 
  </head>
  <body onload="SetCookie(slide,1,10)">
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
20.08.2013, 17:55
куки нужны, чтобы сохранить какое-то значение на компе пользователя
и когда пользователь в следующий раз (через минуту, через час, через день, через неделю, через месяц...) зайдёт на эту страницу (или на другую страницу этого же сайта), то это сохранённое значение можно из кук прочитать

здесь же вы прокручиваете одну страницу, не уходя с неё...
зачем здесь куки?
0
Эксперт JSЭксперт HTML/CSS
2436 / 1115 / 312
Регистрация: 23.06.2011
Сообщений: 3,529
20.08.2013, 21:54
Увидеть бы html и css.
А идея простая, нужно флаг использовать с таймером.
Крутнул колесико, флаг поднялся, запустился таймер, прошла смена слайда.
Через секунду полторы таймер сбросит флаг, можно дальше крутить.
В теории вроде как работает.
0
0 / 0 / 0
Регистрация: 20.08.2013
Сообщений: 11
21.08.2013, 11:19  [ТС]
Вот скелет:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<html>
  <head>
  <style>
html {height: 100%; overflow: hidden; }
 body {padding: 0; margin: 0; width: 100%;
                height: 100%;
                
background: url(1.jpg) no-repeat center center; 
     -webkit-background-size: 100%; 
     -moz-background-size: 100%; 
     -o-background-size: 100%; 
     background-size: 100%; 
     -webkit-background-size: cover; 
     -moz-background-size: cover; 
     -o-background-size: cover; 
     background-size: cover;  }
  
  .slide1 {width: 100%; height: 100%; }
  .slide2 {width: 100%; height: 100%; background: red; }
  .slide3 {width: 100%; height: 100%; background: green; }
  .slide4 {width: 100%; height: 100%; background: blue; }
  .slide5 {width: 100%; height: 100%; background: orange; }
  .slide6 {width: 100%; height: 100%; background: gray; }
  .slide7 {width: 100%; height: 100%; background: yellow; }
  </style>
 
  </head>
  <body>
  <div class="slide1"><a name="slide1"></a></div>
  <div class="slide2"><a name="slide2"></a></div>
  <div class="slide3"><a name="slide3"></a></div>
  <div class="slide4"><a name="slide4"></a></div>
  <div class="slide5"><a name="slide5"></a></div>
  <div class="slide6"><a name="slide6"></a></div>
  <div class="slide7"><a name="slide7"></a></div>
  </body>
</html>
Цитата Сообщение от newJS Посмотреть сообщение
А идея простая, нужно флаг использовать с таймером.
Крутнул колесико, флаг поднялся, запустился таймер, прошла смена слайда.
Через секунду полторы таймер сбросит флаг, можно дальше крутить.
А как реализовать? Что использовать?
0
Эксперт JSЭксперт HTML/CSS
2436 / 1115 / 312
Регистрация: 23.06.2011
Сообщений: 3,529
22.08.2013, 11:04
как всегда, теория разошлась с практикой
пока такой вариант, работает в ие8, гугл, iron, лиса, опера
щас бы просто прицелиЦа откуда ноги растут, а потом до ума доводить
Кликните здесь для просмотра всего текста
CSS
1
2
3
4
5
6
7
8
9
10
11
12
#winSize {position:fixed; bottom:0; right:0; visibility:hidden;}
#winSize {width:1px; height:1px; background:red;}
 
.slide1 {background:pink;}
.slide2 {background:red;}
.slide3 {background:green;}
.slide4 {background:blue;}
.slide5 {background:orange;}
.slide6 {background:gray;}
.slide7 {background:yellow;}
 
#mnb { position:fixed; top:20px; left:20px; font-size:33px;}
HTML5
1
2
3
4
5
6
7
8
9
10
11
<div id="myBody">
<div class="slide1"></div>
<div class="slide2"></div>
<div class="slide3"></div>
<div class="slide4"></div>
<div class="slide5"></div>
<div class="slide6"></div>
<div class="slide7"></div>
</div>
<div id="winSize"></div>
<div id="mnb">0</div>
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
(function(){
var Q, d;
Q={};
d=document;
 
onload=function(){
init();
 
 };
 
function init(){
var el=d.getElementById("myBody")
if(el.attachEvent){
el.attachEvent("onmousewheel", mWheel);}
else{
el.addEventListener("DOMMouseScroll", mWheel, false);
el.addEventListener("mousewheel", mWheel, false);};
brake();
 
 };
 
function brake(){//иначе осел и старый гугл не успевают получить правильный top
setTimeout(function(){
var m, k;
Q.h=d.getElementById("winSize").offsetTop;
m=d.getElementsByTagName("div");
Q.m=[];
k=m.length;
while(k--){
if(m[k].className.indexOf("slide")==0){
m[k].style.height=Q.h+'px';
Q.m.push(m[k]);}}}, 111);
 };
 
function mWheel(ev){//крутим колёсико
ev=ev?ev:event;
var sc, wD=ev.detail?ev.detail*-1:ev.wheelDelta;
sc=(d.documentElement.scrollTop||d.body.scrollTop);
d.getElementById("mnb").innerHTML=uu++
if(wD>0){window.scrollBy(0, -Q.h);}
else{window.scrollBy(0, Q.h);};
if(ev.preventDefault){ev.preventDefault();};
ev.returnValue=false;
 };
var uu=0
 
 })();
1
0 / 0 / 0
Регистрация: 20.08.2013
Сообщений: 11
22.08.2013, 15:46  [ТС]
Супер, спасибо!!!
А как поставить задержку, чтобы в случае нескольких прокруток, сразу не убежать вниз?
Скажем чтобы после первого поворота колеса, определённое время, скажем 2-3 сек. не реагировала на прокрутку?
0
Эксперт JSЭксперт HTML/CSS
2436 / 1115 / 312
Регистрация: 23.06.2011
Сообщений: 3,529
23.08.2013, 07:39
это улучшенная версия, исправленная
если потянуть полосу прокрутки руками, то образовывалось смещение, здесь это ликвидировано
Кликните здесь для просмотра всего текста
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
(function(){
var Q, d;
Q={};
d=document;
 
onload=function(){
init();
 
 };
 
function init(){
var el=d.getElementById("myBody")
if(el.attachEvent){
el.attachEvent("onmousewheel", mWheel);}
else{
el.addEventListener("DOMMouseScroll", mWheel, false);
el.addEventListener("mousewheel", mWheel, false);};
//иначе осел и старый гугл не успевают получить правильный top
setTimeout(function(){
var m, k;
Q.h=d.getElementById("winSize").offsetTop+1;
m=d.getElementsByTagName("div");
Q.m=[];
k=m.length;
while(k--){
if(m[k].className.indexOf("slide")==0){m[k].style.height=Q.h+'px';}}}, 150);
 };
 
function mWheel(ev){//крутим колёсико
ev=ev?ev:event;
var n, wD=ev.detail?-ev.detail:ev.wheelDelta;
n=(d.documentElement.scrollTop||d.body.scrollTop)%Q.h;
d.getElementById("mnb").innerHTML=n
if(wD>0){window.scrollBy(0, -(n==0?Q.h:n));}
else{window.scrollBy(0, (n==0?Q.h:Q.h-n));};
if(ev.preventDefault){ev.preventDefault();};
ev.returnValue=false;
 };
 
 })();

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

Добавлено через 14 минут
с тормозом, но за полосу можно потянуть, так что это не очень хорошая идея
Кликните здесь для просмотра всего текста
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
(function(){
var Q, d;
Q={};
Q.f=true;
d=document;
 
onload=function(){
init();
 
 };
 
function init(){
var el=d.getElementById("myBody")
if(el.attachEvent){
el.attachEvent("onmousewheel", mWheel);}
else{
el.addEventListener("DOMMouseScroll", mWheel, false);
el.addEventListener("mousewheel", mWheel, false);};
//иначе осел и старый гугл не успевают получить правильный top
setTimeout(function(){
var m, k;
Q.h=d.getElementById("winSize").offsetTop+1;
m=d.getElementsByTagName("div");
Q.m=[];
k=m.length;
while(k--){
if(m[k].className.indexOf("slide")==0){m[k].style.height=Q.h+'px';}}}, 150);
 };
 
function mWheel(ev){//крутим колёсико
if(Q.f){
Q.f=false;
ev=ev?ev:event;
var n, wD=ev.detail?-ev.detail:ev.wheelDelta;
n=(d.documentElement.scrollTop||d.body.scrollTop)%Q.h;
d.getElementById("mnb").innerHTML=n
if(wD>0){window.scrollBy(0, -(n==0?Q.h:n));}
else{window.scrollBy(0, (n==0?Q.h:Q.h-n));};
setTimeout(function(){Q.f=true;}, 2222);};
if(ev.preventDefault){ev.preventDefault();};
ev.returnValue=false;
 };
 
 })();
1
0 / 0 / 0
Регистрация: 20.08.2013
Сообщений: 11
23.08.2013, 18:00  [ТС]
И снова спасибо!!!
Уменьшил задержку с 2222 до 100.
Теперь не напрягает, но и не дает за раз сразу несколько слайдов перелистнуть.
Работает на ура!

Добавлено через 6 часов 5 минут
Хм, чего-то недопонимаю все таки.

Теперь если делать паддинги внутри слайдов, либо марджины на блоки в слайдах, то сбивается прокрутка.
как раз на размер этого отступа.
Как избавиться?
0
835 / 643 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
23.08.2013, 20:07
Цитата Сообщение от indymogul Посмотреть сообщение
сбивается прокрутка
Использовать padding и box-sizing: border-box; и его же с префиксами.
0
Эксперт JSЭксперт HTML/CSS
2436 / 1115 / 312
Регистрация: 23.06.2011
Сообщений: 3,529
23.08.2013, 21:33
От этой беды всегда избавляюсь одним способом, раздачей отступов второму диву.
HTML5
1
2
3
<div class="slide1"><div class="pad">1</div></div>
<div class="slide2"><div class="pad">2</div></div>
<div class="slide3"><div class="pad">3</div></div>
CSS
1
#myBody .pad {padding:7px;}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.08.2013, 21:33
Помогаю со студенческими работами здесь

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

Не работает прокрутка на сайте
Здравствуйте, уважаемые программисты! У меня вот какая проблема: установили новую тему на сайт и по ходу, она вызывает конфликт с любым...

Нужна ли автоматическая прокрутка контента на сайте?
Думаю вот нужно ли реализовать автоматическую прокрутку контента на сайте по желанию посетителя. Лично мне не удобно читать движущийся/само...

Новичок в питоне, но не новичок в программирование
Привет всем! У меня есть много вопросов, и может кто-то сможет ответить на несколько из них. Я не новичок в программировании, так...

Параллельная вертикальная прокрутка двух блоков и отдельная горизонтальная прокрутка одного из двух блоков
Всем привет! Помогите решить проблему, пожалуйста. Есть блок div, внутри которого два блока div (в каждом из них по одной таблице),...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru