(function(){
var productUl = document.getElementById("product_ul");
var productLi = productUl.getElementsByTagName("li");
var listul = document.getElementById("productUl");
var listli = listul.getElementsByTagName("li");
var pheight = document.getElementById("product_product");
function productDh(dj){
for(var i=0;i<productLi.length;i++){
productLi[i].className = "";
}
productLi[dj].className = "producton";
}
for(var j=0;j<productLi.length;j++){
productLi[j].index = j;
productLi[j].onclick = function(){
productDh(this.index);
}
}
/*
*循环每个导航按钮,添加监听点击事件,点击跳转到相应的位置,为什么实现不了,
*我想把a的值根据productLi[i]点击哪一个跳转到相应的listli[j].offsetTop - h
*/
for(var i=0;i<productLi.length;i++){
var h = pheight.offsetHeight;
productLi[i].addEventListener("click",function(){
for(var j=0;j<listli.length;j++){
var a = listli[j].offsetTop - h;
console.log(a);//这里控制台都能输出每一项
window.scrollTo(0,a);//这里就接收不了a里面的数值
}
});
}
}());
你这个代码是跳转到最后的listli所在位置了,改成下面这样,看加粗的部分
for (var i = 0; i < productLi.length; i++) {
productLi[i].addEventListener("click", function () {
var h = pheight.offsetHeight;//放里面来,防止页面resize过
var i = this.index;//this为当前点击的li,获取你上一次for循环设置的index property
var a = listli[i].offsetTop - h;
console.log(a);//这里控制台都能输出每一项
window.scrollTo(0, a);//这里就接收不了a里面的数值
});
}
帮助到你可以点击采纳吗,谢谢~~
感觉你的代码有点逻辑问题,在监听事件里,你循环了一遍所有的li,并获取了每个li的top,还在循环里scrollTo,应该不是接收不到,而是都滚动到最后一个了,你应该在监听事件的循环里,判定你当前点的是哪个对象,然后再进行滚动
雏形大概这个样子,没有html代码,所以不清楚是否有效果。思路就是判断容器是否在可见区域,在就设置焦点
<script>
// (function () {
var productUl = document.getElementById("product_ul");
var productLi = productUl.getElementsByTagName("li");
var listul = document.getElementById("productUl");
var listli = listul.getElementsByTagName("li");
var pheight = document.getElementById("product_product");
function productDh(dj) {
for (var i = 0; i < productLi.length; i++) {
productLi[i].className = "";
}
productLi[dj].className = "producton";
}
for (var j = 0; j < productLi.length; j++) {
productLi[j].index = j;
productLi[j].onclick = function () {
productDh(this.index);
}
}
for (var i = 0; i < productLi.length; i++) {
productLi[i].addEventListener("click", function () {
var h = pheight.offsetHeight;//放里面来,防止页面resize过
var i = this.index;//this为当前点击的li,获取你上一次for循环设置的index property
var a = listli[i].offsetTop - h;
console.log(a);//这里控制台都能输出每一项
window.scrollTo(0, a);//这里就接收不了a里面的数值
});
}
function getElStyle(el) {
var computedStyle;
if (window.getComputedStyle) {
computedStyle = getComputedStyle(el, null)
} else {
computedStyle = el.currentStyle;
}
return computedStyle
}
function getOuterHeight(el) {//容器高度=内容高度+边框宽度+上下margin
var h = 0, style = getElStyle(el);
h = el.offsetHeight;
h += parseInt(style['borderTopWidth']) || 0;
h += parseInt(style['borderBottomWidth']) || 0;
h += parseInt(style['marginTop']) || 0;
h += parseInt(style['marginBottom']) || 0;
return h;
}
window.onresize = function () {//用于计算窗体改变后listli的位置
for (var i = 0; i < listli.length; i++) {//计算位置并缓存位置信息
listli[i].pos = { top: listli[i].offsetTop, bottom: listli[i].offsetTop + getOuterHeight(listli[i]) }
}
};
window.onresize();//位置初始化
window.onscroll = function () {
var el = document[document.compatMode == 'CSS1Compat' ? 'documentElement' : 'body'];
var st = el.scrollTop, sb = el.clientHeight;//获取可是区域top和bottom
for (var i = 0; i < listli.length; i++) {
var pos = listli[i].pos;
if ((pos.top >= st && pos.top <= sb) || (pos.bottom >= st && pos.bottom <= sb) || (pos.bottom<= st && pos.bottom>=sb)) {//可见区域内
productLi[i].className='聚焦的样式名称'
}
else productLi[i].className = ''//去掉聚焦样式
}
};
//}());
</script>
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps: 问答会员年卡【8折】购 ,限时加赠IT实体书,即可 享受50次 有问必答服务,了解详情>>>https://t.csdnimg.cn/RW5m