Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Плавающий слой.


Автор: Al Polonski 27.12.2007, 16:33
Есть код плавающего слоя и сам слой

Код

function floatin()
{
var fv = document.getElementById("flpop1");

if ((fv.offsetTop) < (document.body.scrollTop + screen.availHeight - fv.style.height)) fv.style.top = (fv.offsetTop + Math.round((document.body.scrollTop + screen.availHeight - fv.offsetTop - 350)/20) + 1) + 'px';
if ((fv.offsetTop) > (document.body.scrollTop + screen.availHeight - fv.style.height)) fv.style.top = (fv.offsetTop - Math.round((document.body.scrollTop + screen.availHeight - fv.offsetTop)/30) - 1) + 'px';

setTimeout("floatin();", 50);
}

Код

<div id="flpop1" style="position: absolute; right: 0%; top: 100%; background-color: #fff; padding: 5px; border: 0px solid #000; width: 182px\>слой</div>


Этот слой можно объявить в коде страницы только в середине или в самом конце. Т.е. он будет вложен в другие слои и таблицы. Не спрашивайте, почему. CMS не разрешает других мест.

Между тем, нужно, чтобы слой был прибит к правому нижнему углу.

Все отлично работает в примере, где слой лежит в BODY

на сайте же он позиционируется, где придется, и скрипт не отрабатывает вообще (предположительно, из-за позиционирования)

как это можно обойти?

Добавлено через 10 минут и 41 секунду
другими словами, тег слоя может быть размещен только где-то глубоко в структуре страницы (внутри ряда таблиц и слоев), но работать он должен без привязки к ним

Автор: SelenIT 27.12.2007, 16:58
1) Плавающие слои раздражают юзера и потому зло. Современные браузеры, включая IE7, поддерживают position:fixed (чтоб слой просто стоял на месте при скроллинге), для IE6 есть неплохой http://www.artlebedev.ru/tools/technogrette/html/fixed_in_msie/ - имхо, этого достаточно и даже слишком.

2) Гарантировать работу position:absolute внутри чего-либо невозможно по определению - кто может поручиться, что среди предков не будет никого с position:relative?

3) Кто мешает вставить нужный код (кстати, это случайно не модный, но противный ползающий флешовый баннер?;) JavaScript-ом же (например, через document.body.appendChild(нечто)) в самый конец?

4) JFYI: приведенный JavaScript-код в принципе способен работать только в IE (из-за screen.availHeight - кстати, она вообще не должна волновать вебмастера, юзер не обязан раскрывать окно на весь экран) и в Quirks mode (из-за привязки к document.body).

Автор: ksnk 27.12.2007, 17:00
Лучше, видимо сменить СМС... Ну, или почитать документацию... 

В принципе, можно достать элемент из любого места, где он лежит сейчас и поместить куда надо...
Код

var x = document.getElementById('flpop1');
document.body.appendChild(x.parentNode.removeChild(x));

Примерно так...

Автор: SelenIT 27.12.2007, 17:04
ksnk, а просто document.body.appendChild(x) разве не то же самое делает? Или есть риск сбоя, лучше подстраховаться?

Автор: ksnk 27.12.2007, 17:08
SelenIT, Да, в принципе - удаляется с прежнего места оно само... привычка - почистить за собой smile

Автор: Al Polonski 27.12.2007, 17:33
C document.appendChild разобрался. спасибо

теперь осталось разобраться с тем, чтобы скрипт запускался только после полной загрузки страницы. сам скрипт в отдельном файле

SelenIT, нет, это не баннер


P.S. простите за глупые вопросы. с JS не дружу пока smile 

Автор: SelenIT 27.12.2007, 17:39
Цитата(Al Polonski @  27.12.2007,  17:33 Найти цитируемый пост)
чтобы скрипт запускался только после полной загрузки страницы

Можно посмотреть http://xpoint.ru/know-how/JavaScript/PoleznyieFunktsii#UstanovkaObrabotchikaSobyitiya. А нужный код обернуть в функцию (например, с именем appendFloatingLayer) и в конце подключаемого скрипта вызывать setGlobalOnLoad(appendFloatingLayer);

Автор: Al Polonski 28.12.2007, 11:57
Проблема частично решилась.

Но остался еще один момент

document.body.scrollTop работает на ура в простом тестовом примере. Но на реальной странице он, почему-то, всегда равен нулю. Соответственно, слой прибивается к нулевой точке и дальше не движется.

Есть ли вообще какие-то аттрибуты, показывающие смещение элемента не от начала body, а от нулевой точки экрана?

Автор: theROMANtic 22.10.2010, 13:40
Цитата

 поддерживают position:fixed (чтоб слой просто стоял на месте при скроллинге)


такой вопрос. слой1 с позицией фиксед. седующий за ним слой - слой2 отображается под слоем1
как это исправить, подскажите, пожалуйста?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)