CSS / JS, чтобы предотвратить перетаскивание призрачного изображения?


153

Есть ли способ запретить пользователю видеть призрак изображения, которое он пытается перетащить (не забота о безопасности изображений, а опыт).

Я попробовал это, что устраняет проблему с синим выделением текста и изображений, но не с призрачным изображением:

img {
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -o-user-select: none;
  user-select: none;
}

(Я также попытался вложить изображение в div с теми же правилами, что и для div). Спасибо


1
Смотрите этот ответ: stackoverflow.com/a/4211930/1060487 Вопрос возможен дублировать
Mattdlockyer

Ответы:


195

Вы можете установить draggableатрибут falseв разметку или код JavaScript.

// As a jQuery method: $('#myImage').attr('draggable', false);
document.getElementById('myImage').setAttribute('draggable', false);
<img id="myImage" src="http://placehold.it/150x150">


48
Зачем добавлять это с помощью JavaScript ??? <img id="myImage" src="http://placehold.it/150x150" draggable="false">
Грег

26
@ Грег: Почему ты меня спрашиваешь? Это ОП, который хотел решение JavaScript. Кроме того, я все равно сказал «в разметке или в коде JavaScript», так что это не значит, что вы не смогли бы сделать это в разметке, если бы у вас была возможность редактировать разметку.
BoltClock

12
Не работает в FF в сочетании с -moz-user-select: none. Возможное решение: доп pointer-events: none.
Седрик Райхенбах

9
Может быть, я неправильно истолковал вопрос, но разве ОП не спрашивает, как они могут сохранить перетаскивание и скрыть скрытое изображение? Установка draggableдля falseполностью отключить перетащить & падение.
Джеймс

1
@James: Честно говоря, это не очень понятно из вопроса. Я в основном отвечаю в предположении, что призрачное изображение является визуальным индикатором перетаскивания (что это такое), и что большинству людей, которые хотят скрыть призрачное изображение, вообще не важно, является ли перетаскивание отключен в целом.
BoltClock

87

Я думаю, что вы можете изменить свой

img {
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -o-user-select: none;
  user-select: none;
}

в

img {
  -webkit-user-drag: none;
  -khtml-user-drag: none;
  -moz-user-drag: none;
  -o-user-drag: none;
  user-drag: none;
}

3
@victorsosa Правда, но де-факто стандарт все еще остается стандартом, W3C или нет. То есть, если его поддерживает каждый браузер, это хорошо. Помните, что многие вещи W3C начинались как проприетарные, такие как AJAX.
Beejor

4
Это решение не работает в IE11 и Firefox 57.0.
Тудор Чиотлос

34

Попытайся:

img {
  pointer-events: none;
}

и стараться избегать

* {
  pointer-events: none;
}

8
Это плохое решение, так как устраняет все возможности взаимодействия с элементом. OP только просит отключить функциональность «перетаскивания» элемента, а не полностью отключить любое и все указательное взаимодействие с элементом.
Чад

4
@ Да, это правда, но можно обернуть изображение и добавить прослушиватель событий в обертку, пока у изображения больше нет призрачного изображения.
Винсент Хох-Драй

18

Вы можете использовать свойство CSS для отключения изображений в браузерах webkit.

img{-webkit-user-drag: none;}

3
Это также работает с -ms-user-drag, -moz-user-dragи user-drag. Отличное решение только для CSS!
Beejor

14

Это отключит перетаскивание изображения во всех браузерах , сохраняя при этом другие события, такие как щелчок и наведение. Работает до тех пор, пока доступны любой из HTML5, JS или CSS.

<img draggable="false" onmousedown="return false" style="user-drag: none" />

Если вы уверены, что у пользователя будет JS, вам нужно всего лишь использовать атрибут JS и т. Д. Для большей гибкости посмотрите на ondragstart, onselectstart и некоторые CSS для WebKit.


Возможно, вы захотите сделать (this.onclick || this.click) () вместо ... если onclick может быть неопределенным в соответствии с этой логикой?
Ван Нгуен

@Kaizoku Спасибо, я не учел это! Обновил мой ответ на основе вашего предложения.
Beejor

Похоже, что это не работает в FireFox, потому что, строго говоря, <img> даже не имеет событий onclick или click. В любом случае, я просто использовал часть onmouseup и позволил родительскому DIV обрабатывать onclick, и это работает.
Нельсон

@ Нельсон Спасибо, что дали мне знать. Кажется, что onmouseup не был необходим, так как onclick запускается независимо от возвращаемого значения из любого обработчика onmousedown / up. Я решил пересмотреть свой ответ для простоты. Новый однострочник должен работать нормально; только что протестирован в FF, Safari, Chrome, IE8 / 10.
Beejor

Я на Firefox 62 и onmousedown="return false"достаточно. Также необходимо избегать выбора пользователем изображения при его перетаскивании, что позволит им перетаскивать выделение.
loxaxs


4

Вы можете назначить альтернативное изображение-призрак, если вам действительно нужно использовать события перетаскивания и вы не можете установить draggable = false. Так что просто присвойте пустой png вот так:

    $('#img').bind({
        dragstart: function(e) {
            var dragIcon = document.createElement('img');
            dragIcon.src = 'blank.png';
            dragIcon.width = 100;
            e.dataTransfer.setDragImage(dragIcon, -10, -10);
        }
    });

2
Не все браузеры поддерживают setDragImage, даже если они поддерживают перетаскивание, например, IE10 / 11.
Джеймс

Возможно ли использовать этот трюк, не используя пустой png?
Фабьен Кватраво

1
Вы могли бы использовать встроенное определенное base64 изображение ... напримерdragIcon.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
Мюррей Смит


2

Для Firefox вам нужно пойти немного глубже с этим:

var imgs = document.getElementsByTagName('img');

    // loop through fetched images
    for (i = 0; i < imgs.length; i++) {
        // and define onmousedown event handler
        imgs[i].onmousedown = disableDragging;
    }

function disableDragging(e) {
        e.preventDefault();
    }

Наслаждаться.


1

Я обнаружил, что для IE вы должны добавить атрибут draggable = "false" к изображениям и привязкам, чтобы предотвратить перетаскивание. Параметры CSS работают для всех других браузеров. Я сделал это в JQuery:

$("a").attr('draggable', false); 
$("img").attr('draggable', false);

1

Здесь гораздо более простое решение, чем добавление пустых слушателей событий. Просто установите pointer-events: noneсвое изображение. Если вам все еще нужно, чтобы он был кликабельным, добавьте вокруг него контейнер, который запускает событие.



0

Протестировано на Firefox: удаление и возврат изображения работает! И это прозрачно при исполнении тоже. Например,

$('.imageContainerClass').mousedown(function() {
    var id = $(this).attr('id');
    $('#'+id).remove();
    $('#'+id).append('Image tag code');
});

РЕДАКТИРОВАТЬ : Это работает только на IE и Firefox, как ни странно. Я также добавил draggable = falseна каждом изображении. Все еще призрак с Chrome и Safari.

РЕДАКТИРОВАТЬ 2 : решение для фонового изображения является действительно лучшим. Единственная тонкость в том, что background-sizeсвойство должно быть переопределено при каждом изменении фонового изображения! Или так, как это выглядело с моей стороны. Более того, у меня была проблема с обычными imgтегами под IE, когда IE не удалось изменить размер изображений. Теперь изображения имеют правильные размеры. Просто:

$(id).css( 'background-image', url('blah.png') );
$(id).css( 'background-size', '40px');

Также, возможно, рассмотрим те, которые:

background-Repeat:no-repeat;
background-Position: center center;

0

Вы можете установить изображение, которое отображается при перетаскивании элемента. Протестировано с Chrome.

setDragImage

использование

onclick = myFunction();
myFunction(e) {
    e.dataTransfer.setDragImage(someImage, xOffset, yOffset);
}

В качестве альтернативы, как уже упоминалось в ответах, вы можете установить draggable="false" элемент HTML, если не существует возможности перетаскивания элемента вообще.


0

Be-all-end-all, без выбора или перетаскивания, со всеми префиксами браузера:

-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-o-user-select: none;
-ms-user-select: none;
user-select: none;

-webkit-user-drag: none;
-khtml-user-drag: none;
-moz-user-drag: none;
-o-user-drag: none;
-ms-user-drag: none;
user-drag: none;

Вы также можете установить draggableатрибут на false. Вы можете сделать это с помощью встроенного HTML:, draggable="false"с помощью Javascript: elm.draggable = falseили с помощью jQuery:elm.attr('draggable', false) .

Вы также можете обращаться с onmousedownфункцией к return false. Вы можете сделать это с помощью встроенного HTML:, onmousedown="return false"с помощью Javascript: elm.onmousedown=()=>return false;или с помощью jQuery:elm.mousedown(()=>return false)


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.