2017-02-03 5 views
1

私にはいくつかのメディアがあります。その上、ユーザーのマウスがアイドル状態のときに非表示にするコントロールのグループがあります。その後、ユーザーがマウスを動かすと再び表示されます。divが隠されているときにdivが親のmousemoveを起動させないようにする方法

私の問題は、コントロールがなくなると、親にmousemoveイベントがトリガーされるということです。これにより、コントロールが再び表示されます。ここで

はJSコードです:

(function($) { 
    var timer = null; 
    $('.outer').mousemove(function() { 
    $('.inner').fadeIn('slow'); 

    if (timer) { 
     window.clearInterval(timer); 
    } 
    timer = window.setTimeout(function() { 
     $('.inner').fadeOut('slow'); 
    }, 3000); 
    }); 
})(jQuery); 

そして、ここではフィドルです:https://jsfiddle.net/8oduhs96/

は今バイオリンは私のプロジェクトのような多くを見るために構成されています。マークアップを変更するための柔軟性があまりないので、JSやCSSソリューションが好まれます。

CSSの下位ブロックのコメントを解除して、マウスが青い領域にあるときにのみ問題が発生することを確認できます。

+0

(jQueryのfadeIn/fadeOutからdisplay:none/block;効果として)DOMの変更をトリガしません。メニューが隠されているかどうかに基づいて親のクラス。親がそのクラスを持っている場合は、ホバーをオンにします。 – eeetee

+0

私はあなたがマウスを移動しないときに、メニューが消えて、あなたが必要としていない問題を取得しないでください?また、https://jsfiddle.net/8oduhs96/7/ – romuleald

+1

@romulealdのようにaddClass/removeClassとCSSの移行を考えてみましょう。問題は、マウスを動かさずにすぐにメニューが再表示されることです。メニューが完全に削除されていないため、フィーリングに問題はありません。ただアルファ化されています。これは、IMOで、隠れた後にタイムアウトを使用するよりも受け入れやすいものです。あなたが答えを入力すると、私はそれを受け入れるでしょう。 – Sean

答えて

2

使用CSSや不透明度/可視性は、彼らは私が追加と削除試してみた

https://jsfiddle.net/8oduhs96/8/

+0

これは素晴らしいですが、fadeOutエフェクトを削除します。それにもクイックCSSの修正はありますか? – Sean

+1

.innerのtransitionプロパティ内の値を増やしてください。トランジションのパワーを理解するMDNの記事を見てください。https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Transitions/Using_CSS_transitions – romuleald

+1

Withトランジション:https://jsfiddle.net/8oduhs96/9/ – nikoskip

0

要素が表示されているかどうかをチェックすることができます。

(function($) { 
    var timer = null; 
    $('.outer').mousemove(function() { 
    console.log('MouseOver'); 
    if($('.inner').is(':visible')){ 
     console.log('Triggered'); 
     $('.inner').fadeIn('slow'); 

     if (timer) { 
     window.clearInterval(timer); 
     } 
     timer = window.setTimeout(function() { 
     $('.inner').fadeOut('slow'); 
     }, 3000); 
    } 
    }); 
})(jQuery); 
+0

私はフィドルでテストしましたが、これは.innerが再び表示されることを許しません。私は明確にするために質問を更新します。 – Sean

+0

表示されているチェックにelse文を追加すると、表示されていない場合はフェードインされます。タイムアウトに設定して、即座に表示されず、再び表示されないようにすることをお勧めします。 – Michael

0

マイケルは彼の答えに対するコメントで示唆しているように、タイムアウトを使用してUXの観点から解決しました。

私はまだ誰か他の人がどのように知っていたらタイムアウトを伴わないソリューションを好むでしょう。あなたの要素を非表示にする

(function($) { 
    var timer = null; 

    function setupOuter() { 
    $('.outer').mousemove(function() { 
     $('.inner').fadeIn('slow'); 
     $('.outer').off('mousemove'); 
    }); 
    } 
    setupOuter(); 

    $('.inner').mousemove(function() { 
    if (timer) { 
     window.clearInterval(timer); 
    } 
    timer = window.setTimeout(function() { 
     $('.inner').fadeOut('slow', function() { 
     window.setTimeout(setupOuter, 500); 
     }); 
    }, 3000); 
    }); 
})(jQuery); 
関連する問題