最近在做京东案例:当搜索框随着滚动条的滚动产生渐变效果
/**
* Created by Administrator on 2019/4/11.
*/
window.onload = function () {
//:头部搜索快js的效果
//1:获取当前banner的高度
var banner = document.querySelector(".jd_banner");
var bannerHeigth = banner.offsetHeight;
//console.log(bannerHeigth);
//获取head搜索快
var search = document.querySelector(".jd_search");
//2:获取banner滚动出屏幕的距离,监听屏幕滚动
window.onscroll = function () { //页面滚动时触发
console.log("asdfdvb");
var banner = document.querySelector(".jd_banner");
var offsetTop = document.documentElement.scrollTop;//被选元素的垂直滚动条位置
console.log(offsetTop);//当滚动条位于最顶部时,位置是 0。
//3:计算比例值,获取透明度,设置背景样式
var opacity = 0;
/*判断,如果当banner还没有完全 滚出屏幕,那么才有必要计算透明度和设置透明度*/
if (offsetTop < bannerHeigth) {
opacity = offsetTop / bannerHeigth;
/*设置样式*/
search.style.backgroundColor = "rgba(233,35,34," + opacity + ")";
}
}
}
scrollTop始终没有效果,最后的结果是scrollTop有兼容性
1、各浏览器下 scrollTop的差异
IE6/7/8:
对于没有doctype声明的页面里(混杂模式)可以使用 document.body.scrollTop 来获取 scrollTop高度 ;
对于有doctype声明的页面(严格模式)则可以使用 document.documentElement.scrollTop;
Safari:
safari 比较特别,有自己获取scrollTop的函数 : window.pageYOffset ;
Firefox:
火狐等等相对标准些的浏览器就省心多了,直接用 document.documentElement.scrollTop ;
2、获取scrollTop值
完美的获取scrollTop 赋值短语 :
var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
通过这句赋值就能在任何情况下获得scrollTop 值。
仔细观察这句赋值,你发现啥了没??
没错, 就是 window.pageYOffset (Safari) 被放置在 || 的中间位置。
因为当 数字0 与 undefine 进行 或运算时,系统默认返回最后一个值。即或运算中 0 == undefine ;
当页面滚动条刚好在最顶端,即scrollTop值为 0 时。 IE 下 window.pageYOffset (Safari) 返回为 undefine ,此时将window.pageYOffset (Safari) 放在或运算最后面时, scrollTop 返回 undefine , undefine 用在接下去的运算就会报错咯。
而其他浏览器 无论 scrollTop 赋值或运算顺序如何都不会返回 undefine. 可以安全使用..
所以说到头还是IE的问题咯. 杯具…
精神有点恍惚,不知道有没有表达清楚。
不过最后总结出来这句实验过OK,大家放心使用;
var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
DTD相关说明:
页面具有 DTD,或者说指定了 DOCTYPE 时,使用 document.documentElement。
页面不具有 DTD,或者说没有指定了 DOCTYPE,时,使用 document.body。
在 IE 和 Firefox 中均是如此。
为了兼容,不管有没有 DTD,可以使用如下代码:
var scrollTop = window.pageYOffset //用于Safari || document.documentElement.scrollTop (严格模式) || document.body.scrollTop (混杂模式) || 0;