Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Событие только для горизонтального скрола (https://javascript.ru/forum/misc/41315-sobytie-tolko-dlya-gorizontalnogo-skrola.html)

Joannes 08.09.2013 14:48

Событие только для горизонтального скрола
 
Подскажите пожалуйста как прописать условие только для горизонтального скролла?

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

P.S ВСЕМ ПОМОГАЮЩИМ ПОДНИМАЮ КАРМУ -)

ruslan_mart 08.09.2013 15:22

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Документ без названия</title>
<style type="text/css">
.scroll {
	background: #222;
	color: #DDD;
	height: 100px;
	overflow: auto;
	width: 100px;
}
</style>
</head>

<body>
<div class="scroll">
JavaScript является объектно-ориентированным языком, но используемое в языке прототипирование обуславливает отличия в работе с объектами по сравнению с традиционными класс-ориентированными языками. Кроме того, JavaScript имеет ряд свойств, присущих функциональным языкам — функции как объекты первого класса, объекты как списки, карринг, анонимные функции, замыкания — что придаёт языку дополнительную гибкость.
</div>

<script type="text/javascript">
window.onload = function() {
	var elem = document.querySelector('.scroll') || document.getElementsByClassName('scroll')[0],
		scroll = 0;
	
	elem.onscroll = function() {
		if(this.scrollLeft != scroll) {
			scroll = this.scrollLeft;
			alert('Scroll');
		}
	}
}
</script>
</body>
</html>

Joannes 08.09.2013 15:32

Отлично. То что нужно. Огромное спасибо!

Яростный Меч 08.09.2013 16:40

Цитата:

Сообщение от Ruslan_xDD
document.querySelector('.scroll') || document.getElementsByClassName('scroll')[0]

а в старом браузере это прокатит? разве не вывалит ошибку "нет функции querySelector" или типа того?

danik.js 08.09.2013 17:03

Яростный Меч, querySelector есть в таком старичке как IE8. Этого вполне достаточно для 99% сайтов.
Ruslan_xDD, назови мне браузер где есть getElementsByClassName но нету querySelector

Joannes 08.09.2013 17:12

Еще вопрос... Как прописать правильно, если позиция вертикального скролла от нижней границы меньше 100px?

ruslan_mart 08.09.2013 18:08

danik.js, ну, а вдруг :) Перестраховаться никогда не помешает. :)

Яростный Меч, точно.
document.querySelector ? document.querySelector('.scroll') : document.getElementsByClassName('scroll');


Хотя мне кажется, что document.getElementsByClassName должна работать быстрее, чем query.

ruslan_mart 08.09.2013 18:13

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Документ без названия</title>
<style type="text/css">
.scroll {
	background: #222;
	color: #DDD;
	height: 100px;
	overflow: auto;
	width: 100px;
}
</style>
</head>

<body>
<div class="scroll">
JavaScript является объектно-ориентированным языком, но используемое в языке прототипирование обуславливает отличия в работе с объектами по сравнению с традиционными класс-ориентированными языками. Кроме того, JavaScript имеет ряд свойств, присущих функциональным языкам — функции как объекты первого класса, объекты как списки, карринг, анонимные функции, замыкания — что придаёт языку дополнительную гибкость.
</div>

<script type="text/javascript">
window.onload = function() {
	var elem = document.getElementsByClassName('scroll')[0],
		scroll = 0;
	
	elem.onscroll = function() {
		if(this.scrollLeft != scroll) {
			scroll = this.scrollLeft;
			alert('Scroll');
		}
		else if(this.scrollTop > this.scrollHeight - 100) {
			alert('Scroll Bottom < 100px');
		}
	}
}
</script>
</body>
</html>

ruslan_mart 08.09.2013 18:20

Поправил код, ошибся кое-где.

danik.js 08.09.2013 18:50

Цитата:

Сообщение от Ruslan_xDD
danik.js, ну, а вдруг Перестраховаться никогда не помешает.

И это слова программиста?
Цитата:

Сообщение от Ruslan_xDD
Хотя мне кажется, что document.getElementsByClassName должна работать быстрее, чем query.

Так и есть. Но смысл в этой оптимизации абсолютно отсутствует. Разве что если ты способен воспринять задержку в долю миллисекунды.
Цитата:

Сообщение от Ruslan_xDD
Поправил код, ошибся кое-где.

Теперь он не работает в IE8, хотя я бы не стал его списывать со счетов.
И где ты берешь такие допотопные шаблоны? Доктайп полу-квиркнутый, какое то подобие XHTML, с кучей лишнего хлама (неймспейс, обязательные атрибуты, хотя их дефолтные значения очевидны донельзя), win1251 кодировка. Мне бы было стыдно это постить :)

ruslan_mart 08.09.2013 19:09

Цитата:

Сообщение от danik.js
И это слова программиста?

Я с IE не дружу, поэтому, не знаю что он там поддерживает, а что нет.

Цитата:

Сообщение от danik.js
Теперь он не работает в IE8, хотя я бы не стал его списывать со счетов.

А никто и не списывает. Я привёл простой пример, а дорабатывать его под свой сайт или себя - автору темы.

Цитата:

Сообщение от danik.js
И где ты берешь такие допотопные шаблоны?

Какая разница какой шаблон? Ты думаешь автор целиком весь шаблон к себе на сайт пихает? Возьмёт сам скрипт и не более. А насчёт шаблона - Adobe Dreamwaever сам его вставляет при создании нового документа. ;)

Цитата:

Сообщение от danik.js
Мне бы было стыдно это постить

Молодец. :)

Joannes 08.09.2013 20:11

Ruslan_xDD,
danik.js,
Ребят помогите доработать скрипт
http://upollster.ru/test/

Если я опускаю вертикальный скролл вниз то там срабатывает условие:
Если до самого низа осталось меньше 60 пикселей то к классу .bottom прибавляем количество оставшихся пикселей до конца, т.е. после того как осталось 60 рпикселей, у класса .bottom поялвяется bottom:++;

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

Попробуйте у себя так нагляднее будет...

Вот скрипт:

var $div = $(window),
    $scroll = $('#scroll'),
    $inner = $('body'),
    innerHeight = $inner.outerHeight(),
    divHeight = $div.innerHeight();

$div.scroll(function() {
    var scrollBottom = innerHeight - divHeight - $div.scrollTop();
     $scroll.val(scrollBottom + ' px');
     if (scrollBottom<=60) {
      $('.bottom').addClass('red');
      $('.bottom').css('bottom', 110 -scrollBottom);
     }else{
      $('.bottom').css('bottom', 50 );
      $('.bottom').removeClass('red');
     };
});


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