11_JS的scroll家族

知识结构

  • Html基本结构访问方法
  • scroll家族
  • 页面滚动事件
  • scrollTop、scrollLeft
  • 获取scrollTop以及兼容性写法获取
  • JSON
  • 判断是不是怪异模式的浏览器
  • 封装自己的scrollTop、scrollLeft
  • 案例
  • 固定导航栏
  • 跟随的广告
  • scrollTo(x,y)
  • 案例
  • 带动画的返回顶部
  • 浏览器滑动效果

Html基本结构访问方法

文档是 document,下面有html body head

  • document.head
  • document.body
  • document.title
  • 没有 document.html 取而代之的是 document.documentElement;

scroll家族

  • Offset 自己的偏移
  • scroll 滚动的

页面滚动事件

window.onscroll = function() { 页面滚动语句  }

scrollTop、scrollLeft

scrollTop 被卷去的头部

它就是当你滑动滚轮浏览网页的时候网页隐藏在屏幕上方的距离


获取scrollTop
  • document.body.scrollTop;
  • 如果页面包含DTD:<!DOCTYPE >则只有 谷歌浏览器支持
  • 如果页面不包含DTD:<!DOCTYPE >,则谷歌浏览器和其他浏览器都支持
  • document.documentElement.scrollTop;
  • 谷歌浏览器不支持,火狐和其他浏览器支持
  • window.pageYOffset(scrollTop)、window.pageXOffset;
  • IE9+以及其他最新的浏览器都支持

兼容性写法:

var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;

JSON

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,我们称之为JavaScript对象表示法。使用JSON进行数据传输的优势之一。JSON实际上就是JavaScript
  Json很像我们学过的样式条;
var myjson={k:v,k:v,k:v...} 键值对 key: value color: red;

json对象

var json = { key: value, key1:value }

var json1 = {name :"刘德华",age: 55};
console.log(json1.name);  // 输出名字  刘德华
console.log(json1.age);  // 输出年龄  55

判断是不是怪异模式的浏览器

检测是不是怪异模式的浏览器 -- 就是检测有没有声明<!DOCTYPE html>

document.compatMode == "CSS1Compat"
document.compatMode === "BackCompat"

BackCompat 未声明
CSS1Compat 已经声明
注意大小写

封装自己的scrollTop、scrollLeft

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style type="text/css">
        p{
            display: block;
            width: 5000px;
            height: 5000px;
            background: #cccccc;
        }
    </style>
    <script type="text/javascript">
        window.onload = function () {
            function scroll(){
                //此处不能使用if(window.pageXOffset),
                //因为如果浏览器支持window.pageXOffset,刚开始window.pageXOffset=0,也没有进入这个if
                if(window.pageXOffset != null){
                    return {
                        left:window.pageXOffset,
                        top:window.pageYOffset
                    }
                }
                // 检测是不是怪异模式的浏览器 -- 就是没有 声明<!DOCTYPE html>
                //CSS1Compat表示已经声明<!DOCTYPE html>,不是怪异模式
                else if(document.compatMode === "CSS1Compat"){
                    return {
                        left:document.documentElement.scrollLeft,
                        top:document.documentElement.scrollTop
                    }
                }
                return {
                    left:document.body.scrollLeft,
                    top:document.body.scrollTop
                }
            }
            window.onscroll = function () {
                var obj = scroll();
                console.log(obj.left+":"+obj.top);
            }
        }
    </script>
</head>
<body>
    <p>123</p>

</body>
</html>

例:固定导航栏

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style type="text/css">
        *{
            margin: 0;
            padding: 0;

        }
        img{
            display: block;
        }
        .top , .nav{
            width: 1423px;
            margin: 0 auto;
        }
        .main{
            width: 1001px;
            margin: 0 auto;
        }
        .fixed{
            position: fixed;
            top: 0;
            left: 50%;
            margin-left: -711px;
        }
    </style>
    <script type="text/javascript">
        function $(id){return document.getElementById(id);}
        function scroll(){
            //此处不能使用if(window.pageXOffset),
            //因为如果浏览器支持window.pageXOffset,刚开始window.pageXOffset=0,也没有进入这个if
            if(window.pageXOffset != null){
                return {
                    left:window.pageXOffset,
                    top:window.pageYOffset
                }
            }
            // 检测是不是怪异模式的浏览器 -- 就是没有 声明<!DOCTYPE html>
            //CSS1Compat表示已经声明<!DOCTYPE html>,不是怪异模式
            else if(document.compatMode === "CSS1Compat"){
                return {
                    left:document.documentElement.scrollLeft,
                    top:document.documentElement.scrollTop
                }
            }
            return {
                left:document.body.scrollLeft,
                top:document.body.scrollTop
            }
        }
        window.onload = function () {
            var navTop = $("nav").offsetTop;
            console.log(navTop);
            window.onscroll = function () {
                var scrollTop = scroll().top;
                if(scrollTop<navTop){
                    $("nav").className = "nav";
                }else{
                    $("nav").className = "nav fixed";
                }
            }
        }
    </script>
</head>
<body>
    <div class="top">
        ![](images/top.png)
    </div>
    <div class="nav" id="nav">
        ![](images/nav.png)
    </div>
    <div class="main">
        ![](images/main.png)
    </div>
</body>
</html>

例:跟随的广告

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style type="text/css">
        img{
            position: absolute;
            left: 0;
            top: 50px;
        }
        p{
            display: block;
            width: 100%;
            height: 600px;
            text-align: center;
        }
    </style>
    <script type="text/javascript">
        function $(id){return document.getElementById(id);}
        function scroll(){
            //此处不能使用if(window.pageXOffset),
            //因为如果浏览器支持window.pageXOffset,刚开始window.pageXOffset=0,也没有进入这个if
            if(window.pageXOffset != null){
                return {
                    left:window.pageXOffset,
                    top:window.pageYOffset
                }
            }
            // 检测是不是怪异模式的浏览器 -- 就是没有 声明<!DOCTYPE html>
            //CSS1Compat表示已经声明<!DOCTYPE html>,不是怪异模式
            else if(document.compatMode === "CSS1Compat"){
                return {
                    left:document.documentElement.scrollLeft,
                    top:document.documentElement.scrollTop
                }
            }
            return {
                left:document.body.scrollLeft,
                top:document.body.scrollTop
            }
        }
        window.onload = function () {
            var pic = $("pic");
            var top = pic.offsetTop;
            var timer = null;
            var leader= 0,target=0;
            window.onscroll = function () {
                target = scroll().top+ top;
                if(timer) clearInterval(timer);
                timer = setInterval(function () {
                    leader = leader+(target - leader)/10;
                    pic.style.top = leader+"px";
                },20);
            }
        }
    </script>
</head>
<body>
    ![](images/aside.jpg)
    <div class="con">
        <p>你好</p>
        <p>你好</p>
        <p>你好</p>
        <p>你好</p>
        <p>你好</p>
        <p>你好</p>
    </div>
</body>
</html>

scrollTo(x,y)

window.scrollTo(15,15);
方法可把内容滚动到指定的坐标。
格式:

scrollTo(xpos,ypos)

xpos必需。要在窗口文档显示区左上角显示的文档的 x 坐标。
ypos必需。要在窗口文档显示区左上角显示的文档的 y 坐标
因为我们的网页大部分都没有水平滚动条,所以,这个x 不太常用。

例:带动画的返回顶部

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style type="text/css">
        img{
            position: fixed;
            right: 50px;
            bottom: 50px;
            display: none;
        }
        p{
            display: block;
            width: 100%;
            height: 600px;
            text-align: center;
        }
    </style>
    <script type="text/javascript">
        //封装
        function $(id){return document.getElementById(id);}
        function show(obj){obj.style.display = "block";}
        function hide(obj){obj.style.display = "none";}
        function scroll(){
            //此处不能使用if(window.pageXOffset),
            //因为如果浏览器支持window.pageXOffset,刚开始window.pageXOffset=0,也没有进入这个if
            if(window.pageXOffset != null){
                return {
                    left:window.pageXOffset,
                    top:window.pageYOffset
                }
            }
            // 检测是不是怪异模式的浏览器 -- 就是没有 声明<!DOCTYPE html>
            //CSS1Compat表示已经声明<!DOCTYPE html>,不是怪异模式
            else if(document.compatMode === "CSS1Compat"){
                return {
                    left:document.documentElement.scrollLeft,
                    top:document.documentElement.scrollTop
                }
            }
            return {
                left:document.body.scrollLeft,
                top:document.body.scrollTop
            }
        }
        window.onload = function () {
            var back = $("back_btn");
            var leader = 0,target = 0,timer = null;
            window.onscroll = function () {
                scroll().top>0?show(back):hide(back);
                leader = scroll().top;
            }
            back.onclick = function () {
                if(timer) clearInterval(timer);
                target = 0;
                timer = setInterval(function () {
                    leader = leader+(target - leader)/10;
                    window.scrollTo(0 ,leader);
                    if(leader - target<0.005) clearInterval(timer);
                },20);
            }
        }
    </script>
</head>
<body>
    ![](images/Top.jpg)
    <div class="con">
        <p>你好</p>
        <p>你好</p>
        <p>你好</p>
        <p>你好</p>
        <p>你好</p>
        <p>你好</p>
    </div>
</body>
</html>

例:浏览器滑动效果

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>屏幕滚动</title>
    <style type="text/css">
        *{
            margin: 0;
            padding: 0;
        }
        ul,ol,li{
            list-style: none;

        }
        html,body{
            width: 100%;
            height: 100%;
        }
        ul{
            width: 100%;
            height: 100%;
        }
        ul li{
            width: 100%;
            height: 100%;

        }
        ol{
            position: fixed;
            left: 78px;
            top: 18px;
        }
        ol li{
            width: 60px;
            height: 60px;
            text-align: center;
            line-height: 60px;
            border: 1px solid #fff;
            cursor: pointer;
        }
    </style>
    <script type="text/javascript">
        function $(id){return document.getElementById(id);}
        function scroll(){
            //此处不能使用if(window.pageXOffset),
            //因为如果浏览器支持window.pageXOffset,刚开始window.pageXOffset=0,也没有进入这个if
            if(window.pageXOffset != null){
                return {
                    left:window.pageXOffset,
                    top:window.pageYOffset
                }
            }
            // 检测是不是怪异模式的浏览器 -- 就是没有 声明<!DOCTYPE html>
            //CSS1Compat表示已经声明<!DOCTYPE html>,不是怪异模式
            else if(document.compatMode === "CSS1Compat"){
                return {
                    left:document.documentElement.scrollLeft,
                    top:document.documentElement.scrollTop
                }
            }
            return {
                left:document.body.scrollLeft,
                top:document.body.scrollTop
            }
        }
        window.onload = function () {
            var ulis = $("ul").children;
            var olis = $("ol").children;
            var colors = ["pink","red","blue","yellow","purple"];

            var leader= 0,target= 0,timer =null;
            window.onscroll = function () {//鼠标滚动,会改变起点
                leader = scroll().top;
            }
            for(var i = 0;i<olis.length ;i++){
                var oli = olis[i];
                oli.index = i;
                oli.style.backgroundColor = colors[i];
                ulis[i].style.backgroundColor = colors[i];
                oli.onclick = function () {
                    target = ulis[this.index].offsetTop;
                    if(timer) clearInterval(timer);
                    timer = setInterval(function () {
                        leader = leader+(target - leader)/10;
                        window.scrollTo(0,leader);
                        var diff = leader - target;
//                        console.dir(diff);
                        if(diff<0.005&&diff>-0.005){
                            clearInterval(timer);
                        }
                    },20);
                }
            }

        }
    </script>
</head>
<body>
<ul id="ul">
    <li>首页</li>
    <li>动态</li>
    <li>朋友</li>
    <li>设置</li>
    <li>退出</li>
</ul>
<ol id="ol">
    <li>首页</li>
    <li>动态</li>
    <li>朋友</li>
    <li>设置</li>
    <li>退出</li>
</ol>
</body>
</html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • 一、自定义动画 延迟执行start.style.animationDelay = delay + 's'; 二、U...
    LIT乐言阅读 565评论 0 2
  • Window和document对象的区别 window对象window对象表示浏览器中打开的窗口window对象是...
    FConfidence阅读 2,148评论 0 5
  • offset家族三大家族和一个事件对象三大家族(offset/scroll/client)事件对象/event ...
    Yuann阅读 946评论 0 5
  • 本文是针对刚学编程的小白,都是一些基础知识,如果想了解更多深层一点的东西,欢迎移步本人博客!! 博客地址 点击跳转...
    西巴撸阅读 554评论 0 2
  • 一、水平滚动条 和 垂直滚动条 1.1 核心技术点 1)求滚动条的长度? 2)拖动滚动条,求内容要走多少? 滚...
    LIT乐言阅读 531评论 0 3