Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.10.2014, 19:30
Интересующийся
Отправить личное сообщение для eucalipt Посмотреть профиль Найти все сообщения от eucalipt
 
Регистрация: 27.08.2014
Сообщений: 19

Непонятное поведение скрипта
Здравствуйте. С сегодняшнего дня я открыл для себя некоторые прелести Jquery, хотя раньше был яростным его противником. Оказалось намного удобнее.

У меня есть header (его id="header"), в этом хедере - 2 section. Левая - это лого сайта, а в правом содержатся 2 div'a, каждый из которых является кнопкой.

В чем суть проблемы: в теге body есть биъэйвиор onscroll, при котором включается функция changeHeader()
function changeHeader() {
	
	if ($(document).scrollTop() > 10) {
		
		$("#header").animate({ // Анимируем сам хедер
      lineHeight: "64px",
		 backgroundColor: "rgba(255, 255, 255, 1)"
    }, 100);
		
		$("div.logo span").animate({ // Анимируем Logo
      color: "rgba(39, 135, 164, 1)"
    }, 100);
		
		$("#header section div.sign").animate({ // Анимируем sign up
			borderColor: "#cccccc",
			color: "#999999"
    }, 100);
		
	} else {
		
		$("#header").animate({ // Анимируем сам хедер
      lineHeight: "100px",
		 backgroundColor: "rgba(255, 255, 255, 0)"
    }, 100);
		
	}
}


Как вы можете видеть из кода, при прокрутке страницы больше чем на 10, происходят некоторые изменения в стилизации элементов. Но почему-то если долго крутить страницу вниз, то изменения именно только (!) кнопок Sign Up и Sign In происходят только после окончания прокрутки. Остальные элементы меняют стиль сразу после того, как значение прокрутки становится больше 10.

А когда же мы крутим страницу вверх, и когда выполняется условие else, то есть когда значение прокрутки становится меньше 10, то, пока мы все еще кротим колесико, изменение стиля #header не происходит опять же до полной остановки прокрутки колесика.

Если при прокрутке вниз пользоваться скроллбаром, то изменения кнопок авторизации не вступят в силу, пока я не отпущу скроллбар.

Как решить эту проблему?
Ответить с цитированием
  #2 (permalink)  
Старый 14.10.2014, 20:07
Интересующийся
Отправить личное сообщение для eucalipt Посмотреть профиль Найти все сообщения от eucalipt
 
Регистрация: 27.08.2014
Сообщений: 19

Хотелось бы запустить ВСК эти анимации одновременно, что бы все сработали одновременно, сразу же после того, как значение прокрутки стало больше 10.
Ответить с цитированием
  #3 (permalink)  
Старый 14.10.2014, 20:36
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от eucalipt
открыл для себя некоторые прелести Jquery
Поздно открыл. Щас это делается тупо сменой css-класса, на что jQuery нафиг не сдалась, а анимация уже в css (css3 transitions)
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #4 (permalink)  
Старый 14.10.2014, 20:41
Интересующийся
Отправить личное сообщение для eucalipt Посмотреть профиль Найти все сообщения от eucalipt
 
Регистрация: 27.08.2014
Сообщений: 19

Но ведь вам известно решение
Но ведь вы знаете, как исправить проблему?
Ответить с цитированием
  #5 (permalink)  
Старый 14.10.2014, 20:45
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

<!DOCTYPE html><style>
.header{
    height: 80px;
    background: red;
    transition: all 0.3s;
    position: fixed;
    left: 0;
    right: 0;
}
.header.compact{
    height: 40px;
    background: blue;
}
</style>
<header class="header" id="header">

</header>

<main style="height:800px"></main>

<script>
    var header = document.getElementById('header');
    var scrolled = false;
    window.onscroll = function(e) {
        var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
        if (scrollTop > 10) {
            if (!scrolled) {
                header.className += ' compact';
                scrolled = true;
            }
        } else {
            if (scrolled) {
                header.className = header.className.replace('compact', '');
                scrolled = false;
            }
        }
    };
</script>
__________________
В личку только с интересными предложениями

Последний раз редактировалось danik.js, 14.10.2014 в 20:54.
Ответить с цитированием
  #6 (permalink)  
Старый 14.10.2014, 20:46
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Флаг scrolled добавлен для исключения лишних обращений к DOM. Это важно в обработчике onscroll. И не важно юзаешь ты jQuery или нет. Даже наоборот - с привычным бестолковым стилем кода под jQuery это втройне важно.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #7 (permalink)  
Старый 14.10.2014, 20:47
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от eucalipt
Но ведь вы знаете, как исправить проблему?
Нет, я анимации jquery уже забыл.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #8 (permalink)  
Старый 14.10.2014, 20:49
Интересующийся
Отправить личное сообщение для eucalipt Посмотреть профиль Найти все сообщения от eucalipt
 
Регистрация: 27.08.2014
Сообщений: 19

И, кстати, этого так просто не сделаешь, я уверен, что вы даже до конца тему не дочитали. У меня изменения должны происходить только при определенных значениях прокрутки, что на чистом CSS3 не сделаешь. Это вам не просто :hover, не так-то все просто здесь.
Ответить с цитированием
  #9 (permalink)  
Старый 14.10.2014, 20:51
Интересующийся
Отправить личное сообщение для eucalipt Посмотреть профиль Найти все сообщения от eucalipt
 
Регистрация: 27.08.2014
Сообщений: 19

буду разбираться, спасибо большое. Тему не закрываю пока что, можно буду обращаться к вам сюда с вопросами?
Ответить с цитированием
  #10 (permalink)  
Старый 14.10.2014, 20:55
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

eucalipt, смотри пример, жми кнопку Посмотреть. Как видишь там js-код. Никто и не говорил что без него можно обойтись.
__________________
В личку только с интересными предложениями
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Непонятное поведение - console.log Artyom Общие вопросы Javascript 19 28.11.2013 20:50
Непонятное поведение в Chrome main.c Opera, Safari и др. 3 10.10.2013 18:52
ng-repeat кастомный фильтр для фильтрации обьектов (непонятное поведение) VerDiz Angular.js 10 04.08.2013 15:42
непонятное поведение скрипта bpystep Общие вопросы Javascript 2 02.04.2012 00:48
Помогите понять поведение скрипта demoniqus Общие вопросы Javascript 3 02.03.2012 09:58