border
와 함께 background:transparent
가 있는 div
가 있습니다. 이 div
아래에는 더 많은 요소가 있습니다.
div
외부를 클릭하면 기본 요소를 클릭할 수 있습니다. div
직접 클릭하면 기본 요소를 클릭할 수 없습니다.
기본 요소를 클릭할 수 있도록 div
를 클릭할 수 있기를 원합니다.
질문자 :Ryan
border
와 함께 background:transparent
가 있는 div
가 있습니다. 이 div
아래에는 더 많은 요소가 있습니다.
div
외부를 클릭하면 기본 요소를 클릭할 수 있습니다. div
직접 클릭하면 기본 요소를 클릭할 수 없습니다.
기본 요소를 클릭할 수 있도록 div
를 클릭할 수 있기를 원합니다.
예, 할 수 있습니다.
pointer-events: none
을 IE11용 CSS 조건문(IE10 이하에서는 작동하지 않음)과 함께 사용하면 이 문제에 대한 브라우저 간 호환 솔루션을 얻을 수 있습니다.
AlphaImageLoader
사용하면 오버레이 div
에 투명한 .PNG/.GIF
넣고 클릭이 아래 요소로 흐르게 할 수도 있습니다.
CSS:
pointer-events: none; background: url('your_transparent.png');
IE11 조건부:
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='your_transparent.png', sizingMethod='scale'); background: none !important;
다음은 모든 코드가 포함된 기본 예제 페이지입니다.
예, 겹치는 레이어가 클릭 이벤트를 통과하도록 강제 할 수 있습니다(무시).
게다가 당신은 이 행동에서 특정 아이들을 제외 시킬 수 있습니다...
pointer-events
사용하여 이 작업을 수행할 수 있습니다.
pointer-events
는 클릭, 탭, 스크롤 및 호버 이벤트에 대한 반응에 영향을 줍니다.
당신이 설정한 언급된 이벤트를 무시/통과해야 하는 레이어에서
pointer-events: none;
마우스/탭 이벤트에 다시 반응해야 하는 응답하지 않는 레이어의 자식은 다음이 필요합니다.
pointer-events: auto;
이 두 번째 부분은 자식 요소와 해당 자식 요소만 클릭할 수 있어야 하는 여러 겹치는 div 레이어(일부 부모는 투명함)로 작업하는 경우 매우 유용합니다.
사용 예:
<style> .parent { pointer-events:none; } .child { pointer-events:auto; } </style> <div class="parent"> <a href="#">I'm unresponsive</a> <a href="#" class="child">I'm clickable again, wohoo !</a> </div>
div
를 통해 기본 요소를 클릭하도록 허용하는 것은 브라우저에 따라 다릅니다. Firefox, Chrome, Safari 및 Opera를 포함한 모든 최신 브라우저는pointer-events:none
이해합니다.
IE의 경우 배경에 따라 다릅니다. 배경이 투명하면 아무 것도 할 필요 없이 클릭연결이 작동합니다. 반면에 background:white; opacity:0; filter:Alpha(opacity=0);
, IE는 수동 이벤트 전달이 필요합니다.
JSFiddle 테스트 및 CanIUse 포인터 이벤트를 참조하십시오.
여기에 전체를 보지 못했기 때문에이 답변을 추가하고 있습니다. elementFromPoint를 사용하여 이 작업을 수행할 수 있었습니다. 그래서 기본적으로:
var range-selector= $("") .css("position", "absolute").addClass("range-selector") .appendTo("") .click(function(e) { _range-selector.hide(); $(document.elementFromPoint(e.clientX,e.clientY)).trigger("click"); });
제 경우에는 오버레이 div가 절대 위치에 있습니다. 이것이 차이를 만드는지 확실하지 않습니다. 이것은 적어도 IE8/9, Safari Chrome 및 Firefox에서 작동합니다.
$('#elementontop').click(e => { $('#elementontop').hide(); $(document.elementFromPoint(e.clientX, e.clientY)).trigger("click"); $('#elementontop').show(); });
나는 이것을해야했고이 경로를 선택하기로 결정했습니다.
$('.overlay').click(function(e){ var left = $(window).scrollLeft(); var top = $(window).scrollTop(); //hide the overlay for now so the document can find the underlying elements $(this).css('display','none'); //use the current scroll position to deduct from the click position $(document.elementFromPoint(e.pageX-left, e.pageY-top)).click(); //show the overlay again $(this).css('display','block'); });
현재 캔버스 말풍선으로 작업하고 있습니다. 그러나 포인터가 있는 풍선은 div로 둘러싸여 있기 때문에 그 아래의 일부 링크는 더 이상 클릭할 수 없습니다. 이 경우 extjs를 사용할 수 없습니다. 내 말풍선 튜토리얼에 대한 기본 예를 보려면 HTML5가 필요합니다.
그래서 배열의 풍선 내부에서 모든 링크 좌표를 수집하기로 결정했습니다.
var clickarray=[]; function getcoo(thatdiv){ thatdiv.find(".link").each(function(){ var offset=$(this).offset(); clickarray.unshift([(offset.left), (offset.top), (offset.left+$(this).width()), (offset.top+$(this).height()), ($(this).attr('name')), 1]); }); }
각 (새) 풍선에서 이 함수를 호출합니다. link.class의 왼쪽/위쪽 및 오른쪽/아래쪽 모서리 좌표를 가져옵니다. 추가로 누군가가 해당 좌표를 클릭하는 경우 수행할 작업에 대한 이름 속성이 있고 1을 설정하는 것을 좋아했는데 이는 클릭되지 않았음을 의미합니다. . 그리고 이 배열을 클릭 배열로 이동 해제합니다. 푸시를 사용할 수도 있습니다.
해당 배열로 작업하려면:
$("body").click(function(event){ event.preventDefault();//if it is a a-tag var x=event.pageX; var y=event.pageY; var job=""; for(var i in clickarray){ if(x>=clickarray[i][0] && x<=clickarray[i][2] && y>=clickarray[i][1] && y<=clickarray[i][3] && clickarray[i][5]==1){ job=clickarray[i][4]; clickarray[i][5]=0;//set to allready clicked break; } } if(job.length>0){ // --do some thing with the job -- } });
이 함수는 본문 클릭 이벤트의 좌표 또는 이미 클릭되었는지 여부를 증명하고 name 속성을 반환합니다. 더 깊이 들어갈 필요는 없다고 생각하지만 그렇게 복잡하지 않다는 것을 알 수 있습니다. 희망은 엔리쉬...
(상황에 따라) 시도할 또 다른 아이디어는 다음과 같습니다.
이견있는 사람?
아니요, 요소를 '통과'할 수 없습니다. 클릭 좌표를 얻고 클릭된 요소 아래에 어떤 요소가 있었는지 알아낼 수 있지만 이것은 document.elementFromPoint
가 없는 브라우저에서 정말 지루합니다. 그런 다음 여전히 클릭의 기본 동작을 에뮬레이트해야 합니다. 이 작업은 그 아래에 있는 요소에 따라 반드시 사소한 것은 아닙니다.
완전히 투명한 창 영역이 있으므로 외부 주위에 별도의 테두리 요소로 구현하는 것이 더 나을 것입니다. 중앙 영역을 방해하지 않고 그냥 클릭하면 바로 통과할 수 있습니다.
예를 들어 모든 HTML 추출 주위 a
태그를 래핑하십시오.
<a href="/categories/1"> <img alt="test1" class="img-responsive" src="/assets/photo.jpg" /> <div class="caption bg-orange"> <h2> test1 </h2> </div> </a>
내 예에서 내 캡션 클래스에는 pointer-events:none이 있는 호버 효과가 있습니다. 당신은 그냥 잃을 것입니다
콘텐츠를 래핑하면 호버 효과가 유지되고 div가 포함된 모든 그림을 클릭할 수 있습니다 .
마크업 변경을 고려할 수 있다고 생각합니다. 내가 틀리지 않은 경우 문서 위에 보이지 않는 레이어를 배치하고 보이지 않는 마크업이 문서 이미지 앞에 있을 수 있습니다(이것이 맞습니까?).
대신 문서 이미지 바로 뒤에 보이지 않는 위치에 놓고 위치를 절대 위치로 변경하는 것을 제안합니다.
position: relative를 가지려면 부모 요소가 필요하며 이 아이디어를 사용할 수 있습니다. 그렇지 않으면 절대 레이어가 왼쪽 상단 모서리에 배치됩니다.
절대 위치 요소는 정적 위치가 아닌 첫 번째 상위 요소를 기준으로 배치됩니다. 그러한 요소가 없으면 포함하는 블록은 html입니다.
도움이 되었기를 바랍니다. CSS 위치 지정에 대한 자세한 내용은 여기 를 참조하세요.
나는 event.stopPropagation();
여기서도 언급해야 한다. 이것을 버튼의 클릭 기능에 추가하십시오.
이벤트가 DOM 트리를 버블링하는 것을 방지하여 부모 핸들러가 이벤트에 대해 알림을 받는 것을 방지합니다.
더 쉬운 방법은 다음과 같이 데이터 URI를 사용하여 투명한 배경 이미지를 인라인하는 것입니다.
.click-through { pointer-events: none; background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); }
그런 식으로 작동하지 않습니다. 해결 방법은 각 요소가 차지하는 영역에 대해 마우스 클릭 좌표를 수동으로 확인하는 것입니다.
요소가 차지하는 영역은 1. 페이지의 왼쪽 상단을 기준으로 요소의 위치를 파악하고, 2. 너비와 높이를 통해 찾을 수 있습니다. jQuery와 같은 라이브러리를 사용하면 일반 js에서 수행할 수 있지만 이 작업을 매우 간단하게 수행할 수 있습니다. document
mousemove
에 대한 이벤트 핸들러를 추가하면 페이지의 상단과 왼쪽에서 마우스 위치가 지속적으로 업데이트됩니다. 마우스가 주어진 개체 위에 있는지 결정하는 것은 마우스 위치가 요소의 왼쪽, 오른쪽, 위쪽 및 아래쪽 가장자리 사이에 있는지 확인하는 것으로 구성됩니다.
다음과 같은 AP 오버레이를 배치할 수 있습니다.
#overlay { position: absolute; top: -79px; left: -60px; height: 80px; width: 380px; z-index: 2; background: url(fake.gif); }
<div id="overlay"></div>
클릭을 원하지 않는 곳에 그냥 놓으십시오. 모두에서 작동합니다.
이것은 질문에 대한 정확한 답변은 아니지만 해결 방법을 찾는 데 도움이 될 수 있습니다.
페이지로드시 숨기고 AJAX 호출을 기다릴 때 표시 한 다음 다시 숨기는 이미지가있었습니다 ...
페이지를 로드할 때 내 이미지를 표시한 다음 사라지게 하고 이미지를 숨기기 전에 이미지를 클릭할 수 있게 하는 유일한 방법은 이미지를 DIV에 넣고 DIV의 크기를 10x10픽셀 이하로 만드는 것뿐입니다. 문제를 일으키지 않고 포함하는 div를 숨기기에 충분합니다. 이렇게 하면 이미지가 보이는 동안 div가 오버플로될 수 있으며 div가 숨겨져 있을 때 DIV가 포함하고 표시하고 있던 이미지의 전체 크기가 아니라 아래에 있는 개체를 클릭할 수 없는 경우 div 영역만 영향을 받았습니다.
CSS display=none/block, opacity=0, hidden=true로 이미지 숨기기를 포함하여 이미지를 숨기는 모든 방법을 시도했습니다. 그들 모두는 내 이미지가 숨겨지는 결과를 가져왔지만 그것이 아래에 있는 물건 위에 덮개가 있는 것처럼 작동하도록 표시된 영역은 클릭 등이 기본 개체에 작용하지 않습니다. 이미지가 작은 DIV 내부에 있고 작은 DIV를 숨기면 이미지가 차지하는 전체 영역이 깨끗해지고 숨긴 DIV 아래의 작은 영역만 영향을 받았지만 충분히 작게(10x10픽셀) 만들면서 문제가 발생했습니다. (일종의) 고정되었습니다.
나는 이것이 간단한 문제에 대한 더러운 해결 방법이라는 것을 알았지만 컨테이너 없이 기본 형식으로 개체를 숨길 방법을 찾을 수 없었습니다. 내 개체는 등의 형태였습니다. 누구든지 더 나은 방법이 있으면 알려주십시오.
오버레이와 기본 요소가 모두 클릭 가능/선택 가능하기를 원했기 때문에 시나리오에서 항상 pointer-events: none
을 사용할 수는 없었습니다.
DOM 구조는 다음과 같습니다.
<div id="outerElement"> <div id="canvas-wrapper"> <canvas id="overlay"></canvas> </div> <!-- Omitted: element(s) behind canvas that should still be selectable --> </div>
( outerElement
, canvas-wrapper
및 canvas
요소의 크기는 동일합니다.)
캔버스 뒤에 있는 요소가 정상적으로 작동하도록(예: 선택 가능, 편집 가능) 다음 코드를 사용했습니다.
canvasWrapper.style.pointerEvents = 'none'; outerElement.addEventListener('mousedown', event => { const clickedOnElementInCanvas = yourCheck // TODO: check if the event *would* click a canvas element. if (!clickedOnElementInCanvas) { // if necessary, add logic to deselect your canvas elements ... wrapper.style.pointerEvents = 'none'; return true; } // Check if we emitted the event ourselves (avoid endless loop) if (event.isTrusted) { // Manually forward element to the canvas const mouseEvent = new MouseEvent(event.type, event); canvas.dispatchEvent(mouseEvent); mouseEvent.stopPropagation(); } return true; });
일부 캔버스 개체는 입력 필드와 함께 제공되므로 키보드 이벤트도 허용해야 했습니다. 이렇게 하려면 캔버스 입력 필드에 현재 포커스가 있는지 여부에 pointerEvents
속성을 업데이트해야 했습니다.
onCanvasModified(canvas, () => { const inputFieldInCanvasActive = // TODO: Check if an input field of the canvas is active. wrapper.style.pointerEvents = inputFieldInCanvasActive ? 'auto' : 'none'; });
출처 : http:www.stackoverflow.com/questions/3680429/click-through-div-to-underlying-elements
RegEx는 XHTML 자체 포함 태그를 제외한 열린 태그와 일치합니다. (0) | 2021.12.31 |
---|---|
두 Git 리포지토리를 어떻게 병합합니까? (0) | 2021.12.30 |
JavaScript 개체를 표시하려면 어떻게 해야 합니까? (0) | 2021.12.30 |
프록시 서버와 역방향 프록시 서버의 차이점은 무엇입니까? [닫은] (0) | 2021.12.30 |
특정 파일을 어떻게 git stash 할 수 있습니까? (0) | 2021.12.30 |