Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   onresize в Opera (https://javascript.ru/forum/events/9614-onresize-v-opera.html)

ddal.reg 27.05.2010 19:51

onresize в Opera
 
Всем здравствуйте!

Делаю блокирующий экран div с затемнением, отображающийся во время асинхронной загрузки некоторых данных на клиента.
Натолкнулся на проблему.
Opera производит вызов window.onresize, скажем так, - периодически.
Причем, период этот хорошо заметен для глаза.
Получается, что при плавном растягивании окна по высоте, div увеличивается вслед за окном заметными рывками.

В обработчике onresize пишу:

oDiv.style.height = document.body.scrollHeight;


Везде, кроме Оперы, работает хорошо - div увеличивается в высоту вместе с окном, незаметно для глаза.

Есть вариант решения - указать нереальную высоту:

oDiv.style.height = '19999px';


Такое решение не устраивает тем, что влечет к появлению вертикального скроллера.

Что не есть гуд.

Подскажите, как побороть хитрую Оперу? :)

B@rmaley.e><e 27.05.2010 21:33

А зачем Вы задаете размеры дива в пикселях? Задайте через CSS по 100% ширине и высоте.

ddal.reg 27.05.2010 21:49

В случае, когда страница со скроллером, невидимая ее часть не входит в эти 100%.
То есть, прокрутив страницу вниз, пользователь увидит незаблокированный кусок.

B@rmaley.e><e 27.05.2010 22:06

position:fixed?

ddal.reg 28.05.2010 12:12

position:absolute;

Попробовал с position:fixed и 100% высоты.
В Опере косяк остался, но субъективно - уже не так сильно выражен.
Плюс, перестало работать затемнение в IE7 :)

Стиль div-а изначально формируется так:

try{oDiv.style.MozOpacity=0.4}catch(e){}
		try{oDiv.style.KHTMLOpacity=0.4}catch(e){}
		try{oDiv.style.opacity=0.4}catch(e){}
		try{
			var oS = window.document.createStyleSheet(), oP = window.document.createStyleSheet();
			oS.media = "screen";oS.addRule('#DMASK','background-color:#CCCCCC;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=40);');
			oP.media = "print"; oP.addRule('#DMASK','display:none;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0,enabled=0);');		
		}catch(e){}
		oDiv.style.backgroundColor="#CCCCCC";
		oDiv.style.position='absolute';
//		oDiv.style.position='fixed';
		oDiv.style.top=0;
		oDiv.style.left=0;
		oDiv.style.zIndex =1000;
		oDiv.style.width="100%";
		oDiv.style.height= document.body.scrollHeight;
//		oDiv.style.height = '100%';
		oDiv.innerHTML=' ';

B@rmaley.e><e 28.05.2010 15:06

Цитата:

Сообщение от ddal.reg
Плюс, перестало работать затемнение в IE7

У осла с fixed'ом проблемы, костыль нужен.
В Вашем случае могу посоветовать попробовать setInterval. Но опера вызывает onresize с некоторой периодичность не из-за прихоти разработчиков, а в целях оптимизации. Обычно в onresize помещают перевычисление параметров и, как следствие, перерисовку.

ddal.reg 28.05.2010 17:28

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 56860)
В Вашем случае могу посоветовать попробовать setInterval.

Имеете в виду, обновлять размеры div через минимальный интервал?

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 56860)
Но опера вызывает onresize с некоторой периодичность не из-за прихоти разработчиков, а в целях оптимизации.

Да, увидев такой "эффект" так и понял. :)
Интересно, почему в других браузерах такое не применяется.

B@rmaley.e><e 28.05.2010 17:37

Цитата:

Сообщение от ddal.reg
Имеете в виду, обновлять размеры div через минимальный интервал?

Проверять, не изменились ли размеры окна, и, при необходимости, обновлять размеры дива.

B~Vladi 30.05.2010 23:29

Тут вообще нет проблемы. Пишем в стилях:
html, body {
  width:100%;
  height: 100%;
}
.background {
  position:fixed;
  width:100%;
  height: 100%;
}


При показе фона добавляем свойства для ИЕ:
html, body {
  overflow:hidden;
}
.background {
  position:absolute;
}


И, соответственно, показываем блок. При скрытии - убираем свойства.


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