Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать координаты элемента? 
:(
    Опции темы
dr.ZmeY
Дата 20.8.2004, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Политолог
****


Профиль
Группа: Участник Клуба
Сообщений: 3892
Регистрация: 26.3.2002
Где: ..::STALINGRAD::. .

Репутация: нет
Всего: 60



Сабж... Любого элемента, формы, картинки, слоя, таблицы ... разумеется обладающего ID... Т.е. кроме его ID, не известно, где на странице он раположен (а иногда и браузеры коверкают дизайн)...
Добавлено @ 01:53
Оч... нужно. Желательно код (без раницы под какой браузер, сам дальше разрулю)...
Спасибо


--------------------
PM MAIL WWW ICQ Skype   Вверх
Sardar
Дата 20.8.2004, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Так можно:
Код
function getPosition(obj) {
var x=0, y=0;
while(obj) {
   x+=obj.offsetLeft;
   y+=obj.offsetTop;
   obj=obj.offsetParent;
}
return {x: x, y:y};
}

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


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
dr.ZmeY
Дата 20.8.2004, 02:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Политолог
****


Профиль
Группа: Участник Клуба
Сообщений: 3892
Регистрация: 26.3.2002
Где: ..::STALINGRAD::. .

Репутация: нет
Всего: 60



Не а... Слои выставляются яваскриптом, подгружаемым в дизайн сайта. В зависимости от наполнености контентом эта вставка меняет своё положение на странице (в ней есть как таблицы с картинками, так и слои) и если с таблицами и картинками ничего не случится, то слои "уплывают"... вот я и хочу привязать их к конкретным элементам.


--------------------
PM MAIL WWW ICQ Skype   Вверх
Sardar
Дата 20.8.2004, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Ну по любому координаты x/y ты кодом выше получишь.
Цитата(dr @ 20.8.2004, 01:15)
вот я и хочу привязать их к конкретным элементам

Вот это не совсем понял... как привязать?


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
dr.ZmeY
Дата 22.8.2004, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Политолог
****


Профиль
Группа: Участник Клуба
Сообщений: 3892
Регистрация: 26.3.2002
Где: ..::STALINGRAD::. .

Репутация: нет
Всего: 60



Т.е. я буду вычислять координаты слоя, по полученным координатам данного элемента..
Цитата(Sardar @ 20.8.2004, 16:38)
Ну по любому координаты x/y ты кодом выше получишь.

Т.е.? на сколько выше и в каких браузерах, чтобы можно было ввести поправку на погрешность...


--------------------
PM MAIL WWW ICQ Skype   Вверх
Sardar
Дата 22.8.2004, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



dr.ZmeY по моему мы друг друга не понимаем smile.gif

В свойствах offset(Left|Top) хранится смещение обьекта относительно предка offsetParent, у предка в свою очередь тоже есть предок и т.д. Таким образом ты можешь вычислить положение любого элемента относительно другого элемента. Просматривать нужно до элемента HTML. Узнать на каком теге мы сейчас можно через элемент.nodeName

Теперь конкретней что нужно(если еще нужно smile.gif ), по заданному обьекту узнать его слой и координаты слоя?
Код
<!-- несущий слой, промаркирован классом container -->
<div class="container"><table><tr><td id="test">Hoi</td></tr></table></div>
<script language="Javascript" type="text/javascript">
<!--
//функция возвращает несущий слой и его координаты по заданному элементу
function getPlatf(obj) {
while(obj&&!(obj.nodeName=="DIV"&&obj.className=="container")) obj=obj.parentElement;
if(!obj) return null;
var x=0, y=0, tg=obj;
while(obj) {
  x+=obj.offsetLeft;
  y+=obj.offsetTop;
  obj=obj.offsetParent;
}
// возвращаем обьект в полях которого: target - несущий слой, x/y - координаты
return {target: tg, x: x, y:y};
}
var r=getPlatf(document.getElementById("test")); //вычислим для ячейки таблицы
alert(r.target.nodeName+", "+r.x+", "+r.y);
//-->
</script>



--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Иль
Дата 10.7.2005, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



Эх, жаль нет в ИЕ у элементов свойств .x и .y как в Gecko, с координатами относительно HTML. Ну да ладно. Спасибо за код, Sardar, задействую его под ИЕ, а то уж хотел события генерить, чтоб получить координаты. Я сначала тоже мыслил в направлении твоего решения, но потом здался, как заметил некую путаницу в размерах, а видать надо offsetParent применять было. Как раз про него я и не знал. Ну а репа, а репа потом, сегодня уже репил smile


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Sardar
Дата 10.7.2005, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата
как заметил некую путаницу в размерах, а видать надо offsetParent применять было.

Я точно не помню, но по моему offsetParent был придуман до CSS'овского box model. Поле указывает напервый внешний блочный элемент с релативной позицией, от которого отсчитываються координаты текущего элемента. Обычно это body.


Цитата
Ну а репа, а репа потом, сегодня уже репил smile

Пысыб большой, из-за тебя у меня репа в небеса взлетела, другим участникам сложнее будет догнать, пора бы сбросить темпы smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Иль
Дата 10.7.2005, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



Я слово дал, как сотню наберу все репы раздам, никого не забуду. Я ж не виноват, что твоих столько набралось, все по справедливости (хотя мож действительно надо было учебник почитать)
В неоплатном долгу перед тобой и Aliance. До сих пор в себя прейти не могу, как все класно получилось сделать!!!


Это сообщение отредактировал(а) Иль - 10.7.2005, 23:58


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Иль
Дата 13.7.2005, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



Минуточку, я хочу уточнить.
А что, нельзя пользоваться без offsetParent, а используя только offsetTop и все, например: .offsetTop + .perentNode.offsetTop + ... и так до body, где .perentNode=null. Вот у меня так чего-то не получалось, правда smile

Это сообщение отредактировал(а) Иль - 13.7.2005, 12:10


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Sardar
Дата 13.7.2005, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Нет нельзя, offsetParent и parentNode это два разных понятия.
parentNode это родительский элемент, то куда наша нода вложенна. offsetParent это первый элемент от которого считаються координаты. Если ты не использовал элементов на релативной позиции, то весь документ будет иметь offsetParent = body.

Идея offsetParent в том, что сдвигая элемент который для других элементов являеться offsetParent'ом, ты автоматом сдвигаешь всех. Обычно всякие менюшки вкладывают в слои с релативной позицией, дабы координаты не расчитывать, а ставить в left: 0, top:0

Считая координаты от parentNode ты должен был получать огроменные результаты smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Иль
Дата 13.7.2005, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



Цитата(Sardar @ 13.7.2005, 15:44)
сдвигая элемент который для других элементов являеться offsetParent'ом, ты автоматом сдвигаешь всех

Слушай, Sardar, это СУПЕР!!!!!!!!!!!!!
Сразу мысли забурлили в голове smile


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Иль
Дата 13.7.2005, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



Цитата(Sardar @ 13.7.2005, 15:44)
Считая координаты от parentNode ты должен был получать огроменные результаты

Ага, просто обалденные smile


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Sardar
Дата 13.7.2005, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата
Слушай, Sardar, это СУПЕР!!!!!!!!!!!!!

На этом примере думаю будет ясно как это на практике smile

Код
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
    <title>Galaxy - test</title>
<style type="text/css">
#flycont {
  position: absolute;
  width: 40%;
  height: 20%;
  border: solid 1px navy;
}

#ct {
  position: relative;
  width: 100%;
  height: 100%;
}
.shp {
 position: absolute;
 border: 1px solid navy;
 width: 20px;
 height: 20px;
}
</style>
<script type="text/javascript">
function mdown(e) {
  this.dragging=true;
  this.offX=(window.event? window.event.offsetX: e.layerX)+3;
  this.offY=(window.event? window.event.offsetY: e.layerY)+3;
  var evt=window.event? window.event: e;
  if(evt.stopPropagation) evt.stopPropagation();
  evt.cancelBubble=true;
}
function mup() {
  this.dragging=false;
  var evt=window.event? window.event: e;
  if(evt.stopPropagation) evt.stopPropagation();
  evt.cancelBubble=true;
}
function mmove(e) {
  if(!this.dragging) return false;
  var evt=window.event? window.event: e;
  var x=0, y=0, ofp=this.offsetParent;
  while(ofp!=null) {
    x+=ofp.offsetLeft;
    y+=ofp.offsetTop;
    ofp=ofp.offsetParent;
  }
  this.style.left=(document.body.scrollLeft+evt.clientX-this.offX-x)+"px";
  this.style.top=(document.body.scrollTop+evt.clientY-this.offY-y)+"px";
  if(evt.stopPropagation) evt.stopPropagation();
  evt.cancelBubble=true;
  return true;
}
function minit(o) {
  o.onmousedown=mdown;
  o.onmouseup=mup;
  o.onmousemove=mmove;
  o.onselectstart=function(){return false;};
}
</script>
</head>

<body>
<div id="flycont"><div id="ct"></div></div>
<script type="text/javascript">
<!--
minit(document.getElementById("flycont"));
var c=document.getElementById("ct");
var row=c.offsetHeight;
var cc=0, cl=0, r=false;
while((row-=25)>0) {
  cl=-20; cc++; r=true;
  while((cl+=25+(cc%2&&r? 10: 0))<c.offsetWidth-20) {
    r=false;
    var sh=document.createElement("SPAN");
    sh.className="shp";
    sh.style.left=cl+"px";
    sh.style.top=row+"px";
    sh.style.backgroundColor=((cl+cc)%2? "red": "blue");
    c.appendChild(sh);
    minit(sh);
 }
}

//-->
</script>

</body>
</html>


Хватаем мышью за любые квадратики и тащим куда угодно. Затем тащим рамочку, наблюдаем за эффектом.

Звыняюсь под Оперой скорее всего не будет работать, у всех трё типов браузеров(ИЕ, Опера, Мозилла) по разному координаты высчитываються, а Оперы под рукой нет что бы проверить и фиксить.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Иль
Дата 5.8.2005, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



Цитата(Sardar @ 13.7.2005, 19:52)
if(evt.stopPropagation) evt.stopPropagation();
  evt.cancelBubble=true;

Sardar, почему не пользуешся только cancelBubble, из-за правил хорошего тона smile ?
Добавлено @ 20:10
Цитата(Sardar @ 13.7.2005, 19:52)
function mup() {

35 строка пропустил аргумент функции e
Опять ты мне шикарную идею подкинул!!! Спасибо большое за пример
Добавлено @ 20:12
Жаль в Gecko все работает с тормазами, но это можно поправить размерами элементов


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0548 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.