divをクリックして基本要素に移動


1592

私が持っているdiv持っているbackground:transparentと一緒に、border。この下にdiv、もっと要素があります。

現在、オーバーレイの外側をクリックすると、基になる要素をクリックできますdiv。ただし、オーバーレイを直接クリックすると、基になる要素をクリックできませんdiv

これdivをクリックして、下にある要素をクリックできるようにしたいと考えています。

私の問題

回答:


2615

はい、あなたはCAN、これを行います。

使い方pointer-events: none(IE10以下では動作しません)IE11のためのCSS条件文と一緒に、あなたがこの問題のために、クロスブラウザの互換性ソリューションを得ることができます。

を使用すると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;

以下は、すべてのコードを含む基本的なサンプルページです。


7
そのdivで遷移またはホバー状態を使用している場合はどうなりますか?
Manticore 2013年

2
@マンティコア短い答え:できません。この場合、提供された回答は機能しません。
Niels Abildgaard

10
IE11は、ポインターイベントを完全にサポートしています。これは、すべての最新のブラウザがサポートしていることを意味します。これは2014年後半の時点で実行可能なソリューションです。caniuse.com/#search
Judah Gabriel Himango

@Andyが述べたように、これはスクロールを中断します。別の問題を開いて、このstackoverflow.com/questions/41592349/…の
Oliver Joseph Ash

1
@Manticore「ポインタイベント:なし」を上書きできることがわかりました。ネストされた要素の場合、クリックをバイパスして何かを取得し、クリックを超えるものを書き込むことができます。上書きされた部分については、エフェクトとクリックを使用できます
Luca C.

292

また
、親要素(おそらく透明なdiv)のポインターイベントを無効にすることもできますが、その子要素に対しては引き続き有効にすることができます。
これは、親レイヤーがマウスイベントにまったく反応しないようにしながら、子要素をクリックできるようにする複数の重複するdivレイヤーで作業する場合に役立ちます。

このため、すべてのpointer-events: none子のdivが取得され、そのクリック可能な子が次のように再度有効になるポインターイベントを取得します。pointer-events: auto

.parent {
    pointer-events:none;        
}
.child {
    pointer-events:auto;
}

<div class="some-container">
   <ul class="layer-0 parent">
     <li class="click-me child"></li>
     <li class="click-me child"></li>
   </ul>

   <ul class="layer-1 parent">
     <li class="click-me-also child"></li>
     <li class="click-me-also child"></li>
   </ul>
</div>

4
完璧です、これは私が必要とするものです!
RobbyReindeer


43

ユーザーがaをクリックdivして基本要素にアクセスできるかどうかは、ブラウザによって異なります。Firefox、Chrome、Safari、Operaなどの最新のブラウザはすべてを理解していpointer-events:noneます。

IEの場合、背景に依存します。背景が透明の場合、何もしなくてもクリックスルーは機能します。一方、などのbackground:white; opacity:0; filter:Alpha(opacity=0);場合、IEは手動のイベント転送を必要とします。

JSFiddleテストCanIUseポインターイベントを参照してください。


20

ここでは完全に表示されなかったので、この回答を追加します。elementFromPointを使用してこれを行うことができました。だから基本的に:

  • クリックしたいdivにクリックをアタッチします
  • それを隠す
  • ポインターが置かれている要素を判別する
  • そこで要素のクリックを発生させます。
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で少なくとも動作します。


12
  1. 要素のオーバーレイを非表示にする
  2. カーソル座標を決定する
  3. それらの座標の要素を取得する
  4. 要素のクリックをトリガー
  5. オーバーレイ要素を再度表示
$('#elementontop').click(e => {
    $('#elementontop').hide();
    $(document.elementFromPoint(e.clientX, e.clientY)).trigger("click");
    $('#elementontop').show();
});

アポストロフィを閉じるのを忘れましたか?多分する$('#elementontop)必要があり$('#elementontop')ますか?
ヨハンチョピン

10

私はこれを行う必要があり、このルートを取ることを決めました:

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

6

現在、キャンバスの吹き出しを使用しています。しかし、ポインタの付いたバルーンは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を設定するのが好きでした。 。そして、この配列をclickarrayにシフト解除します。プッシュも使用できます。

その配列を操作するには:

$("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属性を返します。深く掘り下げる必要はないと思いますが、それほど複雑ではありません。希望は英語でした...


4

そのようには機能しません。回避策は、各要素が占める領域に対してマウスクリックの座標を手動でチェックすることです。

要素が占める領域は、1。ページの左上を基準とした要素の位置を取得し、2。幅と高さを見つけることで見つけることができます。jQueryのようなライブラリはこれをかなり単純にしますが、プレーンなjsで行うこともできます。イベントハンドラを追加することmousemovedocument、オブジェクトは、ページの最上部と左からマウス位置の継続的な更新を提供します。マウスが特定のオブジェクト上にあるかどうかを判断するには、マウスの位置が要素の左端、右端、上端、下端の間にあるかどうかを確認します。


2
上記のように、透明なコンテナでCSS {pointer-events:none;}を使用してこれを実現できます。
Empereol

4

いいえ、要素をクリックすることはできません。クリックの座標を取得して、クリックされた要素の下にある要素を特定することができますが、これがないブラウザでは、これは非常に面倒ですdocument.elementFromPoint。次に、クリックのデフォルトアクションをエミュレートする必要があります。これは、その下にある要素によっては、必ずしも簡単なことではありません。

完全に透明なウィンドウ領域があるので、外側の周りの個別の境界要素として実装し、中央領域に障害物を残さないようにすることで、真っ直ぐクリックできるようになります。


4

(状況的に)試す別のアイデアは、次のとおりです。

  1. 必要なコンテンツをdivに配置します。
  2. クリックしないオーバーレイをページ全体に配置し、Zインデックスを高くします。
  3. 元のdivの別のトリミングされたコピーを作成する
  4. overlayとabsは、コピーdivを、より高いz-indexでクリック可能にする元のコンテンツと同じ場所に配置しますか?

何かご意見は?


2

マークアップの変更を検討できると思います。私が間違っていない場合は、ドキュメントの上に非表示レイヤーを配置し、非表示マークアップがドキュメントイメージの前にある可能性があります(これは正しいですか?)。

代わりに、ドキュメントイメージの直後に非表示を配置し、位置を絶対に変更することをお勧めします。

position:relativeを持つには親要素が必要であり、このアイデアを使用できるようになることに注意してください。それ以外の場合、絶対レイヤーは左上隅に配置されます。

絶対位置要素は、静的以外の位置を持つ最初の親要素に対して相対的に配置されます。そのような要素が見つからない場合、包含ブロックはhtmlです。

お役に立てれば。CSSの配置について詳しくは、こちらをご覧ください。


2

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を含むすべての画像をクリックできます


いい視点ね!thnks
Mr.Vertigo

1

次のようなAPオーバーレイを配置できます...

#overlay {
  position: absolute;
  top: -79px;
  left: -60px;
  height: 80px;
  width: 380px;
  z-index: 2;
  background: url(fake.gif);
}
<div id="overlay"></div>

あなたがしたくない場所、つまりclikedの上に置くだけです。すべてで機能します。


1

より簡単な方法は、次のようにデータURIを使用して透明な背景画像をインライン化することです。

.click-through {
    pointer-events: none;
    background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
}

0

event.stopPropagation();ここでも言及すべきだと思います。これをボタンのクリック機能に追加します。

イベントがDOMツリーを泡立たせないようにし、親ハンドラーにイベントが通知されないようにします。


0

これは質問に対する正確な回答ではありませんが、回避策を見つけるのに役立つ場合があります。

ページの読み込み時に非表示にしていて、AJAX呼び出しを待機しているときに表示していた画像を再度非表示にしました...

ページを読み込むときに画像を表示し、それを非表示にして、画像を非表示にする前にクリックできるようにする唯一の方法を見つけました。DIVに画像を配置し、DIVのサイズを10x10ピクセル以下にしました。それが問題を引き起こしてから、それを含むdivを隠すのを防ぐのに十分です。これにより、表示中に画像がdivをオーバーフローし、divが非表示の場合、div領域のみが影響を受け、DIVに含まれ表示されていた画像のサイズ全体ではなく、下のオブジェクトをクリックできなくなりました。

CSS display = none / block、opacity = 0を含むすべての方法で画像を非表示にし、hidden = trueで画像を非表示にしました。それらすべてが私の画像を非表示にしましたが、画像の下にあるものの上にカバーがあったように機能するように表示されていた領域は、クリックなどが下にあるオブジェクトに機能しませんでした。画像が小さなDIVの中にあり、小さなDIVを非表示にすると、画像が占める領域全体がクリアになり、非表示にしたDIVの下の小さな領域のみが影響を受けましたが、十分に小さくしたため(10x10ピクセル)、問題修正されました(一種)。

これは単純な問題であるはずの汚い回避策であることがわかりましたが、コンテナーなしでネイティブ形式でオブジェクトを非表示にする方法を見つけることができませんでした。私のオブジェクトは等の形でした。誰かがより良い方法を持っているなら、私に知らせてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.