tec*_*_28 6 html javascript jquery dom scroll
我有这个问题,我有一套6个UL有一个共同的类x.它们每个都包含一个页面的特定部分.现在我有6个与每个部分相关的菜单.我该怎么做当相关部分在用户视图中时突出显示菜单.为此,我认为可能是jQuery position(); 或offset(); 可能有帮助,但他们给了元素的顶部和左侧.我也尝试使用jQuery 视口插件,但显然视图端口很大,它可以一次显示多个UL因此我不能在这里应用元素特定的逻辑.我不是familiar对此,但滚动时元素的变化是什么?如果是,那么如何访问它?
请分享您的观点.
关心Himanshu Sharma.
使用jQuery和虚拟固定HTML块很容易做到这一点,它可以帮助您找到视口的当前位置.
$(window).on("scroll load",function(){
var once = true;
$(".title").each(function(ele, index){
if($(this).offset().top > $("#viewport_helper").offset().top && once){
var index = $(this).index(".title");
$(".current").removeClass('current')
$("#menu li").eq(index).addClass('current')
once = false;
}
});
})
Run Code Online (Sandbox Code Playgroud)
查看一个工作示例:http://jsfiddle.net/6c8Az/1/
您还可以使用jQuery插件和第一个选择器执行类似的操作:
$(window).on("scroll load",function(){
$(".title:in-viewport:first").each(function(){
var index = $(this).index(".title");
$(".current").removeClass('current')
$("#menu li").eq(index).addClass('current')
});
})
Run Code Online (Sandbox Code Playgroud)
$(document).width()您可以通过and获取视口的宽度和高度$(document).height()$(document).scrollTop()您可以通过和获取用户滚动的像素数$(document).scrollLeft$(element).offset()您可以使用,$(element).width()和获取元素的矩形$(element).height()所以整个代码可能如下所示:
/**
* Check wether outer contains inner
* You can change this logic to matches what you need
*/
function rectContains(outer, inner) {
return outer.top <= inner.top &&
outer.bottom >= inner.bottom &&
outer.left <= inner.left &&
outer.right >= inner.right;
}
/**
* Use this function to find the menu related to <ul> element
*/
function findRelatedMenu(element) {
return $('#menu-' + element.attr('id'));
}
function whenScroll() {
var doc = $(document);
var elem = $(element);
var viewportRect = {
top: doc.scrollTop(),
left: doc.scrollLeft(),
width: doc.width(),
height: doc.height()
};
viewportRect.bottom = viewportRect.top + viewportRect.height;
viewportRect.right = viewportRect.left + viewportRect.width;
var elements = $('ul.your-class');
for (var i = 0; i < elements.length; i++) {
var elem = $(elements[i]);
var elementRect = {
top: elem.offset().top,
left: elem.offset().left,
width: elem.width(),
height: elem.height()
};
elementRect.bottom = elementRect.top + elementRect.height;
elementRect.right = elementRect.left + elementRect.width;
if (rectContains(viewportRect, elementRect)) {
findRelatedMenu(elem).addClass('highlight');
}
}
}
$(window).on('scroll', whenScroll);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2325 次 |
| 最近记录: |