Запобігання перетягуванню або вибору зображення без використання JS


132

Хтось знає, як зробити так, щоб зображення не перетягувалося і не було вибиралося - водночас - у 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"? Звичайно, вебкіт працює як очікувалося. На Інтервебі немає нічого про це ... Було б чудово, якби ми могли разом просвітити це світло.

Дякую!!

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


1
Сподіваюся, ви не думаєте, що це не завадить людям зберігати ваше зображення на диску. Кожен, хто навіть має незначне розуміння того, як працюють браузери, зможе обійти це легко.
Джим Гаррісон

@ JimGarrison, звичайно, ні, вибачте, що я повинен був бути більш конкретним, я намагаюся утримати деякі елементи інтерфейсу, щоб не рухатись, в правильному контексті це шкодить зручності використання.
tmkly3

Натомість дуже корисно, якщо у вас є фонні елементи, які перетягуватимуться на робочий стіл (або ще гірше, як рядки коду href у якийсь файл, відкритий у фоновому режимі за вікном браузера під час роботи над ним!), Коли вони знаходяться поруч із дуже маленькими сучасними смугами прокрутки, і ви не вдаряйте планку рівно кожного разу, перевіряючи сувої.
Гаравани

1
Це було відомим питанням у Firefox протягом дуже тривалого часу, як виявляється ( дублікат? )
Coderer

Відповіді:


210

Встановіть на зображення такі властивості CSS:

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

3
Дякую, у мене є і такі місця, але проблема починає виглядати як помилка у Firefox. Я думаю, єдиний спосіб вирішити це зараз - через Javascript.
tmkly3

Працював у всіх браузерах.
Мілад Абуалі

Гаразд, так, як я можу зробити так, щоб він не мав ефекту, але все-таки запустив подію перетягування?
Ty_

6
Я виявив, що все ще можу перетягнути Firefox 47, але додав ondragstart Masadow = "return false;" властивість до тегу зображення виправлено.
андре паште

3
Я все ще можу перетягнути хром
lonewarrior556

54

Я забув поділитися своїм рішенням, я не міг знайти спосіб це зробити без використання JS. Є деякі кутові випадки, коли CSS, запропонований @Jeffery A Wooden, просто не висвітлює.

Це те, що я застосовую до всіх своїх контейнерів користувальницького інтерфейсу, не потрібно застосовувати їх до кожного елемента, оскільки він набирає всі дочірні елементи.

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's 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' ); 
};

Це було набагато складніше, ніж потрібно.


1
$ (el) .on ('dragstart', функція (e) {e.preventDefault ();});
Піт Б

3
Це також може бути записано, <img src="..." draggable="false" style="-moz-user-select: none;" ondragstart="return false;">щоб відповідати коду ОП.
Масадов

38

Ви можете використовувати 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;
}

1
Це робить так, що зображення зображення поводиться більше як гліфікон, тому мені найкраще подобається цей метод.
Funkodebat

9
Це також робить події на кшталт (onclick) непридатними .. будьте обережні, якщо ви використовуєте такий підхід.
Nicolas Bouvrette

Ця відповідь залишається дійсною, поки прийнята відповідь відсутня в останніх версіях програмного забезпечення. Це має бути нова прийнята відповідь. @ tmkly3
progyammer

це створить проблему, якщо для зображення є подія клацання. Це заблокує подію натискання
Pratap AK

12

Залежно від ситуації часто корисно зробити зображення фоновим зображенням divіз CSS.

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

Потім у CSS:

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

Дивіться цей JSFiddle для живого прикладу з кнопкою та іншим параметром розміру.


9

Можливо, ви могли просто вдатися

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

Це має бути прийнятою відповіддю, перетягування користувача не підтримується Firefox. Дякую за це!
Merritt6616

Для мене також "покажчик-події" був рішенням, оскільки він працював крос-браузером ("перетягування користувача" не впливає на Firefox, принаймні, 11.2018)
Девід Даль Буско

2

Загальне рішення, спеціально для браузера Windows Edge (як -ms-user-select: none; CSS правило не працює):

window.ondragstart = function() {return false}

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


Єдина відповідь, яка насправді працює на мене! Не знаю, чому це не проголосували вище.
AldaronLau

1

Ви можете встановити зображення як фонове зображення. Оскільки воно знаходиться в a div, і divвоно неможливо змінити, зображення буде неможливим:

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

1

Я створив елемент div, який має той же розмір, що і зображення, і розташований у верхній частині зображення . Потім події миші не переходять до елемента зображення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.