【问题标题】:Shade entire page, unshade selected elements on hover对整个页面进行着色,在悬停时取消对选定元素的着色
【发布时间】:2011-06-08 16:09:15
【问题描述】:

我正在尝试制作一个页面检查工具,其中:

  • 整个页面都有阴影
  • 悬停的元素没有阴影。

与灯箱类型的应用程序(类似)不同,悬停的项目应保持原位并且(理想情况下)不会重复。

最初,在查看图像灯箱实现时,我想在文档中附加一个叠加层,然后在悬停时提高元素的 z-index。然而,这种技术在这种情况下不起作用,因为覆盖会阻止额外的鼠标悬停:

$(function() {
    window.alert('started');
    $('<div id="overlay" />').hide().appendTo('body').fadeIn('slow');


    $("p").hover(
        function () {
            $(this).css( {"z-index":5} );
        }, 
        function () {
            $(this).css( {"z-index":0} );
        }
    );

另外,JQueryTools 有一个“暴露”和“掩码”工具,我用下面的代码尝试过:

$(function() {
    $("a").click(function() {
         alert("Hello world!");
    });

    // Mask whole page
    $(document).mask("#222");

    // Mask and expose on however / unhover 
    $("p").hover(
        function () {
            $(this).expose();
        }, 
        function () {
            $(this).mask();
        }
    );

}); 

除非我禁用初始页面屏蔽,否则悬停不起作用。关于如何最好地实现这一点的任何想法,使用普通的 JQuery、JQuery 工具公开或其他一些技术?谢谢!

【问题讨论】:

    标签: javascript jquery dom jquery-tools


    【解决方案1】:

    您可以做的是复制元素并将其插入到覆盖层之外的 DOM 中(具有更高的 z-index)。为此,您需要计算其位置,但这并不太难。

    这是working example

    在写这篇文章时,我重新了解到零不透明度的东西不能触发事件的事实。因此你不能使用 .fade(),你必须专门将不透明度设置为一个非零但非常小的数字。

    $(document).ready(function() { init() })
    
    function init() {
        $('.overlay').show()
        $('.available').each(function() {
           var newDiv = $('<div>').appendTo('body');
           var myPos = $(this).position()  
           newDiv.addClass('available')
           newDiv.addClass('peek')
           newDiv.addClass('demoBorder')                
           newDiv.css('top',myPos.top+'px')
           newDiv.css('left',myPos.left+'px')
           newDiv.css('height',$(this).height()+'px')
           newDiv.css('width',$(this).width()+'px')  
           newDiv.hover(function()
              {newDiv.addClass('full');newDiv.stop();newDiv.fadeTo('fast',.9)},function()
              {newDiv.removeClass('full');newDiv.fadeTo('fast',.1)})   
        })  
    }
    

    【讨论】:

    • 谢谢。但是,如果覆盖阻止选择,我如何将鼠标悬停在元素上?
    • 加载页面时,找到所有符合效果的元素。在覆盖的顶部以相同的尺寸在相同位置创建一个空 DIV。将一个事件连接到这些将显示内容的事件。
    • 是的。在它们上加上边框以进行测试,以便您知道它们在哪里。
    • 我想我不太明白的是顶层 div(将捕获悬停事件的那个)如何将这些事件附加到相应的底层层。覆盖层顶部是否必须有每个底层元素的 1:1 副本?感谢您的想法。
    • 在这里,我想我真的会建造它,只是为了好玩。 jsfiddle.net/ByEt5/1
    【解决方案2】:

    很抱歉原型语法,但这可能会给你一个好主意。

    function overlay() {
      var div = document.createElement('div');
      div.setStyle({
        position: "absolute",
        left: "0px",
        right: "0px",
        top: "0px",
        bottom: "0px",
        backgroundColor: "#000000",
        opacity: "0.2",
        zIndex: "20"
      })
      div.setAttribute('id','over');
      $('body').insert(div);
    }
    
    $(document).observe('mousemove', function(e) {
      var left = e.clientX,
          top = e.clientY,
          ele = document.elementFromPoint(left,top);
          //from here you can create that empty div and insert this element in there
    })
    
    overlay();
    

    【讨论】:

    • 谢谢。覆盖部分很明显,但你能解释一下其余部分吗?是什么让鼠标移动被检测为影响元素而不是覆盖?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    相关资源
    最近更新 更多