고스트 이미지의 드래그를 방지하는 CSS / JS?


152

사용자가 드래그하려고하는 이미지의 유령을 보지 못하게하는 방법이 있습니까 (이미지의 보안이 아니라 경험).

고스트 이미지가 아닌 텍스트와 이미지의 파란색 선택 문제를 해결하는 이것을 시도했습니다.

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

(또한 div에 동일한 규칙을 적용하여 div 안에 이미지를 중첩하려고 시도했습니다). 감사


1
이 답변보기 : stackoverflow.com/a/4211930/1060487 질문이 중복 될 수 있습니다
mattdlockyer

답변:


195

마크 업 또는 JavaScript 코드에서 draggable속성을 설정할 수 있습니다 false.

// 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
@ 그렉 : 왜 나 한테 물어? JavaScript 솔루션을 원했던 것은 OP입니다. 당신이 좋아하지 그래서 게다가 나는 어쨌든 "마크 업 또는 자바 스크립트 코드 중 하나에"말을했다 없습니다 당신이 당신의 마크 업을 편집 할 수있는 옵션이 있다면 마크 업에서 그것을 할.
BoltClock

12
FF와 함께 FF에서 작동하지 않습니다 -moz-user-select: none. 가능한 해결책 : 추가 pointer-events: none.
Cedric Reichenbach

9
어쩌면 나는 질문을 잘못 해석했지만 OP가 드래그 앤 드롭을 유지하고 고스트 된 이미지를 숨길 수있는 방법을 묻지 않습니까? 끌어 놓기를 완전히 사용하지 않도록 설정 draggable합니다 false.
James

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에서 작동하지 않습니다.
Tudor Ciotlos

34

시도 해봐:

img {
  pointer-events: none;
}

피하려고 노력하다

* {
  pointer-events: none;
}

8
이것은 요소와 상호 작용하는 모든 기능을 제거하기 때문에 좋지 않은 솔루션입니다. OP는 요소의 "드래그"기능을 비활성화하라고 요청하고 요소와의 모든 포인터 기반 상호 작용을 완전히 비활성화하지는 않습니다.
차드

4
@Chad는 사실이지만 이미지에 더 이상 유령 이미지가없는 동안 이미지를 래핑하고 이벤트 리스너를 래퍼에 추가 할 수 있습니다.
Vincent Hoch-Drei

18

CSS 속성을 사용하여 웹킷 브라우저에서 이미지를 비활성화 할 수 있습니다.

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

3
이것은 또한 작동 -ms-user-drag, -moz-user-draguser-drag. 훌륭한 CSS 전용 솔루션!
Beejor

14

클릭 및 호버와 같은 다른 이벤트는 유지하면서 모든 브라우저 에서 이미지를 드래그 할 수 없게됩니다 . HTML5, JS 또는 CSS를 사용할 수있는 한 작동합니다.

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

사용자에게 JS가 있다고 확신한다면 JS 속성 등 만 사용하면됩니다. 유연성을 높이려면 ondragstart, onselectstart 및 일부 WebKit 탭 / 터치 CSS를 살펴보십시오.


대신 (this.onclick || this.click) () 대신 할 수 있습니다. onclick 을이 논리에 따라 정의 할 수 없다면?
Van Nguyen

@Kaizoku 감사합니다, 나는 그것을 고려하지 않았습니다! 귀하의 제안에 따라 답변을 업데이트했습니다.
Beejor

<img>에는 onclick 또는 click 이벤트가 없기 때문에 FireFox에서는 작동하지 않는 것 같습니다. 어쨌든, 방금 onmouseup 부분을 사용하고 부모 DIV가 onclick을 처리하도록하고 작동합니다.
Nelson

@Nelson 감사합니다. onmousedown / up 처리기의 반환 값에 관계없이 onclick이 발생하기 때문에 onmouseup이 필요하지 않은 것 같습니다. 나는 단순성을 위해 대답을 수정하기로 결정했다. 새로운 원 라이너는 잘 작동합니다. FF, Safari, Chrome, IE8 / 10에서 테스트되었습니다.
Beejor

Firefox 62를 사용 중이며 onmousedown="return false"충분합니다. 또한 드래그하는 동안 사용자가 이미지를 선택하는 것을 피해야합니다. 그러면 이미지를 드래그하여 선택을 드래그 할 수 있습니다.
loxaxs

8

dragstart이벤트를 처리하십시오 return false.


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
setDragImageIE10 / 11과 같이 끌어서 놓기를 지원하더라도 모든 브라우저가 지원하지는 않습니다 .
James

실제로 빈 png를 사용하지 않고이 트릭을 사용할 수 있습니까?
Fabien Quatravaux

1
인라인으로 정의 된 base64로 인코딩 된 이미지를 사용할 수 있습니다. 예 :dragIcon.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
Murray Smith


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

편집 : 이것은 IE와 Firefox에서만 이상하게 작동합니다. 또한 draggable = false각 이미지에 추가 했습니다. 여전히 크롬과 사파리의 유령입니다.

편집 2 : 배경 이미지 솔루션이 실제로 가장 좋습니다. 유일한 미묘한 점은 background-size배경 이미지가 변경 될 때마다 속성을 재정의해야한다는 것입니다! 또는, 그것은 내 편에서 본 것입니다. 더 좋은 점은 imgIE에서 이미지 크기를 조정하지 못한 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

모든 브라우저 접두사를 사용하여 선택하거나 드래그하지 않는 Be-all-end-all

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


-1

이 작업은 저에게 약간의 라이트 박스 스크립트를 사용합니다.

.nodragglement {
    transform: translate(0px, 0px)!important;
}

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