CSS / JS để ngăn kéo hình ảnh ma?


152

Có cách nào để ngăn người dùng nhìn thấy bóng ma của hình ảnh mà họ đang cố gắng kéo (không quan tâm đến bảo mật của hình ảnh, nhưng trải nghiệm).

Tôi đã thử cách khắc phục sự cố với lựa chọn màu xanh trên văn bản và hình ảnh nhưng không phải là hình ảnh ma:

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

(Tôi cũng đã thử lồng hình ảnh bên trong một div với các quy tắc tương tự được áp dụng cho div). Cảm ơn


1
Xem câu trả lời này: stackoverflow.com/a/4211930/1060487 câu hỏi có thể trùng lặp
mattdlockyer

Câu trả lời:


195

Bạn có thể đặt draggablethuộc tính thành falsemã đánh dấu hoặc mã JavaScript.

// As a jQuery method: $('#myImage').attr('draggable', false);
document.getElementById('myImage').setAttribute('draggable', false);
<img id="myImage" src="http://placehold.it/150x150">


48
Tại sao thêm nó với JavaScript ??? <img id="myImage" src="http://placehold.it/150x150" draggable="false">
Greg

26
@Greg: Tại sao bạn hỏi tôi? Đó là OP, người muốn có giải pháp JavaScript. Thêm vào đó, tôi đã nói "bằng mã đánh dấu hoặc mã JavaScript", vì vậy không giống như bạn không thể làm điều đó trong đánh dấu nếu bạn có tùy chọn chỉnh sửa đánh dấu của mình.
BoltClock

12
Không hoạt động trong FF kết hợp với -moz-user-select: none. Giải pháp có thể: Thêm pointer-events: none.
Cedric Reichenbach

9
Có thể tôi đã giải thích sai câu hỏi nhưng không phải OP hỏi làm thế nào họ có thể giữ lại kéo và thả mà chỉ che giấu hình ảnh ma quái? Thiết draggableđể falsesẽ hoàn toàn vô hiệu hóa kéo và thả.
James

1
@James: Thành thật mà nói không rõ ràng lắm. Tôi chủ yếu trả lời theo giả định rằng hình ảnh ma là chỉ báo trực quan cho kéo và thả (đó là) và hầu hết những người muốn ẩn hình ảnh ma nói chung không quan tâm nếu kéo và thả là bị vô hiệu hóa hoàn toàn.
BoltClock

87

Tôi nghĩ bạn có thể thay đổi

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

thành một

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

3
@victorsosa Đúng, nhưng tiêu chuẩn thực tế vẫn là tiêu chuẩn, W3C hay không. Đó là, nếu mọi trình duyệt đều hỗ trợ nó, thật tốt để đi. Hãy nhớ rằng rất nhiều thứ W3C bắt đầu là độc quyền, như AJAX.
Beejor

4
Giải pháp này không hoạt động trong IE11 và Firefox 57.0.
Tudor Ciotlos

34

Thử nó:

img {
  pointer-events: none;
}

và cố gắng tránh

* {
  pointer-events: none;
}

8
Đây là một giải pháp kém, vì nó loại bỏ tất cả khả năng tương tác với phần tử. OP chỉ yêu cầu vô hiệu hóa chức năng "kéo" của một phần tử, không vô hiệu hóa hoàn toàn bất kỳ và tất cả các tương tác dựa trên con trỏ với phần tử.
Chad

4
@Chad điều đó đúng nhưng có thể bọc hình ảnh và thêm trình lắng nghe sự kiện vào trình bao bọc trong khi hình ảnh không còn hình ảnh ma nữa.
Vincent Hoch-Drei

18

Bạn có thể sử dụng thuộc tính CSS để tắt hình ảnh trong trình duyệt webkit.

img{-webkit-user-drag: none;}

3
Điều này cũng làm việc với -ms-user-drag, -moz-user-draguser-drag. Một giải pháp tuyệt vời chỉ dành cho CSS!
Beejor

14

Điều này sẽ vô hiệu hóa việc kéo hình ảnh trong tất cả các trình duyệt , trong khi vẫn duy trì các sự kiện khác như nhấp chuột và di chuột. Hoạt động miễn là có sẵn HTML5, JS hoặc CSS.

<img draggable="false" onmousedown="return false" style="user-drag: none" />

Nếu bạn tự tin người dùng sẽ có JS, bạn chỉ cần sử dụng thuộc tính JS, v.v. Để linh hoạt hơn, hãy xem xét ondragstart, onselectstart và một số CSS chạm / chạm WebKit.


Bạn có thể muốn làm (this.onclick || this.click) () thay vào đó .. nếu onclick có thể không được xác định theo logic này?
Văn Nguyễn

@Kaizoku Cảm ơn, tôi đã không xem xét điều đó! Cập nhật câu trả lời của tôi dựa trên đề nghị của bạn.
Beejor 4/11/2016

Điều này dường như không hoạt động trong FireFox bởi vì, nói đúng ra, <img> thậm chí không có các sự kiện onclick hoặc nhấp chuột. Dù sao, tôi chỉ sử dụng phần onmouseup và để cho cha mẹ DIV xử lý onclick và nó hoạt động.
Nelson

@Nelson Cảm ơn đã cho tôi biết. Dường như onmouseup dù sao cũng không cần thiết vì onclick bắn bất kể giá trị trả về từ bất kỳ trình xử lý onmousedown / up nào. Tôi quyết định sửa lại câu trả lời của mình cho đơn giản. Một lớp lót mới nên hoạt động tốt; vừa được thử nghiệm trong FF, Safari, Chrome, IE8 / 10.
Beejor

Tôi đang dùng Firefox 62 và onmousedown="return false"là đủ. Cũng cần phải tránh người dùng chọn hình ảnh trong khi kéo vào nó, sau đó sẽ cho phép họ kéo lựa chọn.
loxaxs


4

Bạn có thể chỉ định một hình ảnh ma thay thế nếu bạn thực sự cần sử dụng các sự kiện kéo và không thể đặt draggable = false. Vì vậy, chỉ cần gán một png trống như vậy:

    $('#img').bind({
        dragstart: function(e) {
            var dragIcon = document.createElement('img');
            dragIcon.src = 'blank.png';
            dragIcon.width = 100;
            e.dataTransfer.setDragImage(dragIcon, -10, -10);
        }
    });

2
Không phải tất cả các trình duyệt đều hỗ trợ setDragImage, ngay cả khi chúng hỗ trợ kéo và thả, ví dụ IE10 / 11.
James

Có thể sử dụng thủ thuật này mà không thực sự sử dụng một png trống?
Fabien Quatravaux

1
Bạn có thể sử dụng một inline-định nghĩa base64 image mã hóa ... ví dụdragIcon.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
Murray Smith


2

Đối với Firefox, bạn cần đi sâu hơn một chút với điều này:

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

Thưởng thức.


1

Tôi thấy rằng đối với IE, bạn phải thêm thuộc tính draggable = "false" vào hình ảnh và neo để ngăn kéo. các tùy chọn CSS hoạt động cho tất cả các trình duyệt khác. Tôi đã làm điều này trong jQuery:

$("a").attr('draggable', false); 
$("img").attr('draggable', false);

1

Có một giải pháp dễ dàng hơn ở đây hơn là thêm các trình lắng nghe sự kiện trống. Chỉ cần đặt pointer-events: nonevào hình ảnh của bạn. Nếu bạn vẫn cần nó có thể nhấp được, hãy thêm một thùng chứa xung quanh nó để kích hoạt sự kiện.



0

Đã thử nghiệm trên Firefox: loại bỏ và đưa hình ảnh trở lại hoạt động! Và nó cũng minh bạch trong vụ hành quyết. Ví dụ,

$('.imageContainerClass').mousedown(function() {
    var id = $(this).attr('id');
    $('#'+id).remove();
    $('#'+id).append('Image tag code');
});

EDIT : Điều này chỉ hoạt động trên IE và trên Firefox, thật kỳ lạ. Tôi cũng đã thêm draggable = falsevào mỗi hình ảnh. Vẫn là một con ma với Chrome và Safari.

EDIT 2 : Giải pháp hình ảnh nền thực sự là giải pháp tốt nhất. Sự tinh tế duy nhất là thuộc background-sizetính phải được xác định lại mỗi khi thay đổi hình nền! Hoặc, đó là những gì nó trông giống như từ phía tôi. Vẫn tốt hơn, tôi gặp vấn đề với imgcác thẻ thông thường trong IE, trong đó IE không thể thay đổi kích thước hình ảnh. Bây giờ, hình ảnh có kích thước chính xác. Đơn giản:

$(id).css( 'background-image', url('blah.png') );
$(id).css( 'background-size', '40px');

Ngoài ra, có lẽ xem xét những người:

background-Repeat:no-repeat;
background-Position: center center;

0

Bạn có thể đặt hình ảnh được hiển thị khi một mục được kéo. Đã thử nghiệm với Chrome.

setDragImage

sử dụng

onclick = myFunction();
myFunction(e) {
    e.dataTransfer.setDragImage(someImage, xOffset, yOffset);
}

Ngoài ra, như đã được đề cập trong các câu trả lời, bạn có thể đặt draggable="false"trên phần tử HTML, nếu không thể kéo phần tử đó thì không vấn đề gì.


0

Tất cả kết thúc, không chọn hoặc kéo, với tất cả các tiền tố trình duyệt:

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

Bạn cũng có thể đặt draggablethuộc tính thành false. Bạn có thể làm điều này với HTML nội tuyến : draggable="false", với Javascript : elm.draggable = false, hoặc với jQuery : elm.attr('draggable', false).

Bạn cũng có thể xử lý các onmousedownchức năng để return false. Bạn có thể làm điều này với HTML nội tuyến : onmousedown="return false", với Javascript : elm.onmousedown=()=>return false;, hoặc với jQuery:elm.mousedown(()=>return false)


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.