gpt4 book ai didi

javascript - 如何使用覆盖有效地突出显示鼠标光标下的元素?

转载 作者:可可西里 更新时间:2023-11-01 02:03:38 25 4
gpt4 key购买 nike

仍在尝试回答this question ,我想我终于找到了解决方案,但它运行得太慢了。

var $div = $('<div>')
.css({ 'border': '1px solid red', 'position': 'absolute', 'z-index': '65535' })
.appendTo('body');

$('body *').live('mousemove', function(e) {
var topElement = null;
$('body *').each(function() {
if(this == $div[0]) return true;
var $elem = $(this);
var pos = $elem.offset();
var width = $elem.width();
var height = $elem.height();
if(e.pageX > pos.left && e.pageY > pos.top
&& e.pageX < (pos.left + width) && e.pageY < (pos.top + height)) {
var zIndex = document.defaultView.getComputedStyle(this, null).getPropertyValue('z-index');
if(zIndex == 'auto') zIndex = $elem.parents().length;
if(topElement == null || zIndex > topElement.zIndex) {
topElement = {
'node': $elem,
'zIndex': zIndex
};
}

}
});
if(topElement != null ) {
var $elem = topElement.node;
$div.offset($elem.offset()).width($elem.width()).height($elem.height());
}
});

它基本上遍历页面上的所有元素并找到光标下方的最顶层元素。

有没有什么方法可以使用四叉树或其他东西来分割页面以便循环运行得更快?

最佳答案

Is there maybe some way I could use a quad-tree or something and segment the page so the loop runs faster?

退后一步,意识到问题有多小,你越努力尝试,你会使用越复杂的答案。

现在您需要做的是为突出显示创建 4 个元素。它们将形成一个空方 block ,因此您的鼠标事件可以自由触发。这类似于 overlay example我做了。

不同之处在于您只需要四个元素(没有调整大小标记),并且 4 个框的大小和位置有点不同(模仿红色边框)。然后你可以在你的事件处理程序中使用 event.target ,因为它默认获取真正的最顶层元素。

另一种方法是隐藏exra元素,获取elementFromPoint,计算后放回去。

它们比光还快,我可以告诉你。甚至爱因斯坦也会同意 :)

1.) elementFromPoint 覆盖/边框 - [ Demo1 ] FF 需要 v3.0+

var box = $("<div class='outer' />").css({
display: "none", position: "absolute",
zIndex: 65000, background:"rgba(255, 0, 0, .3)"
}).appendTo("body");

var mouseX, mouseY, target, lastTarget;

// in case you need to support older browsers use a requestAnimationFrame polyfill
// e.g: https://gist.github.com/paulirish/1579671
window.requestAnimationFrame(function frame() {
window.requestAnimationFrame(frame);
if (target && target.className === "outer") {
box.hide();
target = document.elementFromPoint(mouseX, mouseY);
}
box.show();

if (target === lastTarget) return;

lastTarget = target;
var $target = $(target);
var offset = $target.offset();
box.css({
width: $target.outerWidth() - 1,
height: $target.outerHeight() - 1,
left: offset.left,
top: offset.top
});
});

$("body").mousemove(function (e) {
mouseX = e.clientX;
mouseY = e.clientY;
target = e.target;
});

2.) 鼠标悬停边框 - [ Demo2 ]

var box = new Overlay();

$("body").mouseover(function(e){
var el = $(e.target);
var offset = el.offset();
box.render(el.outerWidth(), el.outerHeight(), offset.left, offset.top);
});​

/**
* This object encapsulates the elements and actions of the overlay.
*/
function Overlay(width, height, left, top) {

this.width = this.height = this.left = this.top = 0;

// outer parent
var outer = $("<div class='outer' />").appendTo("body");

// red lines (boxes)
var topbox = $("<div />").css("height", 1).appendTo(outer);
var bottombox = $("<div />").css("height", 1).appendTo(outer);
var leftbox = $("<div />").css("width", 1).appendTo(outer);
var rightbox = $("<div />").css("width", 1).appendTo(outer);

// don't count it as a real element
outer.mouseover(function(){
outer.hide();
});

/**
* Public interface
*/

this.resize = function resize(width, height, left, top) {
if (width != null)
this.width = width;
if (height != null)
this.height = height;
if (left != null)
this.left = left;
if (top != null)
this.top = top;
};

this.show = function show() {
outer.show();
};

this.hide = function hide() {
outer.hide();
};

this.render = function render(width, height, left, top) {

this.resize(width, height, left, top);

topbox.css({
top: this.top,
left: this.left,
width: this.width
});
bottombox.css({
top: this.top + this.height - 1,
left: this.left,
width: this.width
});
leftbox.css({
top: this.top,
left: this.left,
height: this.height
});
rightbox.css({
top: this.top,
left: this.left + this.width - 1,
height: this.height
});

this.show();
};

// initial rendering [optional]
// this.render(width, height, left, top);
}

关于javascript - 如何使用覆盖有效地突出显示鼠标光标下的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4711023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com