【问题标题】:change background color with change in mouse position随着鼠标位置的变化改变背景颜色
【发布时间】:2010-04-29 12:09:56
【问题描述】:

我想知道是否可以借助鼠标坐标设置背景颜色。

我拥有的是:

我有一个可拖动的 DIV-A 和一些其他可放置的 div。

我需要的是:

每当我的 DIV-A 越过它们时,我需要突出显示页面上可放置的其他 div。我所拥有的是鼠标坐标,是否可以使用 jquery 在鼠标坐标的基础上应用 css。

【问题讨论】:

    标签: javascript jquery css jquery-ui


    【解决方案1】:

    以下内容可能会起作用。您可能需要处理窗口的 scrollLeft 和 scrollTop 以使其完美。您可能也想要throttlememoize(如果放置位置不变)。

    此外,还可以通过缓存offset(),仅在需要时绑定mousemove,并通过调整each 循环以利用优化循环(例如for(var i=droppables.length;i>-1;){var self = droppables.eq(--i);...})来调整它的更多性能。

    还请注意,这只会在鼠标经过它们时更改 div 的颜色...不一定在可拖动对象经过它们时...这会使事情变得更加复杂,但下面的函数应该会发送给您正确的方向。

    $(document).mousemove(function(e){
         // this should be throttled...
         var x = e.pageX,
             y = e.pageY;
         // this loop could be optimized...
         $("div.droppables").each(function(){
             // these vars could be memoized...
             var self = $(this),
                 divL = self.offset().left,
                 divT = self.offset().top,
                 divR = self.width() + divL,
                 divB = self.height() + divT;
             // if the MOUSE coords are between the droppable's coords
             // change the background color
             if(x >= divL && x <= divR && y >= divT && y <= divB){
                  self.css("background", "red");
             }
             else{
                  // reset the background color
                  self.css("background", "");   
             }
         });
    });
    

    【讨论】:

    • 我刚刚测试过了。没有错误。我已经更新了一些代码;试试看。另外,发布您实际使用的代码。
    • 它工作但不是我想要的方式。每当我的可拖动 div 越过它们时,我想突出显示这些 droppables
    • @Ashish:不要误会……我不会为你做所有的工作……任何 S.O.成员。我给了你一个很好的起点,这样你就可以弄清楚可拖动的边界和坐标。
    • 是的,我意识到.. 但问题是当前鼠标事件与整个文档相关联,当尝试使用我的可拖动 div 锚定它时它不起作用。目前,当我的鼠标经过突出显示的 div 时,我希望在可拖动的 div 越过它时也一样。无论如何我会试一试...谢谢....
    • 耶!另一个否决票,没有给出任何理由。我真的很想知道为什么答案应该被否决...... :-(
    【解决方案2】:

    我在这里为您发布了demo。基本上这会在每个可放置位置循环,所以如果你有很多它们,它可能真的会减慢鼠标移动。

    哦,我添加了两个变量,如果你想增加与 droppable 的接近度,你可以调整。根据需要调整xmarginymargin 变量。

    CSS

    .draggable { width: 90px; height: 90px; padding: 0.5em; position: relative; top: 0; left: 0; z-index: 2; }
    .droppable { width: 120px; height: 120px; padding: 0.5em; position: absolute; z-index: 1; }
    #drop1 { top: 150px; left: 300px; }
    #drop2 { top: 400px; left: 100px; }
    

    HTML

    <div class="draggable ui-widget-content">
      <p>Drag me to my target</p>
    </div>
    
    <div id="drop1" class="droppable ui-widget-header">
      <p>Drop here</p>
    </div>
    
    <div id="drop2" class="droppable ui-widget-header">
      <p>Drop here</p>
    </div>
    

    脚本

    $(function(){
     var xmargin = 10,
      ymargin = 10,
      drag = $('.draggable'),
      drop = $('.droppable'),
      dgw = drag.outerWidth() + xmargin,
      dgh = drag.outerHeight() + ymargin,
      pos = [];
    
     drop
      .droppable({
       //hoverClass: 'ui-state-active',
       drop: function(event, ui) {
        $(this).addClass('ui-state-highlight').find('p').html('Dropped!');
       }
      })
      // set up droppable coordinates array (left, top, right, bottom) for each element
      .each(function(i){
        var dropzone = drop.eq(i);
        var l = dropzone.position().left,
         t = dropzone.position().top,
         r = l + dropzone.outerWidth() + xmargin,
         b = t + dropzone.outerHeight() + ymargin;
       pos.push([l,t,r,b]);
      });
    
     drag
      .draggable()
      // bind to drag event, or this could be placed inside the draggable function
      .bind( "drag", function(event,ui){
       var l = ui.offset.left,
           t = ui.offset.top;
       // cycle through each droppable and compare current postion to droppable array
       drop.each(function(i){
        if ( ( l + dgw ) > pos[i][0] && l < pos[i][2] && ( t + dgh ) > pos[i][1] && t < pos[i][3] ) {
         $(this).addClass('ui-state-active');
        } else {
         $(this).removeClass('ui-state-active');
        }
       });
      });
    
    });
    

    【讨论】:

    • +1。这几乎正​​是我在回答中建议的实现......只需要添加一些限制。此外,更改元素的类可能比直接通过 javascript 应用样式更慢(取决于元素的数量和选择器的复杂性)。 p.s.:你知道你可以做到drop.eq(i) 对吗?如果有很多放置目标,它可能会明显更快。
    • @David:是的,我忘了.eq(i)。我测试了它,当我用 10 个掉落目标测试它时它会稍微快一点,谢谢!哦,它看起来也更干净:)
    • 尽可能使用$(this)(并缓存它)而不是drop.eq(i)。我怀疑除非你有 1000 个 dropables,否则会有任何明显的加速......但它是一种干净的做事方式,并鼓励那些刚接触 jQuery 的人正确缓存他们的 dom 查找。
    • 奇怪的是,我开始使用 $(this) 而不是 drop.eq(i) 并将该类应用于所有下拉框,所以我离开了它,它一定是初始代码格式.. .现在改回来。但我没有理由缓存它。
    【解决方案3】:

    查看“视觉反馈”示例 jQuery UI,正如 gmcalab 所提到的,如果您只使用一个类作为选择器,那么没有 ID 不是问题。抱歉,如果我没有正确阅读此内容。

    【讨论】:

    • 很好,我不知道!
    【解决方案4】:

    声明selectorselector2 到任何你想要的...

    $(selector).mousemove(function(event) {
    
       // Set some bounds, these are arbitrary here not sure what sort of area your looking for...
       var lowerXBound= 0,
           upperXBound = 100,
           lowerYBound = 0,
           upperYBound = 100,
           currentX = event.pageX,
           currentY = event.pageY;
    
       var color = currentX > lowerXBound && currentX < upperXBound && currentY > lowerYBound && currentY < upperYBound ? 'red' : 'green';
    
       $(selector2).css('background-color', color);
    });
    

    【讨论】:

    • 啊,你打败了我……有点。我们都在同一条轨道上......但我认为我的回答可能会更好地涵盖多个可放置的内容。你怎么看?
    • 但我没有用于可放置 div 的 id,因为它们是动态创建的
    • @Ashish Rajan - 使用可放置类代替 ID。那么选择器也将是我的解决方案的类而不是 ID。
    【解决方案5】:

    您可以为此使用 .hover() ,因此当鼠标悬停在 div 上时,更改其背景颜色:

    $("yourdiv").hover(function () {
        $(this).css("background-color", "#ff0000");
      },
      function () {
        $(this).css("background-color", "#ffffff");
    });
    

    【讨论】:

    • 因为下注者没有添加评论,所以我会:这不起作用,因为“yourdiv”不会被“悬停”,因为它被可拖动的对象阻止。
    猜你喜欢
    • 2017-03-25
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    相关资源
    最近更新 更多