CSS /JS, чтобы предотвратить перетаскивание призрачного изображения?
Есть ли способ запретить пользователю видеть призрак изображения, которое он пытается перетащить (не забота о безопасности изображений, а опыт).
Я попробовал это, что устраняет проблему с синим выделением текста и изображений, но не с призрачным изображением:
img {
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-o-user-select: none;
user-select: none;
}
(Я также попытался вложить изображение в div с теми же правилами, применимыми к div). Спасибо
24 ответа
Вы можете установить draggable
приписыватьfalse
в разметке или в коде JavaScript. Смотрите это демо.
// As a jQuery method: $('#myImage').attr('draggable', false);
document.getElementById('myImage').draggable = false;
<img id="myImage" src="http://placehold.it/150x150">
Я думаю, что вы можете изменить свой
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;
}
Попытайся:
img{pointer-events: none;}
и стараться избегать
*{pointer-events: none;}
Это отключит перетаскивание изображения во всех браузерах, сохранив при этом другие события, такие как щелчок и наведение. Работает до тех пор, пока доступны любой из HTML5, JS или CSS.
<img draggable="false" onmousedown="return false" style="user-drag: none" />
Если вы уверены, что у пользователя будет JS, вам нужно всего лишь использовать атрибут JS и т. Д. Для большей гибкости посмотрите на ondragstart, onselectstart и некоторые CSS для WebKit.
Вы можете использовать свойство CSS для отключения изображений в браузерах webkit.
img{-webkit-user-drag: none;}
Очень просто, не усложняйте с помощью большого количества логики, используйте простой перетаскиваемый атрибут и сделайте его ложным
<img draggable="false" src="img/magician.jpg" alt="" />
Все-все-все-все, без выбора или перетаскивания, со всеми префиксами браузера:
-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)
HTML
<img draggable="false" src="img/example.jpg">
JavaScript
document.querySelector('img').addEventListener('dragstart', (event) => {
event.preventDefault();
});
CSS
img {
-webkit-user-drag: none;
}
В настоящее время нет без префиксаuser-drag
или другая версия свойства, реализованная в браузерах или в соответствии со стандартами, поскольку предпочтительным решением является перетаскиваемый атрибут/свойство HTML.
Это свойство, специфичное для Webkit. Вот что говорит об этом документация WebKit :
Заголовок
WebKit обеспечивает автоматическую поддержку, позволяя пользователям перетаскивать общие элементы, такие как изображения, ссылки и выделенный текст. Вы можете расширить эту поддержку, включив определенные элементы на HTML-страницу. Например, вы можете пометить определенный тег div или span как перетаскиваемый.
Чтобы пометить произвольный элемент как перетаскиваемый, добавьте атрибут в определение стиля элемента. Потому что
-webkit-user-drag
является атрибутом каскадной таблицы стилей (CSS), его можно включить как часть определения стиля или как встроенный атрибут стиля в теге элемента. Значения этого атрибута перечислены в таблице 4-1.Значения атрибута -webkit-user-drag:
none
: запретить перетаскивание этого элемента.
element
: Разрешить перетаскивание этого элемента.
auto
: использовать логику по умолчанию для определения необходимости перетаскивания элемента. (Изображения, ссылки и выделенный текст — единственные элементы, которые можно перетаскивать.) Это значение по умолчанию.
Он поддерживается всеми браузерами, использующими механизм рендеринга WebKit, поэтому Chrome, более новые версии Opera, Safari и т. д. Поддержка в мобильных браузерах, использующих WebKit, может различаться в зависимости от мобильной ОС.
Вы можете назначить альтернативное изображение-призрак, если вам действительно нужно использовать события перетаскивания и вы не можете установить 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);
}
});
Поместите изображение в качестве фона пустого элемента или под прозрачным элементом. Когда пользователь нажимает на изображение, чтобы перетащить, они нажимают на div.
См. http://www.flickr.com/photos/thefella/5878724253/?f=hp
<div id="photo-drag-proxy"></div>
Вы можете обернуть img внутри другого div и применитьpointer-events:none;
к этому div. Так что img не получится перетащить. Но это следует использовать только в том случае, если вы не собираетесь добавлять какое-либо другое поведение к целевому изображению.
Для 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();
}
Наслаждаться.
Здесь гораздо более простое решение, чем добавление пустых слушателей событий. Просто установите pointer-events: none
к вашему образу. Если вам все еще нужно, чтобы он был кликабельным, добавьте вокруг него контейнер, который вызывает событие.
В React все, что вам нужно, это:
<img
src={}
onMouseDown={(e) => {
e.preventDefault();
// other code
}}
/>
Если Firefox не оценивает ваш атрибут draggable (если установлено значение false) или ни одно из ваших правил CSS перетаскивания пользователем в вашей ссылке/якоре или элементе изображения:
И вы хотите сохранить события-указатели такими, какие они есть, вы можете использовать большие пушки для этого призрачного « полупрозрачного изображения , сгенерированного из цели перетаскивания (элемент, на который запускается событие dragstart)», как описано в MDN setDragImage . Просто используйте:
if (/(firefox)/i.test(navigator.userAgent)) {
document.querySelector('.my-non-draggable').addEventListener('dragstart',
e => e.preventDefault()
);
// or jQuery: $('.my-non-draggable').on('dragstart', e => e.preventDefault());
}
Я обнаружил, что для IE вы должны добавить атрибут draggable="false" к изображениям и привязкам, чтобы предотвратить перетаскивание. Параметры CSS работают для всех других браузеров. Я сделал это в JQuery:
$("a").attr('draggable', false);
$("img").attr('draggable', false);
document.querySelectorAll("*").forEach((elem) => {
elem.setAttribute('draggable', false)
elem.addEventListener('dragstart', (event) => {
event.preventDefault()
})
})
Это отключает перетаскивание всех элементов.
Вы можете установить изображение, которое отображается при перетаскивании элемента. Протестировано с Chrome.
использование
onclick = myFunction();
myFunction(e) {
e.dataTransfer.setDragImage(someImage, xOffset, yOffset);
}
В качестве альтернативы, как уже упоминалось в ответах, вы можете установить draggable="false"
для элемента HTML, если нет возможности перетаскивать элемент вообще, это не проблема.
//отключаем перетаскивание изображения
$(document).on("dragstart", function (e) {
e.preventDefault();
});
Для этого требуется jQuery. Это предотвратит перетаскивание любого текста или изображения. Замените документ любым элементом, который вы хотите предотвратить от перетаскивания.
Вы можете использовать "Пустой элемент Img".
Пустой элемент Img - document.createElement("img")
[HTML Code]
<div id="hello" draggable="true">Drag!!!</div>
[JavaScript Code]
var block = document.querySelector('#hello');
block.addEventListener('dragstart', function(e){
var img = document.createElement("img");
e.dataTransfer.setDragImage(img, 0, 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;
Это работает для меня, я использую несколько скриптов для лайтбоксов
.nodragglement {
transform: translate(0px, 0px)!important;
}