Вызов Chrome Drag & Drop: наведите псевдокласс на окружающие элементы

В Chrome я столкнулся с очень неприятным и неожиданным поведением перетаскивания.

Проблема:

Псевдокласс класса :hover запускается и застревает в окружающих элементах, особенно в тех случаях, когда призрачный объект DragElement перекрывает его.

Шаги по воспроизведению проблемы:

  • Пример: http://plnkr.co/edit/PayXodHUtxqUZsM3T2ye , затем просмотр в отдельном окне
  • Нажмите и перетащите любое из номеров.
  • Отбросьте любой из других ящиков со своим призраком, слегка перекрывающим окружающие элементы.

Это происходит в Chrome 35, 36 и 38-бетах. Я также заметил, что это не происходит в кадре Plunker Run с редактором, но происходит в полном окне (см. Выше). Это также происходит в моем приложении node-webkit (где я обнаружил эту проблему).

То, что я пробовал до сих пор:

  • Использование -webkit-user-drag: element; на .box
  • Добавление атрибута draggable="true" для каждого элемента .box, чтобы увидеть, есть ли разница.
  • event.stopPropagation для различных элементов, включая window

Зачем ему запускать :hover для окружающих элементов? Это не имеет никакого смысла. Я собираюсь вырвать волосы!:/

Заранее благодарим всех, кто хочет помочь мне решить эту проблему.

Ответ 1

Вы рассматривали интерфейс jQuery? Я знаю, что чем меньше внешних ресурсов, тем лучше, но пользовательский интерфейс jQuery обнаруживает, когда вы перетаскиваете, а затем (как сказал "The Reveler" ), вы можете добавить класс в тело и указать

.bodyIsDragging{
   pointer-events: none
 }

Ответ 2

Можете ли вы добавить класс в свой тег html/body при перетаскивании? Если это возможно, вы можете использовать

.is-dragging * {
  pointer-events: none;
}

где .is-dragging - это класс вашего тела /html а затем переопределить элемент, который вы сейчас перетаскиваете.

Ответ 3

Это сработало для меня (уродливо):

CSS

.is-dragging {
    pointer-events: none;
}

JS: (в событии "drop" )

$('body').addClass('is-dragging');

if (event.clientY < separatorY)
    dragged.insertBefore(target);
else
    dragged.insertAfter(target);

setTimeout(function()
{
    $('body').removeClass('is-dragging');
}, 1);