За последние 24 часа нас посетили 52938 программистов и 1768 роботов. Сейчас ищут 854 программиста ...

Как узн. коорд. элем. не по отношению к родителю?

Тема в разделе "JavaScript и AJAX", создана пользователем Обычный Нуб, 10 июл 2011.

  1. Обычный Нуб

    Обычный Нуб Активный пользователь

    С нами с:
    30 июн 2011
    Сообщения:
    30
    Симпатии:
    0
    1) Есть див (d1), в нём другой див(d2) и в этом диве есть элемент (картинка допустим).
    2) Картинка имеет по отношению к (d2) значение css допустим left: 20px;
    3) (d2) движется горизонтально в (d1).

    Вопрос, как узнать координаты картинки по отношению к (d1)? Юзаю jQuery $("#...").css("left") - он выдаёт координаты к родительскому элементу, а мне нужно к родителю родителя.

    Хэлп, плисссс :(
     
  2. zebra

    zebra Активный пользователь

    С нами с:
    11 июн 2011
    Сообщения:
    16
    Симпатии:
    0
    Может такое поможет
    Код (Text):
    1.  
    2. $("#elem_id").parent().css("left");
    3.  
     
  3. Обычный Нуб

    Обычный Нуб Активный пользователь

    С нами с:
    30 июн 2011
    Сообщения:
    30
    Симпатии:
    0
    Не, эта конструкция $("#elem_id").parent() тоже что и $("#parent_elem_id").

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

    Короче изврат, и не универсально. Ну, надежда что вдруг появяться отцы и скажут таки как этого добиться "лёгким росчерком пера" пока не исчезает.
     
  4. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    $("#parent_elem_id").parent() не?
     
  5. Обычный Нуб

    Обычный Нуб Активный пользователь

    С нами с:
    30 июн 2011
    Сообщения:
    30
    Симпатии:
    0
    Не, это тоже не то. Я таким образом получаю очередного родителя. Но для меня это не проблема, все ID я итак знаю.

    Суть вопроса в общем такая. Я делаю галлерею типа: http://coffeescripter.com/code/ad-gallery/
    К сожалению из тех галлерей что я знаю у всех присутствует недостаток: нет динамического изменения размеров и пропорций. Моя галлерея будет выглядеть одинаково что на 2900х1500 что 320х200 (тока всё будет микроскопическим в последнем случае). Что ещё меня парит в галлереях - пятьсот миллиардов дивов, списков вложенных друг в друга, css на десятки строк. Бред. Я обошёлся тремя дивами и 15 строчками стилей. Короче сорри за лирику.

    И вот всё было хорошо, но я столкнулся с такой проблемой. В эту галлерею в качестве иконок в нижний див загружаются неизвестные мне изображения в неизвестном количестве. Нижний див прокручивается влево-вправо через onmousexxx. Когда остановить прокрутку вправо - выяснить до безобразия просто. А вот когда остановить прокрутку влево, как узнать что последняя фотка справа появилась на экране и прокрутку нужно заблокировать? И главное как это сделать красиво, а не наговнокодить сотни строк, надеясь что в .js этого никто не увидит?
     
  6. Вльдемар

    Вльдемар Активный пользователь

    С нами с:
    20 май 2006
    Сообщения:
    635
    Симпатии:
    0
    Адрес:
    Белхород
  7. Обычный Нуб

    Обычный Нуб Активный пользователь

    С нами с:
    30 июн 2011
    Сообщения:
    30
    Симпатии:
    0
    Пасиба.

    Как не чешутся ручки кодить а таки прийдётся основательно сесть за документацию.
     
  8. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Нужно знать длину дива и длину "окна".
    Можно посадить onload на изображения внутри этого дива и пересчитывать его длину на каждом срабатывании.
     
  9. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    ЗЫ: без кучи кодинга с такой задачей - не обойтись. У меня подобная затея вылилась в тысячу строчек JS кода.
     
  10. Обычный Нуб

    Обычный Нуб Активный пользователь

    С нами с:
    30 июн 2011
    Сообщения:
    30
    Симпатии:
    0
    Кстати насчет длины дива. Я пытался сделать её динамически раширяющейся по мере добавления фоток-тумбсов. Тогда было бы очень легко рассчитать момент остановки. Но верхний див-контейнер блокировал расположение фоток по одной линии и соответственно длина дива для тумбсов была по ширине верхнего дива-контейнера, а фотки тупо переносились вертикально. Короче я парился-парился, выставил ширину дива 9000 px. Всё стало нормально, но тут и возник вопрос когда остановить скроллинг влево.
     
  11. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Я же ответил
    >посадить onload на изображения внутри этого дива и пересчитывать его длину на каждом срабатывании

    А если ширина превьюх фиксирована - то еще проще = число превьюх на ширину + бордеры/маржины/паддинги
     
  12. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Как всё сложно. И всё от того, что не охота ещё один "лишний" контейнер положить в твой 9000-пиксельный?
    PS. .. только не div, конечно
     
  13. Обычный Нуб

    Обычный Нуб Активный пользователь

    С нами с:
    30 июн 2011
    Сообщения:
    30
    Симпатии:
    0
    А что за контейнер? Список?
     
  14. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Любой контейнер. Прописать ему стиль display:inline-block;, и по его ширине узнать, сколько пикселей занял ряд картинок.
    Потом контейнеру, у которого есть прокрутка (overflow:auto;), скриптом можно менять scrollLeft, или как ты там прокручиваешь?..

    HTML:
    1. <title>title</title>
    2. <style type="text/css">
    3. #container{
    4.     position:relative;
    5.     width:600px;
    6.     height:150px;
    7.     overflow:auto;
    8. }
    9. #listDiv{
    10.     position:relative;
    11.     width:9000px;
    12.     border:1px solid red;
    13. }
    14. #ul{
    15.     position:relative;
    16.     left:0;
    17.     top:0;
    18.     display:inline-block;
    19.     overflow:hidden;
    20.     padding:0;
    21.     border:1px solid blue;
    22. }
    23. li {
    24.     float:left;
    25.     padding-right:5px;
    26.     list-style:none outside;
    27. }
    28. </head>
    29. <div id="container">
    30. <div id="listDiv">
    31. <ul id="ul">
    32. <li><a href="http://coffeescripter.com/code/ad-gallery/images/1.jpg"><img alt="1.jpg" title="1.jpg" src="http://coffeescripter.com/code/ad-gallery/images/thumbs/t1.jpg"></a></li>
    33. <li><a href="http://coffeescripter.com/code/ad-gallery/images/10.jpg"><img alt="10.jpg" title="10.jpg" src="http://coffeescripter.com/code/ad-gallery/images/thumbs/t10.jpg"></a></li>
    34. <li><a href="http://coffeescripter.com/code/ad-gallery/images/11.jpg"><img alt="11.jpg" title="11.jpg" src="http://coffeescripter.com/code/ad-gallery/images/thumbs/t11.jpg"></a></li>
    35. <li><a href="http://coffeescripter.com/code/ad-gallery/images/12.jpg"><img alt="12.jpg" title="12.jpg" src="http://coffeescripter.com/code/ad-gallery/images/thumbs/t12.jpg"></a></li>
    36. <li><a href="http://coffeescripter.com/code/ad-gallery/images/7.jpg"><img alt="7.jpg" title="7.jpg" src="http://coffeescripter.com/code/ad-gallery/images/thumbs/t7.jpg"></a></li>
    37. <li><a href="http://coffeescripter.com/code/ad-gallery/images/8.jpg"><img alt="8.jpg" title="8.jpg" src="http://coffeescripter.com/code/ad-gallery/images/thumbs/t8.jpg"></a></li>
    38. <li><a href="http://coffeescripter.com/code/ad-gallery/images/9.jpg"><img alt="9.jpg" title="9.jpg" src="http://coffeescripter.com/code/ad-gallery/images/thumbs/t9.jpg"></a></li>
    39. </ul>
    40. </div>
    41. </div>
    42. <input type="button" value="до конца &gt;&gt;" onclick="var blockW=document.getElementById('ul').clientWidth;document.getElementById('container').scrollLeft=(blockW-600);">
    43. </body>
    44. </html>
     
  15. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Проблема в том, что ширина будет зависеть от стадии загрузки картинок. Нужно или прописывать им жестко ширину заранее, или если она неизвестна - ловить момент, когда все картинки загрузятся.
     
  16. Обычный Нуб

    Обычный Нуб Активный пользователь

    С нами с:
    30 июн 2011
    Сообщения:
    30
    Симпатии:
    0
    Сэнки всем за помощь в каком направлении копать.


    У меня две стрелки по краям превьюшeк:

    HTML:
    1. <img id="toursThumbsLeftArr" src="images/thumbsLeftArr.png" onmouseover='LetsScroll = window.setInterval("slideToursThumbs(true)", 50);' onmouseout=' window.clearInterval(LetsScroll); ' />
    2.    <img id="toursThumbsRightArr" src="images/thumbsRightArr.png" onmouseover='LetsScroll = window.setInterval("slideToursThumbs(false)", 50);' onmouseout=' window.clearInterval(LetsScroll); ' />

    А это функция которая двигает див влево-вправо:

    [js]function slideToursThumbs(moveLeft) {
    var pos=parseInt($("#thumbslider").css("left"),10);
    $("#thumbslider").css("left", (moveLeft ? pos<0 ? pos+10 : {} : pos-10)+"px");
    }[/js]
     
  17. Обычный Нуб

    Обычный Нуб Активный пользователь

    С нами с:
    30 июн 2011
    Сообщения:
    30
    Симпатии:
    0
    Сделал. Вдруг если кому будет интересно, то я использовал .offset(). Строку которую я загружаю в див с превьюшками формирует PHP скрипт. Формат такой:

    HTML:
    1. <img class="thumbsPix" onclick="showLargePix(this)" src="../Galleries/Tours/t1/thumbs/1.jpg" />
    2. <img class="thumbsPix" onclick="showLargePix(this)" src="../Galleries/Tours/t1/thumbs/2.jpg" />
    3. <img class="thumbsPix" onclick="showLargePix(this)" src="../Galleries/Tours/t1/thumbs/3.jpg" />
    4. . . . . . . . . . . . . .
    В конце скрипт добавляет невидимую никому (кроме американских спецслужб :) ) 2х2 альфа-гифку.

    HTML:
    1. <img id="StopScrollMe" class="thumbsPix" src="aboutHTML/alpha.gif" />
    а в функцию которую я привел выше добавляется строка (nr. 3), которая проверяет через оффсет если абсолютная позиция гифки не выползла в видимую область контейнера :

    [js]function slideToursThumbs(moveLeft) {
    var pos=parseInt($("#thumbslider").css("left"),10);
    if ($("#StopScrollMe").offset().left<($("#ToursScr").offset().left+$("#ToursScr").width())) pos+=10;
    $("#thumbslider").css("left", (moveLeft ? pos<0 ? pos+10 : {} : pos-10)+"px");
    }[/js]
     
  18. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Хорошая идея, молодца.
    Можно в принципе и без доп. картинки, типа ".thumbsPix:last".offset.left + ".thumbsPix:last".width, но твой вариант лучше по производительности - поиск по ID быстрее всего.