Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.09.2010, 12:29
Аспирант
Отправить личное сообщение для MikhailGirshberg Посмотреть профиль Найти все сообщения от MikhailGirshberg
 
Регистрация: 27.07.2010
Сообщений: 72

Определение "абсолютности" позиционирования
Доброго времени!

Разбирая пример, напоролся на проблему при вставке элемента subject в элемент target.

Добавление координат границ target-а (по getBoundingClientRect()) к top и left subject-а не оправдано в случае, если target имеет style.position="absolute".

Вот пример:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
  <head>
    <title>My own animation test.</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <script src="http://code.jquery.com/jquery-latest.js"></script>

    <style type="text/css">
      .indicator{
        width: inherit; height: inherit;
        background-color: gray;
        position: absolute;
      }
      .Clickable{
        margin-left: 30%;
        margin-right: 30%;
        width: 40%;
        border: 1px solid gray;
        cursor: auto;
        /*position: absolute;*/
      }
      .Removable{
        position:absolute;
        background-color: silver;
        border:1px solid aqua;
        opacity:0.5;
      }
    </style>
    <script type="text/javascript">
      var iter_count = 0;

      function getOffsetRect(elem) {
        // (1)
        var box = elem.getBoundingClientRect()

        // (2)
        var body = document.body
        var docElem = document.documentElement

        // (3)
        var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop
        var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft

        // (4)
        var clientTop = docElem.clientTop || body.clientTop || 0
        var clientLeft = docElem.clientLeft || body.clientLeft || 0

        // (5)
        var top  = box.top +  scrollTop - clientTop
        var left = box.left + scrollLeft - clientLeft

        return { top: Math.round(top), left: Math.round(left) }
      }

      $(document).ready(function(){
        $(document).click(function(event){
          event = event || window.event
          var clickedElem = event.target || event.srcElement
          if(clickedElem.className.indexOf('Clickable', 0) >= 0){

            var container = document.createElement('DIV')
            container.innerHTML='<div class="Removable"><div class="indicator"></div></div>'
            var pro = container.firstChild
            
            pro.style.zIndex = clickedElem.style.zIndex + 10;
            pro.style.height = clickedElem.clientHeight + 'px'
            pro.style.width = clickedElem.clientWidth + 'px'
            var br = getOffsetRect(clickedElem)
            pro.style.top = br.top + 'px'
            clickedElem.appendChild(pro)
            var indic = pro.firstChild
            if(pro.clientHeight > 16){
              indic.style.height = '16px'
              indic.style.top = (pro.clientHeight - 16) / 2 + 'px'
            }
            $(indic).animate({left: clickedElem.clientWidth, width:0}, 2000, null, function(){pro.parentNode.removeChild(pro)})
          }else if(clickedElem.className.indexOf('Removable', 0) >= 0){
            clickedElem.parentNode.removeChild(clickedElem)
          }else if(clickedElem.className.indexOf('indicator', 0) >= 0){
            var parent = clickedElem.parentNode
            parent.parentNode.removeChild(parent)
          }
        });

        var lastchild = $(".Clickable")[0]
        var parent = lastchild.parentNode
        while(iter_count++ < 39){
          var elem = lastchild.cloneNode(true)
          elem.innerHTML = elem.innerHTML.replace("I'm the very first!", "I have been appended later as #"+iter_count)
          if(iter_count % 3 ==0) {
            elem.style.position = 'absolute'
            elem.innerHTML = "I'm positioned absolutely! Try to click ME!"
            parent.insertBefore(elem, $(".dummy_separator")[0])
          }else parent.insertBefore(elem, lastchild);
        }
      });
    </script>
  </head>
  <body>
    <div class="dummy_separator"> 
      I'm very dummy separator... <br/>Don't click me!
    </div>
    <div class="Clickable">
      TODO: click here, I'm the very first!
    </div>
  </body>
</html>


Делов-то! Определить, значение style.position у target-а...

... но как?? ?? ?? ??
Ответить с цитированием
  #2 (permalink)  
Старый 07.09.2010, 12:42
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

Гуглите в сторону getComputedStyle
Ответить с цитированием
  #3 (permalink)  
Старый 07.09.2010, 12:45
Аспирант
Отправить личное сообщение для MikhailGirshberg Посмотреть профиль Найти все сообщения от MikhailGirshberg
 
Регистрация: 27.07.2010
Сообщений: 72

Спасибо.
Конструктивно.
Ответить с цитированием
  #4 (permalink)  
Старый 07.09.2010, 13:22
Аспирант
Отправить личное сообщение для MikhailGirshberg Посмотреть профиль Найти все сообщения от MikhailGirshberg
 
Регистрация: 27.07.2010
Сообщений: 72

Эксплорер обругал
Вот как ругается эксплорер:
Код:
Сведения об ошибке на веб-странице

Агент пользователя: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.1)
штамп времени: Tue, 7 Sep 2010 09:15:23 UTC


Сообщение: Объект не поддерживает это свойство или метод
Строка: 73
Символ: 13
Код: 0
URI-код: http://localhost/Tracking/TRASH/animationtest2.html
на вот такую конструкцию:
var my_win = window || document.documentElement
var mb_abs = my_win.getComputedStyle(clickedElem, null).getPropertyValue('position')
Ответить с цитированием
  #5 (permalink)  
Старый 07.09.2010, 13:27
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

http://javascript.ru/blog/Andrej-Par...o-currentstyle
Ответить с цитированием
  #6 (permalink)  
Старый 07.09.2010, 14:16
Аспирант
Отправить личное сообщение для MikhailGirshberg Посмотреть профиль Найти все сообщения от MikhailGirshberg
 
Регистрация: 27.07.2010
Сообщений: 72

Сообщение от Kolyaj Посмотреть сообщение
http://javascript.ru/blog/Andrej-Par...o-currentstyle
Спасибо, исчерпывает.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определение IP адреса Dekker8 Общие вопросы Javascript 29 28.03.2020 19:24
Определение версии браузера Beck Events/DOM/Window 16 15.10.2015 13:32
Определение координат мыши! sat-lin Events/DOM/Window 2 18.12.2009 11:12
Определение количества плагинов Александр 2009 Общие вопросы Javascript 19 26.03.2009 00:41
Определение ID-a AlexisMaster Events/DOM/Window 2 06.03.2009 16:27