Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.08.2015, 01:18
Профессор
Отправить личное сообщение для Decode Посмотреть профиль Найти все сообщения от Decode
 
Регистрация: 31.01.2015
Сообщений: 576

Неадекватный drag and drop
Код: http://plnkr.co/edit/kixU2t2CUlKaldDS6gAp?p=preview

Почему при mousedown супер-героев тянет влево?
Ответить с цитированием
  #2 (permalink)  
Старый 26.08.2015, 02:23
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

Decode,
если из event.pageX вычесть event.pageX будет ноль вот и скачок влево
elem.style.left = event.pageX - shiftX + 'px';
shiftX = event.pageX - getCoords(target).left;
elem.style.left = event.pageX - event.pageX - getCoords(target).left + 'px';
Ответить с цитированием
  #3 (permalink)  
Старый 26.08.2015, 02:53
Профессор
Отправить личное сообщение для Decode Посмотреть профиль Найти все сообщения от Decode
 
Регистрация: 31.01.2015
Сообщений: 576

рони, я чет не совсем понял.
// Скачала высчитывается сдвиг курсора
shiftX = event.pageX - getCoords(target).left;
// затем этот сдвиг вычитается
elem.style.left = event.pageX - shiftX + 'px';


По аналогии с этим примером: https://learn.javascript.ru/drag-and...рование
Ответить с цитированием
  #4 (permalink)  
Старый 26.08.2015, 08:55
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

Decode,
корректировка ещё добавлена влево и вверх небольшая
и -18 это размер курсора чтобы точно курсор на место клика попадал.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title></title>
    <style>
        html, body { margin: 0; padding: 0; }
        body{
          position: relative;
        }

        #field {
            background: url(https://js.cx/drag-heroes/field.png);
            width: 800px;
            height: 600px;
            float: left;
        }

        .hero {
           border: #FF0000 1px solid;
            background: url(https://js.cx/drag-heroes/heroes.png);
            width: 130px;
            height: 128px;
            float: left;
        }

        #hero1 { background-position: 0 0; }
        #hero2 { background-position: 0 -128px; }
        #hero3 { background-position: -120px 0; }
        #hero4 { background-position: -125px -128px; }
        #hero5 { background-position: -248px -128px; }
        #hero6 { background-position: -244px 0; }

        .draggable { cursor:  crosshair; }
    </style>
</head>
<body>
    <h2>Расставьте супергероев по полю.</h2>

    <p>Супергерои и мяч -- это элементы с классом "draggable". Сделайте так, чтобы их можно было переносить.</p>
    <p>Важно: если супергероя подносят к низу или верху страницы, она должна автоматически прокручиваться. Если страница помещается на вашем экране целиком и не имеет вертикальной прокрутки -- сделайте окно браузера меньше, чтобы протестировать эту возможность.</p>
    <p>Да, и ещё: супергерои ни при каких условиях не должны попасть за край экрана.</p>

    <div id="field"></div>

    <div class="hero draggable" id="hero1"></div>
    <div class="hero draggable" id="hero2"></div>
    <div class="hero draggable" id="hero3"></div>
    <div class="hero draggable" id="hero4"></div>
    <div class="hero draggable" id="hero5"></div>
    <div class="hero draggable" id="hero6"></div>

    <img src="https://js.cx/drag-heroes/ball.png" class="draggable" />

    <div style="clear:both"></div>

    <script>
        var shiftX, shiftY;

        document.onmousedown = function(event) {
            var target = event.target;
            if( !target.classList.contains('draggable') ) return;
            var mousePos = getMousePos(target, event);
            shiftX = mousePos.x ;
            shiftY = mousePos.y;
            target.style.cssFloat = 'none';
            target.style.position = 'absolute';
            moveAt(target, event)
            document.body.appendChild(target);



            document.onmousemove = function(event) {
                moveAt(target, event);
            };

            target.onmouseup = function() {
                document.onmousemove = this.onmouseup = null;
            };

            return false;

        };

        function moveAt(elem, event) {
            var left = event.pageX - shiftX;
            left <  0 && (left = 0);
            elem.style.left = left + 'px';
            var top = event.pageY - shiftY;
            top <  -18 && (top = -18);
            elem.style.top =  top + 'px';
        }

        function getMousePos(elem , event) {
        var rect = elem.getBoundingClientRect();
        return {
          x: event.clientX - rect.left,
          y: event.clientY - rect.top + 18
        };
      }
    </script>
</body>
</html>
Ответить с цитированием
  #5 (permalink)  
Старый 26.08.2015, 13:59
Профессор
Отправить личное сообщение для Decode Посмотреть профиль Найти все сообщения от Decode
 
Регистрация: 31.01.2015
Сообщений: 576

рони, спс, я разобрался. Вся проблема из-за position: absolute, перед тем как его поставить — надо найди координаты элемента на странице и выставь нужные значения left и top.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ищу Drag & drop плагин для построения плана помещения Den Brown Элементы интерфейса 0 31.07.2015 19:23
Drag and Drop Antistas jQuery 0 07.12.2012 14:41
drag & drop , html 5 cyber Events/DOM/Window 1 30.06.2012 15:16
Разбираюсь с drag and drop uaNikita Events/DOM/Window 4 22.09.2011 11:25
Drag & Drop с несколькими элементами Katz Общие вопросы Javascript 1 29.07.2011 13:01