私はあなたと何かを共有したかっただけです。とイベントで
苦労しました。 ng-mouseenter
ng-mouseleave
ケーススタディ:
カーソルをアイコンの上に置くとトグルするフローティングナビゲーションメニューを作成しました。
このメニューは各ページの上部にありました。
- メニューの表示/非表示を処理するには、クラスを切り替えます。
ng-class="{down: vm.isHover}"
- vm.isHoverを切り替えるには、ngマウスイベントを使用します。
ng-mouseenter="vm.isHover = true"
ng-mouseleave="vm.isHover = false"
今のところ、すべてが問題なく、期待どおりに機能しました。
解決策はクリーンでシンプルです。
入ってくる問題:
特定のビューで、要素のリストがあります。
カーソルがリストの要素の上にあるときにアクションパネルを追加しました。
上記と同じコードを使用して動作を処理しました。
問題:
カーソルがフローティングナビゲーションメニューにあり、要素の上部にもあると、お互いに矛盾があることがわかりました。
アクションパネルが表示され、フローティングナビゲーションが非表示になりました。
問題は、カーソルがフローティングナビゲーションメニューの上にある場合でも、リスト要素ng-mouseenterがトリガーされることです。
マウスの伝播イベントが自動的に中断することを期待しているので、私には意味がありません。
私はがっかりしたと言わざるを得ません。私はその問題を見つけるために少し時間を費やします。
最初の考え:
私はこれらを使用しようとしました:
$event.stopPropagation()
$event.stopImmediatePropagation()
多くのngポインターイベント(mousemove、mouveoverなど)を組み合わせましたが、どれも役立ちません。
CSSソリューション:
私はますます使用する単純なcssプロパティを持つソリューションを見つけました:
pointer-events: none;
基本的に、私はそれを(私のリスト要素で)そのように使用します:
ng-style="{'pointer-events': vm.isHover ? 'none' : ''}"
このトリッキーなものでは、ng-mouseイベントはトリガーされなくなり、カーソルがリスト上の要素の上にあるときにフローティングナビゲーションメニューが閉じなくなります。
さらに進むには:
ご想像のとおり、このソリューションは機能しますが、私は好きではありません。
私たちは私たちのイベントを制御していません、それは悪いです。
さらに、それvm.isHover
を達成するためにスコープへのアクセス権が必要であり、それは不可能または可能ではあるが何らかの方法でダーティである可能性があります。
誰かが見たいのなら、私はフィドルを作ることができます。
それにもかかわらず、私には別の解決策がありません...
長い話で、私はあなたにジャガイモを与えることができないので、私の友人を許してください。
とにかく、pointer-events: none
人生なので、覚えておいてください。