การป้องกันไม่ให้ภาพลากหรือเลือกได้โดยไม่ต้องใช้ 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" หรือไม่? แน่นอนว่า webkit ทำงานได้ตามที่คาดไว้ ไม่มีอะไรอยู่ใน Interwebs เกี่ยวกับเรื่องนี้ ... มันจะดีมากถ้าเราสามารถส่องแสงในเรื่องนี้ด้วยกัน

ขอบคุณ !!

แก้ไข: นี่เป็นเรื่องเกี่ยวกับการป้องกันไม่ให้องค์ประกอบ UI ถูกลากโดยไม่ได้ตั้งใจและปรับปรุงการใช้งาน - ไม่ใช่ความพยายามที่อ่อนแอในรูปแบบการป้องกันการคัดลอก :-)


1
ฉันหวังว่าคุณจะไม่คิดว่านี่จะป้องกันไม่ให้คนอื่นบันทึกภาพของคุณลงในดิสก์ ใครก็ตามที่มีความเข้าใจเพียงเล็กน้อยเกี่ยวกับการทำงานของเบราว์เซอร์ก็จะสามารถแก้ไขปัญหานี้ได้อย่างง่ายดาย
Jim Garrison

ไม่แน่นอน @JimGarrison ขอโทษที่ฉันควรเจาะจงมากกว่านี้ฉันพยายามป้องกันไม่ให้องค์ประกอบ UI บางส่วนของฉันถูกย้ายไปในบริบทที่ถูกต้องมันเป็นอันตรายต่อการใช้งาน
tmkly3

มีประโยชน์มากแทนหากคุณมีองค์ประกอบพื้นหลังที่จะถูกลากบนเดสก์ท็อป (หรือแย่กว่านั้นคือบรรทัดโค้ด href ลงในไฟล์บางไฟล์ที่เปิดอยู่เบื้องหลังหน้าต่างเบราว์เซอร์ในขณะที่ทำงานกับมัน!) เมื่อมันอยู่ใกล้กับแถบเลื่อนที่ทันสมัยขนาดเล็กมากและคุณ อย่ากดที่แถบทุกครั้งที่ทดสอบการเลื่อน
Garavani

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

ทำงานบนเบราว์เซอร์ทั้งหมด
Milad Abooali

เอาล่ะฉันจะทำให้มันไม่มีผลได้อย่างไร แต่ยังคงยิงเหตุการณ์ลากอยู่
Ty_

6
ฉันพบว่าฉันยังลากบน Firefox 47 ได้ แต่เพิ่ม ondragstart ของ Masadow = "return false;" คุณสมบัติของแท็กรูปภาพได้รับการแก้ไข
andrew pate

3
ฉันยังลากโครเมี่ยมได้
lonewarrior556

54

ฉันลืมที่จะแบ่งปันวิธีแก้ปัญหาของฉันฉันไม่สามารถหาวิธีทำได้โดยไม่ใช้ JS มีบางกรณีที่ CSS แนะนำของ @Jeffery A Wooden นั้นไม่ครอบคลุม

นี่คือสิ่งที่ฉันนำไปใช้กับคอนเทนเนอร์ UI ทั้งหมดของฉันไม่จำเป็นต้องใช้กับแต่ละองค์ประกอบเนื่องจากจะใช้องค์ประกอบย่อยทั้งหมด

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

3
นอกจากนี้ยังสามารถเขียน<img src="..." draggable="false" style="-moz-user-select: none;" ondragstart="return false;">ให้ตรงกับรหัสของ OP
Masadow

39

คุณสามารถใช้pointer-eventsคุณสมบัติใน CSS ของคุณและตั้งค่าให้เท่ากับ 'ไม่มี'

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

ขึ้นอยู่กับสถานการณ์การทำให้รูปภาพเป็นภาพพื้นหลังของdivCSS ด้วย 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

สำหรับฉันเช่นกัน "pointer-events" เป็นวิธีแก้ปัญหาเพราะทำงานข้ามเบราว์เซอร์ได้ ("user-drag" ไม่มีผลกับ Firefox อย่างน้อยในวันที่ 11.2018)
David Dal Busco

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องค์ประกอบที่มีขนาดเดียวกับภาพและอยู่ในตำแหน่งด้านบนของภาพ จากนั้นเหตุการณ์ของเมาส์จะไม่ไปที่องค์ประกอบรูปภาพ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.