这是原始页面:http://demetra-bk.kz
这是我的JS代码:
$('#block-views-hot-deals-block .views-row').hover(function() {
var $CurClass = $(this).attr('class');
var $ResClass = $CurClass.replace(/views-row\s(views-row-\d{1,2})\s.+/, '$1');
var $PosTop = $(this).offset().top - $('#block-views-hot-deals-block').offset().top;
var $PosLeft = $(this).offset().left - $('#block-views-hot-deals-block').offset().left;
console.log($PosTop);
$('#hover-divs .' + $ResClass).css({display: 'block', top: $PosTop, left: $PosLeft});
// saving vars for further use
$(this).data('resclass', $ResClass);
}, function() {
$('#hover-divs .' + $(this).data('resclass')).css('display', 'none');
});
当我将鼠标悬停在带有类" views-row"的元素上时在父div"#block-views-hot-deals-block"我想得到当前悬停元素的位置并将其用于隐藏的div,但是,当我现在悬停时,我得到一个闪烁的div。有人可以帮我解决一下吗?
UPDATE1
当我更改值时:
var $PosTop = $(this).offset().top - $('#block-views-hot-deals-block .content').offset().top;
var $PosLeft = $(this).offset().left;
它工作顺畅,但计算相对于文档的左侧位置,而不是我的父级div position: relative
..
答案 0 :(得分:2)
首先,如果您想获取当前悬停元素.views-row
的位置,则无需在其上减去#block-views-hot-deals-block
位置。 jQuery的offset()
已经返回元素相对于文档的坐标。
发生闪烁是因为当触发悬停时,您将#hover-divs
设置在.views-row
元素的前面或顶部,所以突然鼠标指针现在悬停在{{1}上而不再是#hover-divs
了。因此移动鼠标会使其闪烁,因为悬停会一次又一次地被触发。在这里,我在这个jsfiddle上复制了这个问题:http://jsfiddle.net/yLDnt/
解决方案是在悬停时附加 .views-row
#hover-divs
。虽然鼠标仍将悬停.views-row
,但此元素现在是#hover-divs
的子元素,并且悬停事件不会再次触发。
.views-row
请参阅此jsfiddle:http://jsfiddle.net/yLDnt/1/
与此相反,我认为更好的UI和UX是在$('#hover-divs .' + $ResClass).appendTo($(this))//the current hovered element
.css({display: 'block', top: $PosTop, left: $PosLeft});
事件上设置相对于鼠标坐标的#hover-divs
位置,因此当鼠标移动时它会移动。看看这个jsfiddle演示:http://jsfiddle.net/yLDnt/2/。
答案 1 :(得分:1)
尝试这种方式:
$('#block-views-hot-deals-block .views-row').mouseenter(function() {
var $CurClass = $(this).attr('class');
var $ResClass = $CurClass.replace(/views-row\s(views-row-\d{1,2})\s.+/, '$1');
var $PosTop = $(this).offset().top - $('#block-views-hot-deals-block .content').offset().top;
var $PosLeft = $(this).offset().left - $('#block-views-hot-deals-block .content').offset().left;
console.log($PosLeft);
$('#hover-divs .' + $ResClass).css({display: 'block', top: $PosTop - 25, left: $PosLeft - 28});
// saving vars for further use
$(this).data('resclass', $ResClass);
});
$('#hover-divs .views-row').mouseleave(function() {
//$('#hover-divs .' + $(this).data('resclass')).css({display: 'none'});
$(this).css({display: 'none'});
});
改为使用.mouseenter()
和.mouseleave()
。