Управление внешним видом эффекта перетаскивания HTML5

есть ли способ контролировать внешний вид "что вы перетаскиваете" с помощью API перетаскивания HTML5?

обычно любой HTML-элемент перетаскивается, становится полупрозрачным и следует за курсором, пока вы не остановитесь / не упадете. Я хотел бы управлять этим, чтобы я мог начать перетаскивание из любого места внутри элемента, но когда вы действительно начинаете перетаскивать, я могу иметь только небольшое изображение, следующее за курсором, точно там, где курсор.

практические примеры is: список вещей для перетаскивания, каждый из которых представляет собой небольшое изображение и текст для имени вещи, которую вы будете перетаскивать в сторону. Я хотел бы иметь возможность начать перетаскивание в любом месте элемента по изображению или тексту, но тогда только изображение следует за курсором и непосредственно под курсором, а не смещается от того места, где вы начали перетаскивать его.

Я могу придумать несколько способов обмануть его (скрытый элемент, который появляется там, где вы курсор мыши, когда вы начинаете перетаскивать и что вы на самом деле перетащить), или прибегнуть к классическому перетаскиванию Javascript.

спасибо

4 ответов


Я думаю .setDragImage(element, x, y); может быть то, что вы ищете.

function handleDragStart(e) {
    var dragIcon = document.createElement('img');
    dragIcon.src = 'http://...';
    dragIcon.width = 100;
    e.dataTransfer.setDragImage(dragIcon, x, y);
}

this.addEventListener('dragstart', handleDragStart, false);

пример здесь:jsfiddle.net/cnAHv/


к сожалению, похоже, что спецификация была построена в пользу последовательного собственного поведения по сравнению с настройкой в браузере.

мы провели кучу исследований и обобщили наши выводы здесь:

https://www.inkling.com/engineering/native-html5-drag-drop/

длинный и короткий, однако, заключается в том, что использование помощника (например, jQuery UI) или прокатка вашего собственного обычно предпочтительнее, если вам нужно сделать что-нибудь сложное.

тем не менее, если вы действительно хотите использовать собственное поведение, а setDragImage () неадекватен, есть несколько альтернатив.

один особенно экстравагантный подход может включать захват рендерера для создания скриншота (!) элемента, как вы хотели бы его стилизовать, а затем вставить его через URI данных.

см.:http://cburgmer.github.io/rasterizeHTML.js/jsconfeu2013/#/step-4

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


посмотри этой часть пользовательского интерфейса jQuery. Это позволяет легко создать призрак перетаскиваемого элемента, в то время как оригинал остается в исходном месте. Вы также можете указать пользовательский "помощник" для отслеживания курсора.


по данным этот вопрос в StackOverflow мы не можем изменить стиль перетаскиваемого объекта при перетаскивании, но мы можем установить изображение перетаскивания. Это приведет к появлению изображения при перетаскивании объекта-призрака.

event.dataTransfer.setDragImage(document.getElementById('div2'),50,50);

объяснение:

on dataTransfer мы называем setDragImage() функция, в которой мы передаем идентификатор div и даем положение, где появится изображение, когда мы начнем его перетаскивать.

Посмотреть больше о dataTransfer здесь: Разработчики Mozilla-DataTransfer