Предотвращение перетаскивания или выбора изображения без использования JS

Кто-нибудь знает, как сделать изображение не перетаскиваемым и не выбираемым - в то же время - в Firefox, не прибегая к Javascript? Кажется тривиальным, но здесь проблема:

1) Можно перетаскивать и выделять в Firefox:

<img src="...">

2) Таким образом, мы добавляем это, но изображение все еще можно выделить при перетаскивании:

<img src="..." draggable="false">

3) Таким образом, мы добавляем это, чтобы исправить проблему подсветки, но затем контрастивно, изображение снова перетаскивается. Странно, я знаю! Использование FF 16.0.1

<img src="..." draggable="false" style="-moz-user-select: none;">

Итак, кто-нибудь знает, почему добавление "-moz-user-select: none" может каким-то образом превзойти и отключить "draggable = false"? Конечно, webkit работает так, как ожидалось. Ничего нет в Interwebs об этом... Было бы здорово, если бы мы могли пролить свет на это вместе.

Спасибо!!

Изменить: Это связано с тем, что элементы пользовательского интерфейса непреднамеренно перетаскиваются и улучшаются удобство использования - а не какая-то неудобная попытка использовать схему защиты от копирования: -)

Ответ 1

Задайте следующие свойства CSS для изображения:

user-drag: none; 
user-select: none;
-moz-user-select: none;
-webkit-user-drag: none;
-webkit-user-select: none;
-ms-user-select: none;

Ответ 2

Я забыл поделиться своим решением, я не мог найти способ сделать это без использования JS. В некоторых случаях @Jeffery A Wooden предложил CSS просто не прикрывать.

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

CSS:

.unselectable {
    /* For Opera and <= IE9, we need to add unselectable="on" attribute onto each element */
    /* Check this site for more details: http://help.dottoro.com/lhwdpnva.php */
    -moz-user-select: none; /* These user-select properties are inheritable, used to prevent text selection */
    -webkit-user-select: none;
    -ms-user-select: none; /* From IE10 only */
    user-select: none; /* Not valid CSS yet, as of July 2012 */

    -webkit-user-drag: none; /* Prevents dragging of images/divs etc */
    user-drag: none;
}

JS:

var makeUnselectable = function( $target ) {
    $target
        .addClass( 'unselectable' ) // All these attributes are inheritable
        .attr( 'unselectable', 'on' ) // For IE9 - This property is not inherited, needs to be placed onto everything
        .attr( 'draggable', 'false' ) // For moz and webkit, although Firefox 16 ignores this when -moz-user-select: none; is set, it like these properties are mutually exclusive, seems to be a bug.
        .on( 'dragstart', function() { return false; } );  // Needed since Firefox 16 seems to ingore the 'draggable' attribute we just applied above when '-moz-user-select: none' is applied to the CSS 

    $target // Apply non-inheritable properties to the child elements
        .find( '*' )
        .attr( 'draggable', 'false' )
        .attr( 'unselectable', 'on' ); 
};

Это было намного сложнее, чем нужно было.

Ответ 3

Вы можете использовать свойство pointer-events в вашем CSS и установить его равным 'none'

img {
    pointer-events: none;
}

отредактированный

это заблокирует (щелкнет) событие. Так что лучшим решением будет

<img draggable="false" (dragstart)="false;" class="unselectable">

.unselectable {
  user-drag: none; 
  user-select: none;
  -moz-user-select: none;
  -webkit-user-drag: none;
  -webkit-user-select: none;
  -ms-user-select: none;
}

Ответ 4

В зависимости от ситуации часто бывает полезно сделать изображение фоновым изображением div с CSS.

<div id='my-image'></div>

Затем в CSS:

#my-image {
    background-image: url('/img/foo.png');
    width: ???px;
    height: ???px;
}

Смотрите JSFiddle для живого примера с кнопкой и другим параметром выбора.

Ответ 5

Вероятно, вы можете просто прибегнуть к

<img src="..." style="pointer-events: none;">

Ответ 6

Вы можете установить изображение в качестве фонового изображения. Так как он находится в div, а div недоступен, изображение будет недоступно:

<div style="background-image: url("image.jpg");">
</div>

Ответ 7

Общее решение, особенно для браузера Windows Edge (как -ms-user-select: none; правило CSS не работает):

window.ondragstart = function() {return false}

Примечание. Это может помочь вам добавить draggable = false для каждого тега img, когда вам все еще нужно событие click (т.е. вы не можете использовать pointer-events = none), но не хотите, чтобы изображение значка перетаскивания появляются.

Ответ 8

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