CSS / JS для запобігання перетягуванню зображення привидів?


152

Чи є спосіб запобігти користувачеві бачити привид зображення, яке він намагається перетягнути (стосується не безпеки зображень, а досвіду).

Я спробував це, що вирішує проблему із синім виділенням тексту та зображень, але не зображенням привидів:

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

(Я також спробував вкласти зображення всередині 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
@Greg: Чому ти мене питаєш? Це ОП, який хотів вирішити 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
@Chad це правда, але можна обернути зображення і додати слухача події до обгортки, поки на зображенні вже немає зображення привидів.
Вінсент Хох-

18

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

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 тощо.


Ви можете зробити це (this.onclick || this.click) () замість цього .. якщо onclick можна визначити за цією логікою?
Van Nguyen

@Kaizoku Спасибі, я не вважав цього! Оновлено мою відповідь на основі вашої пропозиції.
Beejor

Схоже, це не працює у FireFox, оскільки, строго кажучи, у <img> навіть немає подій onclick або click. У будь-якому випадку, я просто використав порцію onmouseup і дозволив батьківському DIV обробляти onclick, і це працює.
Нельсон

@Nelson Дякую, що повідомили мені. Здається, що 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?
Fabien Quatravaux

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

EDIT : Це працює лише на IE та на Firefox, як не дивно. Я також додав draggable = falseна кожне зображення. Досі привид з Chrome і Safari.

EDIT 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

Все-всьому, без вибору та перетягування, з усіма префіксами браузера:

-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.