Ngăn chặn hình ảnh có thể kéo hoặc có thể lựa chọn mà không cần sử dụng JS


132

Có ai biết một cách để làm cho một hình ảnh không thể kéo và không thể lựa chọn - cùng một lúc - trong Firefox, mà không cần dùng đến Javascript? Có vẻ tầm thường, nhưng đây là vấn đề:

1) Có thể được kéo và tô sáng trong Firefox:

<img src="...">

2) Vì vậy, chúng tôi thêm điều này, nhưng hình ảnh vẫn có thể được làm nổi bật trong khi kéo:

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

3) Vì vậy, chúng tôi thêm điều này, để khắc phục vấn đề nổi bật, nhưng sau đó ngược lại, hình ảnh trở nên có thể kéo được một lần nữa. Thật lạ, tôi biết! Sử dụng FF 16.0.1

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

Vì vậy, có ai biết tại sao thêm "-moz-user-select: none", bằng cách nào đó sẽ thổi phồng và vô hiệu hóa "draggable = false" không? Tất nhiên, webkit hoạt động như mong đợi. Không có gì ngoài Interwebs về điều này ... Sẽ thật tuyệt nếu chúng ta có thể cùng nhau chiếu sáng thứ này.

Cảm ơn!!

Chỉnh sửa: Đây là về việc giữ cho các thành phần UI không bị kéo vô tình và cải thiện khả năng sử dụng - không phải là một nỗ lực khập khiễng trong sơ đồ bảo vệ bản sao :-)


1
Tôi hy vọng bạn không nghĩ rằng điều này sẽ ngăn mọi người lưu hình ảnh của bạn vào đĩa. Bất cứ ai thậm chí có một chút hiểu biết về cách các trình duyệt hoạt động sẽ có thể khắc phục điều này một cách dễ dàng.
Jim Garrison

@JimGarrison tất nhiên là không, xin lỗi, tôi nên nói cụ thể hơn, tôi đang cố gắng để giữ cho một số yếu tố UI của tôi không bị di chuyển, trong bối cảnh phù hợp, điều đó gây hại cho khả năng sử dụng.
tmkly3

Thay vào đó, rất hữu ích nếu bạn có các yếu tố nền sẽ được kéo trên máy tính để bàn (hoặc tệ hơn là các dòng mã as href vào một số tệp được mở ở phía sau cửa sổ trình duyệt trong khi làm việc với nó!) Khi chúng ở gần các thanh cuộn hiện đại rất nhỏ và bạn không nhấn thanh chính xác mỗi lần kiểm tra cuộn.
Garavani

1
Đây là một vấn đề được biết đến trong Firefox trong một thời gian dài khi nó xuất hiện ( trùng lặp? )
Bộ giải mã

Câu trả lời:


210

Đặt các thuộc tính CSS sau cho hình ảnh:

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

3
Cảm ơn, tôi cũng có những vị trí đó, nhưng vấn đề bắt đầu giống như một lỗi trong Firefox. Tôi đoán cách duy nhất để giải quyết vấn đề này là thông qua Javascript.
tmkly3

Làm việc trên tất cả các trình duyệt.
Milad Abooali

Được rồi, làm thế nào để tôi làm cho nó không có hiệu lực nhưng vẫn kích hoạt sự kiện kéo?
Ty_

6
Tôi thấy tôi vẫn có thể kéo trên Firefox 47 nhưng thêm Masadow's ondragstart = "return false;" thuộc tính cho thẻ hình ảnh cố định nó.
pate

3
Tôi vẫn có thể kéo vào chrome
lonewar Warrior556

54

Tôi đã quên chia sẻ giải pháp của mình, tôi không thể tìm ra cách để làm điều này mà không sử dụng JS. Có một số trường hợp góc mà @Jeffery Một CSS được đề xuất của Gỗ sẽ không bao gồm.

Đây là những gì tôi áp dụng cho tất cả các thùng chứa UI của mình, không cần phải áp dụng cho từng phần tử vì nó sử dụng cho tất cả các phần tử con.

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

Đây là cách phức tạp hơn mức cần thiết.


1
$ (el) .on ('dragstart', function (e) {e.preventDefault ();});
Pete B

3
Nó cũng có thể được viết như <img src="..." draggable="false" style="-moz-user-select: none;" ondragstart="return false;">để khớp với mã của OP.
Mặt nạ

38

Bạn có thể sử dụng thuộc pointer-eventstính trong CSS của mình và đặt nó bằng 'none'

img {
    pointer-events: none;
}

Đã chỉnh sửa

điều này sẽ chặn (click) sự kiện. Vì vậy, giải pháp tốt hơn sẽ là

<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
Làm theo cách này làm cho một biểu tượng hình ảnh hoạt động giống như glyphicon, vì vậy tôi thích phương pháp này nhất.
Funkodebat

9
Điều này cũng làm cho các sự kiện như (onclick) không thể sử dụng được .. hãy cẩn thận nếu bạn sử dụng phương pháp này.
Nicolas Bouvrette

Câu trả lời này vẫn còn hiệu lực trong khi câu trả lời được chấp nhận không có trên các phiên bản phần mềm mới nhất. Đây phải là câu trả lời mới được chấp nhận. @ tmkly3
progyammer

điều này sẽ tạo ra vấn đề nếu chúng ta có sự kiện click cho hình ảnh. Nó sẽ chặn sự kiện nhấp chuột
Pratap AK

12

Tùy thuộc vào tình huống, thường hữu ích để làm cho hình ảnh trở thành hình nền của divCSS.

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

Sau đó, trong CSS:

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

Xem JSFiddle này để biết ví dụ trực tiếp với một nút và tùy chọn kích cỡ khác nhau.


9

Bạn có thể chỉ cần dùng đến

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

Đây phải là câu trả lời được chấp nhận, kéo người dùng không được firefox hỗ trợ. Cảm ơn vì điều này!
Merritt6616

Đối với tôi cũng vậy, "sự kiện con trỏ" là giải pháp vì nó hoạt động trên nhiều trình duyệt ("kéo người dùng" không có tác dụng với Firefox, ít nhất là vào 11.2018)
David Dal Busco

2

Một giải pháp chung đặc biệt dành cho trình duyệt Windows Edge (như -ms-user-select: none; quy tắc CSS không hoạt động):

window.ondragstart = function() {return false}

Lưu ý: Điều này có thể giúp bạn tiết kiệm được việc phải thêm draggable="false"vào mỗi imgthẻ khi bạn vẫn cần sự kiện nhấp (tức là bạn không thể sử dụng pointer-events: none), nhưng không muốn hình ảnh biểu tượng kéo xuất hiện.


Câu trả lời duy nhất thực sự hiệu quả với tôi! Không biết tại sao nó không được bình chọn cao hơn.
AldaronLau

1

Bạn có thể đặt hình ảnh làm hình nền. Vì nó nằm trong a divvà không thể divxóa được, nên hình ảnh sẽ không thể xóa được:

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

1

Tôi đã tạo một phần tử div có cùng kích thước với hình ảnh và được đặt ở trên cùng của hình ảnh . Sau đó, các sự kiện chuột không đi đến yếu tố hình ảnh.

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.