JS를 사용하지 않고 이미지를 드래그하거나 선택하지 못하도록 방지


132

누구나 자바 스크립트에 의존하지 않고 Firefox에서 이미지를 드래그 할 수없고 선택 할 수 없도록 만드는 방법을 알고 있습니까? 사소한 것처럼 보이지만 여기에 문제가 있습니다.

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"를 능가 할 수 없는지 아십니까? 물론 웹킷은 예상대로 작동합니다. Interwebs에는 이것에 대해 아무것도 없습니다 ... 우리가 이것에 대해 약간의 빛을 비추면 좋을 것입니다.

감사!!

편집 : 이것은 UI 요소가 실수로 드래그되는 것을 방지하고 사용성을 향상시키는 것입니다.


1
사람들이 이미지를 디스크에 저장하지 못하게 될 것이라고 생각하지 않기를 바랍니다. 브라우저 작동 방식에 대해 약간만 이해하고있는 사람이라면 누구나 쉽게 해결할 수 있습니다.
— Jim Garrison

@JimGarrison은 물론 더 구체적이지 않아야합니다. 죄송합니다. UI 요소 중 일부가 움직이지 않도록 올바른 컨텍스트에서 사용성이 손상됩니다.
— tmkly3

매우 작은 현대 스크롤 막대에 가까울 때 바탕 화면에서 드래그 할 배경 요소가 있거나 브라우저 창 뒤에서 파일에서 href 코드 행이 브라우저 창 뒤에서 열리면 더 유용합니다! 스크롤을 테스트 할 때마다 막대를 정확하게 누르지 마십시오.
— Garavani

1
이것은 파이어 폭스에서 오랫동안 알려진 문제였습니다 ( 복제? )
— 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에서 계속 드래그 할 수 있지만 Masadow의 ondragstart = "return false;"를 추가하면 이미지 태그 속성을 수정했습니다.
— 앤드류 페이트

3
크롬으로 드래그 할 수 있습니다
— lonewarrior556

54

솔루션을 공유하는 것을 잊어 버렸습니다 .JS를 사용하지 않고이를 수행 할 수있는 방법을 찾을 수 없었습니다. @Jeffery A Wooden에서 제안한 CSS가 다루지 않는 코너 사례가 있습니다.

이것은 모든 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 ();});
— 피트 B

3
<img src="..." draggable="false" style="-moz-user-select: none;" ondragstart="return false;">OP의 코드와 일치 하도록 작성할 수도 있습니다 .
— Masadow

38

pointer-eventsCSS 에서 속성을 사용하고 '없음'과 동일하게 설정할 수 있습니다

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

이 크로스 브라우저를 작동하기 때문에 저를 위해 너무, "포인터 이벤트는"이 솔루션은 ( "사용자가 드래그"적어도 11.2018에, 파이어 폭스에 영향을주지 않습니다)이었다
— 데이비드 달 BUSCO

2

특히 Windows Edge 브라우저에 대한 일반적인 솔루션 (-ms-user-select : none, CSS 규칙이 작동하지 않음) :

window.ondragstart = function() {return false}

참고 : 이렇게 하면 클릭 이벤트가 계속 필요할 때 (예 :를 사용할 수 없음 ) draggable="false"모든 img태그 에 추가 pointer-events: none하지 않아도되지만 드래그 아이콘 이미지를 표시하지 않아도됩니다.


실제로 나를 위해 작동하는 유일한 대답! 왜 더 높은 투표를했는지 모르십시오.
— AldaronLau

1

이미지를 배경 이미지로 설정할 수 있습니다. 그것은 이후에 상주 div하고,이 divundraggable이다 이미지 undraggable 것이다 :

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

1

이미지와 크기가 같고 이미지 위에 위치한 div 요소를 만들었습니다 . 그런 다음 마우스 이벤트는 이미지 요소로 이동하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.