Javascript.RU

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

Как избежать мерцания div при изменении его класса функцией addClass в Chrome?
Столкнулся с проблемой, именно в google chrome. Делаю навигационную панель в шапке сайта, прилипающую к верхнему краю окна при скролле. Для этого, при помощи jquery и javascript, я изменяю class этого div элемента таким образом:
<script>
window.onscroll = function() {

	if( window.pageYOffset > 0){
	  $('#header').addClass('scrolled'); 
	}
    else {
        $('#header').removeClass('scrolled')
    }
}
</script>


#header {
	background: url("images/background.e95d2cd1e8ca.png") repeat;
	background-color: #f48831;
	height: 50px;
	position: absolute;
	width: 100%;
	font-size: 10px;
	z-index: 100;
}
#header.scrolled {
	-webkit-box-shadow: 0px 1px 0px #d67a37, 0px 2px 2px rgba(0, 0, 0, 0.1), inset 0px -1px 1px rgba(255, 255, 255, 0.2);
	-moz-box-shadow: 0px 1px 0px #d67a37, 0px 2px 2px rgba(0, 0, 0, 0.1), inset 0px -1px 1px rgba(255, 255, 255, 0.2);
	box-shadow: 0px 1px 0px #d67a37, 0px 2px 2px rgba(0, 0, 0, 0.1), inset 0px -1px 1px rgba(255, 255, 255, 0.2);
	position: fixed;

}

Но во время смены класса и перерисовки в соответствии с новыми свойствами css, происходит однократное мерцание. Как сделать чтобы этого мерцания не происходило? Нужно один в один как тут www.zopim.com, тут они как-то избежали эту проблему. Хочу именно понять, как эта проблема решается, по этому альтернативные варианты не интересны.
Примечание:
Если изначально прописать в #header свойство position: fixed; а в #header.scrolled вообще убрать этот параметр, то смена класса происходит без мерцания.

Последний раз редактировалось tweenfaster, 02.04.2014 в 04:41.
Ответить с цитированием
  #2 (permalink)  
Старый 02.04.2014, 08:05
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

О каком мерцании речь?
Событие scroll происходит после того, как страница проскроллилась.
То есть твой div сначала проскроллится немного, потом когда присвоишь класс - встанет на место. Ты об этом? Кстати в FF вроде такое не наблюдается, там чуть иначе идет обработка события.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #3 (permalink)  
Старый 02.04.2014, 10:43
Новичок на форуме
Отправить личное сообщение для tweenfaster Посмотреть профиль Найти все сообщения от tweenfaster
 
Регистрация: 02.04.2014
Сообщений: 4

Нет, я не об этом. Правильно, она встает на место как положено, но при этом происходит полная перерисовка div, панель исчезает и появляется, а не просто встает на свое место, это происходит быстро, но заметно, то-есть не гладко, как бы мерцание получается. А по идее должна просто вставать на место.В фаерфоксе все работает как надо, в той реализации, в которой я показал, а в хроме нет. Мне надо чтобы работало как в примере по ссылке, там у панели также меняется класс, но если таким скриптом менять, каким я показал, она тоже будет мерцать. Вот хочу понять как у них реализовано. Причем у них тоже, пока все скрипты не прогрузятся, при скролле панель мерцает, а после прогрузки уже все работает плавненько

Последний раз редактировалось tweenfaster, 02.04.2014 в 10:50.
Ответить с цитированием
  #4 (permalink)  
Старый 02.04.2014, 14:59
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от tweenfaster
Нет, я не об этом
Ты уверен? Поставь точку останова в обработчик scroll и ты увидишь, что страница уже проскроллилась и перерисовалась, соответственно div уехал, что и вызывает мерцание.

Честно говоря не знаю как на том сайте решили проблему. Самому интересно.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #5 (permalink)  
Старый 02.04.2014, 17:45
Новичок на форуме
Отправить личное сообщение для tweenfaster Посмотреть профиль Найти все сообщения от tweenfaster
 
Регистрация: 02.04.2014
Сообщений: 4

по моему мы друг друга не понимаем. я ссылку для чего оставил? чтобы был пример. видите как там панель работает в гугл хром? плавно, без мерцания. Вот это я и хочу получить. там все точно также происходит, после скрола меняется класс, и div получает параметр position fixed. Если я эту страничку тупо сохраняю себе на компьютер и открываю в браузере, она работает. Если я некоторые скрипты удаляю, то панель начинает мерцать. Там есть код который точно также тупо меняет класс, но есть что-то еще, что предотвращает мерцание! Как здесь http://www.zopim.com/ сделано? и почему не мерцает?

Я уже наэксперементировался, что вообще не понимаю, почему такая фигня происходит. К примеру если я такой скрипт сделаю в iframe то мерцания нет, это как объяснить?

Вот вариация еще одна http://jsfiddle.net/wS8rN/ - по ссылке все работает плавно, по тому что в iframe сайта работает. Если это все запустить в отдельной страничке, будет мерцать.

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

Сообщение от tweenfaster
по моему мы друг друга не понимаем
И вправду.
Сообщение от tweenfaster
Как здесь http://www.zopim.com/ сделано? и почему не мерцает?
Сообщение от danik.js
Честно говоря не знаю как на том сайте решили проблему. Самому интересно.

Сообщение от tweenfaster
вообще не понимаю, почему такая фигня происходит
Сообщение от danik.js
Поставь точку останова в обработчик scroll и ты увидишь, что страница уже проскроллилась и перерисовалась, соответственно div уехал, что и вызывает мерцание.
Заметь, что вопросы ты задал позже данных мной на них ответов

Вот мой тестовый пример, где как раз заметно мерцание (в хроме как минимум) по вышеозвученной причине:
<!DOCTYPE html>
<div id="sample" style="height:20px;left:0;right:0;background:red;position:absolute"></div>
<div style="height:5000px;"></div>
<script>
	document.addEventListener('scroll', function() {
		sample.style.position = window.pageYOffset === 0 ? 'absolute' : 'fixed';
	}, true);
</script>


(заодно проверим предположение о фрейме)
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #7 (permalink)  
Старый 02.04.2014, 18:04
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Да, так и есть, тут "мерцания" не наблюдается.
Читал ответы на StackOverflow, там предлагают использовать requestAnimationFrame. Но блин, на zopim.com как-то же без него сделали (вроде бы).
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #8 (permalink)  
Старый 02.04.2014, 18:27
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

В былые времена такие панельки сверху делали просто помещая весь контент в div со скролом и высотой 100%, а панельку в другой div закреплённый сверху. Никакого js, никакого мерцания...
__________________
29375, 35
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При клике ссылки, открыть DIV блок, и при клике ещё раз, закрыть его Simon Общие вопросы Javascript 59 28.05.2017 17:31
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29
Вывести на печать DIV как его видно в браузере (с учетом фона с стилей) unomomento Элементы интерфейса 4 28.12.2013 00:43
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
Закрытие прозрачного div при щелчке мыши в любой его области mav1 Элементы интерфейса 8 09.02.2011 19:25