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)

<img src="myimage.jpg" ondragstart="return false;" />

Обрабатывать dragstart событие и 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.

setDragImage

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

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;
}

Другие вопросы по тегам