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

Координаты элемента или абсолютный, но двигающийся с экраном блок.
Добрый день.
У меня есть два вопроса. Один - общий, то есть зачем все это делается. Второй - конкретный. Начну с общего.

Общий
Хочу сделать форму подписки, которая бы выезжала от верхней границы браузера. При этом оно бы не выезжало как block, двигая весь сайт вниз, но и при этом двигалось вместе с раширением-сужением окна (а не стояло мертво на месте как если включить position: absolute; )

В общем не хватает мне мозгов, поэтому делают так:
<div class="subscr-leftslide" id="subscrId" >
        <noscript></div><div class="subscr-leftslide"></noscript>
        <table cellspan="0" colspan="0">
             <tr id="subscr-leftslide-Row1">
                 <td>
                    <form id="sbs" class="subscr-leftslide-form" name="sbs" action="subscr.php" method="post">
                        <input class="" name="name" type="text" onBlur="if(this.value==''){this.value='Мое имя'}" onFocus="if(this.value=='Мое имя'){this.value=''}" value="Мое имя" />
                        <input class="" name="email" type="text" onBlur="if(this.value==''){this.value='Мой e-mail'}" onFocus="if(this.value=='Мой e-mail'){this.value=''}" value="Мой e-mail" />
                    </form>
                    <a href="#" onClick="document.forms.sbs.submit();">Подписаться</a>
                 </td></tr>
             <tr id="subscr-leftslide-Row2" onClick="javascript: var t = getElemPos('subscrId'); alert(t); var e = getElem('subscrId'); if (e.style.height == '' || e.height < 120) {e.style.left=t.left+'px'; e.style.position = 'absolute'; smoothMinMax('subscrId', 10, 20, 120, 5, 0, 0, 0); ShowElementStyle('subscr-leftslide-Row1',200); }else{e.style.position = 'relative';e.style.left='0px'; smoothMinMax('subscrId', 10, 120, 25, -5, 0, 0, 0);HideElementStyle('subscr-leftslide-Row1',200);}"><td>Хочу новости!</td></tr>
        </table>       
      </div>

Вставлено сразу после <body><table><tr><td>

1. При загрузке - окно (div в котором форма заключена) позиционируется как relative. Сверху торчит ярлычок "Хочу новости". Форма display: none;
2. При нажатии - получаю координаты (вот об этом второй вопрос) div проставляю к e.style.left, делаю его position: absolute. Показываю форму display: block по таймеру(иначе форма сразу выскакивает и почему-то overflow-y: hidden не работает), так же выезжает окно посредством smoothMinMax (расширяет или сужает div по height).
3. При клики снова на "Хочу новости" - все происходит в обратном порядке: уезжает окно. По таймеру прячется форма, меняем позицию окна и стиль позиционирования.

Конкретный
Есть код получения координат:
function getElemPos(elem){
    elem = typeof elem == 'object' ? elem : document.getElementById(elem);
    var w = elem.offsetWidth;
    var h = elem.offsetHeight;
    var l = 0;
    var t = 0;
 
    while (elem){
        l += elem.offsetLeft;
        t += elem.offsetTop;
        elem = elem.offsetParent;
    }
    return {
        "left":l, 
        "top":t, 
        "width": w, 
        "height":h
    };
}

Почему-то при попытке получить координаты и присвоить какой либо переменной все ок. Но вот при попытке вызвать свойство у этой переменной left - возникает ошибка:
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /http/Header.php:78) in /http/db/config.php on line 3

Header - место где вставляется данный блок. А на 78 строке стоит include_once("Menu.php"). Где список для меню. И это вроде никак не связано с getElemPos().left; Но как только убираю доступ к свойству left - проблема исчезает, но я не могу тогда узнать координаты элемента.

Как узнать координаты элемента, если нет другого способа решения вышеописанной задачи?

Последний раз редактировалось notricky, 27.08.2012 в 14:01.
Ответить с цитированием