と一緒にを持ってdiv
います。この の下に、さらに要素があります。background:transparent
border
div
現在、オーバーレイの外側をクリックすると、下にある要素をクリックできますdiv
。ただし、オーバーレイを直接クリックすると、下にある要素をクリックできませんdiv
。
div
これをクリックして、下にある要素をクリックできるようにしたいと考えています。
と一緒にを持ってdiv
います。この の下に、さらに要素があります。background:transparent
border
div
現在、オーバーレイの外側をクリックすると、下にある要素をクリックできますdiv
。ただし、オーバーレイを直接クリックすると、下にある要素をクリックできませんdiv
。
div
これをクリックして、下にある要素をクリックできるようにしたいと考えています。
はい、できます。
pointer-events: none
IE11 用の CSS 条件ステートメント (IE10 以下では機能しません) と一緒に使用すると、この問題に対するクロスブラウザー互換のソリューションを得ることができます。
を使用するAlphaImageLoader
と、透明な.PNG/.GIF
をオーバーレイdiv
に配置して、クリックを下の要素に流すこともできます。
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;
その 2 番目の部分は、複数の重複する div レイヤー (おそらくいくつかの親が透明である) で作業する場合に非常に役立ちます。そこでは、子要素をクリックし、その子要素のみをクリックできるようにする必要があります。
使用例:
.parent {
pointer-events:none;
}
.child {
pointer-events:auto;
}
<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 の左/上および右/下のコーナーの座標を取得します。さらに、誰かがその座標をクリックした場合にどうするかを示す name 属性を取得します。私は、クリックされなかったことを意味する 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 属性を返します。深く掘り下げる必要はないと思いますが、それほど複雑ではないことがわかります。ホープインはenlishでした...
(状況に応じて)試す別のアイデアは次のとおりです。
何かご意見は?
a
たとえば、すべての HTML 抽出物をタグで囲むだけです。
<a href="/categories/1">
<img alt="test1" class="img-responsive" src="/assets/photo.jpg" />
<div class="caption bg-orange">
<h2>
test1
</h2>
</div>
</a>
私の例では、キャプション クラスにホバー効果があります。あなたはただ失うでしょう
コンテンツをラップすると、ホバー効果が保持され、div を含むすべての画像をクリックできます。
いいえ、要素をクリックして「スルー」することはできません。クリックの座標を取得して、クリックされた要素の下にある要素を見つけようとすることはできますが、document.elementFromPoint
. 次に、クリックのデフォルト アクションをエミュレートする必要があります。これは、その下にある要素によっては必ずしも簡単ではありません。
完全に透明なウィンドウ領域があるので、それを外側の別の境界要素として実装し、中央領域を障害物から解放して、本当にまっすぐクリックできるようにしたほうがよいでしょう。
マークアップの変更を検討できると思います。私が間違っていなければ、ドキュメントの上に不可視のレイヤーを配置したいと考えており、不可視のマークアップがドキュメントの画像の前にある可能性があります (これは正しいですか?)。
代わりに、ドキュメント画像の直後に非表示を配置し、位置を絶対に変更することを提案します。
position: relative を持つには親要素が必要であることに注意してください。そうすれば、このアイデアを使用できるようになります。そうしないと、絶対レイヤーが左上隅に配置されます。
絶対位置要素は、静的以外の位置を持つ最初の親要素を基準にして配置されます。そのような要素が見つからない場合、含まれているブロックは html です。
お役に立てれば。CSS ポジショニングの詳細については、こちらを参照してください。
event.stopPropagation();
ここでも言及されるべきだと思います。これをボタンの Click 関数に追加します。
イベントが DOM ツリーをバブリングしないようにして、親ハンドラーにイベントが通知されないようにします。
そのようには機能しません。回避策は、各要素が占める領域に対するマウス クリックの座標を手動でチェックすることです。
要素が占める領域は、1. ページの左上を基準とした要素の位置を取得し、2. 幅と高さによって見つけることができます。jQuery のようなライブラリを使用すると、単純な js でも実行できますが、これは非常に簡単になります。mousemove
オブジェクトにのイベント ハンドラーを追加するdocument
と、ページの上部と左側からのマウス位置が継続的に更新されます。マウスが特定のオブジェクトの上にあるかどうかを判断するには、マウスの位置が要素の左端、右端、上端、下端の間にあるかどうかを確認します。
オーバーレイとその下にある要素の両方をクリック可能/選択可能にしたかったので、私のシナリオでは常に使用できるとは限りませんでした。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';
});
次のような AP オーバーレイを配置できます...
#overlay {
position: absolute;
top: -79px;
left: -60px;
height: 80px;
width: 380px;
z-index: 2;
background: url(fake.gif);
}
<div id="overlay"></div>
クリックしたくない場所に置くだけです。すべてで動作します。