• 0191 元素滚动 scroll 系列:scrollTop,scrollLeft,scrollWidth,scrollHeight,window.pageYOffset


    1.3.1 scroll 概述

    scroll 翻译过来就是滚动的,我们使用 scroll 系列的相关属性可以动态的得到该元素的大小、滚动距离等。

    scrollTop,scrollLeft,scrollWidth,scrollHeight,window.pageYOffset。
    


    1.3.2 页面被卷去的头部

    如果浏览器的高(或宽)度不足以显示整个页面时,会自动出现滚动条。当滚动条向下滚动时,页面上面被隐藏掉的高度,我们就称为页面被卷去的头部。滚动条在滚动时会触发 onscroll事件。

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <style>
            div {
                 200px;
                height: 200px;
                background-color: pink;
                border: 10px solid red;
                padding: 10px;
                overflow: auto;
            }
        </style>
    </head>
    
    <body>
        <div>
            我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容
        </div>
        <script>
            // scroll 系列
            var div = document.querySelector('div');
            console.log(div.scrollHeight); // 309
            console.log(div.clientHeight); // 220 
    
            // scroll滚动事件当我们滚动条发生变化会触发的事件
            div.addEventListener('scroll', function() {
                console.log(div.scrollTop);
    
            })
        </script>
    </body>
    
    </html>
    

    1.3.3 案例:仿淘宝固定右侧侧边栏

    1. 原先侧边栏是绝对定位
    2. 当页面滚动到一定位置,侧边栏改为固定定位
    3. 页面继续滚动,会让 返回顶部显示出来

    1.3.4 案例分析

    1. 需要用到页面滚动事件 scroll  因为是页面滚动,所以事件源是document
    2. 滚动到某个位置,就是判断页面被卷去的上部值。
    3. 页面被卷去的头部:可以通过window.pageYOffset 获得; 如果是被卷去的左侧window.pageXOffset 【注意:是window.pageYOffset,不是e.pageYOffset。】
    4. 注意,元素被卷去的头部是element.scrollTop  , 如果是页面被卷去的头部 则是 window.pageYOffset 【其实element.scrollTop、window.pageYOffset,在页面被卷去的时候,都可以使用,只要把整个页面看做一个元素,获取到html元素即可,document.documentElement.scrollTop】
    5. 其实这个值 可以通过盒子的 offsetTop可以得到,如果大于等于这个值,就可以让盒子固定定位了
     <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <style>
            .slider-bar {
                position: absolute;
                left: 50%;
                top: 300px;
                margin-left: 600px;
                 45px;
                height: 130px;
                background-color: pink;
            }
            
            .w {
                 1200px;
                margin: 10px auto;
            }
            
            .header {
                height: 150px;
                background-color: purple;
            }
            
            .banner {
                height: 250px;
                background-color: skyblue;
            }
            
            .main {
                height: 1000px;
                background-color: yellowgreen;
            }
            
            span {
                display: none;
                position: absolute;
                bottom: 0;
            }
        </style>
    </head>
    
    <body>
        <div class="slider-bar">
            <span class="goBack">返回顶部</span>
        </div>
        <div class="header w">头部区域</div>
        <div class="banner w">banner区域</div>
        <div class="main w">主体部分</div>
        <script>
            //1. 获取元素
            var sliderbar = document.querySelector('.slider-bar');
            var banner = document.querySelector('.banner');
            // banner.offestTop 就是被卷去头部的大小 一定要写到滚动的外面 【如果写到document的scroll事件里,则这个值每次滚动都会动态变化。】
            var bannerTop = banner.offsetTop
                // 当我们侧边栏固定定位之后应该变化的数值
            var sliderbarTop = sliderbar.offsetTop - bannerTop;
            // 获取main 主体元素
            var main = document.querySelector('.main');
            var goBack = document.querySelector('.goBack');
            var mainTop = main.offsetTop;
            // 2. 页面滚动事件 scroll
            document.addEventListener('scroll', function() {
                // console.log(11);
                // window.pageYOffset 页面被卷去的头部
                // console.log(window.pageYOffset);
                // 3 .当我们页面被卷去的头部大于等于了 172 此时 侧边栏就要改为固定定位
                if (window.pageYOffset >= bannerTop) {
                    sliderbar.style.position = 'fixed';
                    sliderbar.style.top = sliderbarTop + 'px';
                } else {
                    sliderbar.style.position = 'absolute';
                    sliderbar.style.top = '300px';
                }
                // 4. 当我们页面滚动到main盒子,就显示 goback模块
                if (window.pageYOffset >= mainTop) {
                    goBack.style.display = 'block';
                } else {
                    goBack.style.display = 'none';
                }
    
            })
        </script>
    </body>
    
    </html>
    


    1.3.5页面被卷去的头部兼容性解决方案

    需要注意的是,页面被卷去的头部,有兼容性问题,因此被卷去的头部通常有如下几种写法:

    1. 声明了 DTD,使用 document.documentElement.scrollTop
    2. 未声明 DTD,使用  document.body.scrollTop
    3. 新方法 window.pageYOffset和 window.pageXOffset,IE9 开始支持
    function getScroll() {
        return {
          left: window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft||0,
          top: window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0
        };
     } 
    使用的时候: getScroll().left
    
    
  • 相关阅读:
    mustcache 模板语法
    java 打印pdf文件
    java从远程服务器获取PDF文件并后台打印(使用pdfFox)
    如何写md格式的文档
    mysql游标的用法及作用
    Spring
    JQuery.extend扩展实现同步post请求
    tp5框架的获取器
    ThinkPHP开启设置子域名笔记
    每天进步一点点
  • 原文地址:https://www.cnblogs.com/jianjie/p/12186715.html
Copyright © 2020-2023  润新知