05-DOM- 网页特效篇

DOM- 网页特效篇

滚动事件和加载事件

滚动事件 scroll

1.初识滚动事件
定义 scroll

当页面进行滚动时触发的事件

作用

很多网页需要检测用户把页面滚动到某个区域后做一些处理, 比如固定导航栏,比如返回顶部

2.滚动事件使用
  • 监听整个页面滚动

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-StGRWy6x-1649939359890)(05-DOM-%20%E7%BD%91%E9%A1%B5%E7%89%B9%E6%95%88%E7%AF%87.assets/1649820748087.png)]

    给 window 或 document 添加 scroll 事件

            // 整个网页滚动使用window
            window.addEventListener('scroll', function () {
                console.log('window开始滚动啦');
            })
    
  • 监听某个元素的内部滚动直接给某个元素加即可

            // 让单个元素滚动,使用单个元素绑定即可
            let div = document.querySelector('div')
            div.addEventListener('scroll', function () {
                console.log('div开始gun');
            })
    
3.滚动事件案例

页面整体分为三个部分,当下拉页面的时候,中间部分触碰到顶部时就定位不动。且下拉到一定距离时,会出现一个“火箭”点击图片,点击之后可以缓慢的返回到顶部(不是立即就返回顶部,而是以动画的形式)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        header {
            height: 200px;
            background-color: pink;
        }

        nav {
            height: 250px;
            background-color: yellow;
        }

        div {
            background-color: aqua;
        }

        .fix {
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
        }

        a {
            width: 150px;
            height: 195px;
            position: fixed;
            bottom: 100px;
            right: 50px;
            background-image: url(../02-网页特效学习/04-小火箭/images/gotop.png);
            display: none;
        }

        a:hover {
            background-image: url(../02-网页特效学习/04-小火箭/images/gotop.gif);
        }

        /* a {
        width: 150px;
        height: 195px;
        position: fixed;
        bottom: 100px;
        right: 50px;
        background-image: url(./images/gotop.png);
        /* display: none; */
    </style>
</head>

<body>
    <header></header>
    <nav></nav>
    <div>
        <h1>1</h1>
        <h1>2</h1>
        <h1>3</h1>
        <h1>4</h1>
        <h1>5</h1>
        <h1>6</h1>
        <h1>7</h1>
        <h1>8</h1>
        <h1>9</h1>
        <h1>10</h1>
        <h1>11</h1>
        <h1>12</h1>
        <h1>13</h1>
        <h1>14</h1>
        <h1>15</h1>
        <h1>16</h1>
        <h1>17</h1>
        <h1>18</h1>
        <h1>19</h1>
        <h1>20</h1>
        <h1>21</h1>
        <h1>22</h1>
        <h1>23</h1>
        <h1>24</h1>
        <h1>25</h1>
        <h1>26</h1>
        <h1>27</h1>
        <h1>28</h1>
        <h1>29</h1>
        <h1>30</h1>
        <h1>31</h1>
        <h1>32</h1>
        <h1>33</h1>
        <h1>34</h1>
        <h1>35</h1>
        <h1>36</h1>
        <h1>37</h1>
        <h1>38</h1>
        <h1>39</h1>
        <h1>40</h1>
        <h1>41</h1>
        <h1>42</h1>
        <h1>43</h1>
        <h1>44</h1>
        <h1>45</h1>
        <h1>46</h1>
        <h1>47</h1>
        <h1>48</h1>
        <h1>49</h1>
        <h1>50</h1>
        <h1>51</h1>
        <h1>52</h1>
        <h1>53</h1>
        <h1>54</h1>
        <h1>55</h1>
        <h1>56</h1>
        <h1>57</h1>
        <h1>58</h1>
        <h1>59</h1>
        <h1>60</h1>
        <h1>61</h1>
        <h1>62</h1>
        <h1>63</h1>
        <h1>64</h1>
        <h1>65</h1>
        <h1>66</h1>
        <h1>67</h1>
        <h1>68</h1>
        <h1>69</h1>
        <h1>70</h1>
        <h1>71</h1>
        <h1>72</h1>
        <h1>73</h1>
        <h1>74</h1>
        <h1>75</h1>
        <h1>76</h1>
        <h1>77</h1>
        <h1>78</h1>
        <h1>79</h1>
        <h1>80</h1>
        <h1>81</h1>
        <h1>82</h1>
        <h1>83</h1>
        <h1>84</h1>
        <h1>85</h1>
        <h1>86</h1>
        <h1>87</h1>
        <h1>88</h1>
        <h1>89</h1>
        <h1>90</h1>
        <h1>91</h1>
        <h1>92</h1>
        <h1>93</h1>
        <h1>94</h1>
        <h1>95</h1>
        <h1>96</h1>
        <h1>97</h1>
        <h1>98</h1>
        <h1>99</h1>
        <h1>100</h1>
    </div>
    <a href="javascript:;"></a>
    <script>
        let header = document.querySelector('header')
        let nav = document.querySelector('nav')
        let a = document.querySelector('a')
        window.addEventListener('scroll', function () {
            let scrollTop = document.documentElement.scrollTop;
            if (scrollTop >= 200) {
                nav.classList.add('fix')
                header.style.marginBottom = 240 + 'px'
            } else {
                nav.classList.remove('fix')
                header.style.marginBottom = 0

            };
            if (scrollTop >= 2000) {
                a.style.display = 'block';
            } else {
                a.style.display = 'none';
            };


        })

        a.addEventListener('click', function () {
            let timeId = setInterval(() => {
                document.documentElement.scrollTop -= 100;
                if (document.documentElement.scrollTop === 0) {
                    clearInterval(timeId)
                }
            }, 20);


        })


    </script>
</body>

</html>

加载事件 load

1.初识加载事件
定义

加载外部资源(如图片、外联CSS和JavaScript等)加载完毕时触发的事件

学习的原因
  • 有些时候需要等页面资源全部处理完了做一些事情
  • 老代码喜欢把 script 写在 head 中,这时候直接找 dom 元素找不到
2.使用
load

事件名:load

监听页面所有资源加载完毕

  • 作用:当要获取资源信息的属性时(比如获取图片的高度),需要资源全部加载出来之后才可以获取,就需要在window load 中进行资源全部加载,之后才可以成功获取。

  • 给 window 添加 load 事件

  • 需要所有的标签以及内容资源全部加载出来才触发

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ra0XNWbT-1649939359891)(05-DOM-%20%E7%BD%91%E9%A1%B5%E7%89%B9%E6%95%88%E7%AF%87.assets/1649824517211.png)]

            window.addEventListener('load', function () {
                console.log('需要资源全部加载完才触发');
            })
    
  • 注意:不光可以监听整个页面资源加载完毕,也可以针对某个资源绑定load事件

DOMContentLoaded

事件名:DOMContentLoaded

监听页面DOM加载完毕:标签加载完即可触发

  • 当初始的 HTML 文档被完全加载和解析完成之后,DOMContentLoaded 事件被触发,而无需等待样式表、图像等完全加载

监听页面DOM加载完毕:

  • 给 document 添加 DOMContentLoaded 事件

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hvyWnbaY-1649939359891)(05-DOM-%20%E7%BD%91%E9%A1%B5%E7%89%B9%E6%95%88%E7%AF%87.assets/1649824725807.png)]

            document.addEventListener('DOMContentLoaded', function () {
                console.log('标签加载完就触发');
            })
    

元素大小和位置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FO7zhUZp-1649939359891)(05-DOM-%20%E7%BD%91%E9%A1%B5%E7%89%B9%E6%95%88%E7%AF%87.assets/1649906485088.png)]

scroll家族

1.初识scroll
使用场景
  • 我们想要页面滚动一段距离,比如100px,就让某些元素显示隐藏,那我们怎么知道,页面滚动了100像素呢?
  • 就可以使用scroll 来检测页面滚动的距离~~~
获取宽高
  • 获取元素的**内容总宽高( 内容+内边距-滚动条)**返回值不带单位

  • scrollWidth和scrollHeight

    • scrollWidth 不包含 滚动条 大小(滚动的宽度等于 = 元素的宽度 - 滚动条的宽度 )
    • scrollWidth 等于容器可以滚动的大小

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RTEGRusa-1649939359892)(05-DOM-%20%E7%BD%91%E9%A1%B5%E7%89%B9%E6%95%88%E7%AF%87.assets/1649824968473.png)]

    获取当前容器的宽度跟高度(如果内容的宽高大于盒子的宽高,宽高会被内容刷新)

        <script>
            const div = document.querySelector('div')
            console.log(div.scrollHeight);
            console.log(div.scrollWidth);
      	</script>
    
获取位置
  • 获取元素内容往左、往上滚出去看不到的距离

  • scrollLeft和scrollTop

  • 这两个属性是可以修改的

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NSZvYCD5-1649939359892)(05-DOM-%20%E7%BD%91%E9%A1%B5%E7%89%B9%E6%95%88%E7%AF%87.assets/1649825035210.png)]

2.页面滚动事件

开发中,我们经常检测页面滚动的距离,比如页面滚动100像素,就可以显示一个元素,或者固定一个元素

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u1v7lOSC-1649939359892)(05-DOM-%20%E7%BD%91%E9%A1%B5%E7%89%B9%E6%95%88%E7%AF%87.assets/1649825124489.png)]

  • 代码展示

        window.addEventListener('scroll', function () {
            let scrollTop = document.documentElement.scrollTop
            console.log(scrollTop);
        })
    
        <script>
            const div = document.querySelector('div')
            div.addEventListener('scroll', function () {
                console.log(div.scrollHeight);
                console.log(div.scrollWidth);
            })
        </script>
    
  • 注意事项

    • document.documentElement HTML 文档返回对象为HTML元素

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mi7ohcwU-1649939359893)(05-DOM-%20%E7%BD%91%E9%A1%B5%E7%89%B9%E6%95%88%E7%AF%87.assets/1649825379417.png)]

3.总结
  1. 页面滚动 使用 window.addEventListener(“scroll”) 事件

页面的滚动距离 document.documentElement.scrollTop

  1. 元素滚动 dom.addEventListener(“scroll”)

  2. 获取元素滚动的距离

    • dom.scrollTop
    • dom.scrollLeft
  3. scrollWidth 整个可以滚动的区间的宽度

  4. scrollHeight 整个可以滚动的区域的高度

  5. 细节

  • PC端的滚动条大小 17px
  • *移动端的滚动条 不占大小
4.案例
页面滚动显示返回顶部按钮
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        header {
            height: 200px;
            background-color: pink;
        }

        nav {
            height: 250px;
            background-color: yellow;
        }

        div {
            background-color: aqua;
        }

        .fix {
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
        }

        a {
            width: 150px;
            height: 195px;
            position: fixed;
            bottom: 100px;
            right: 50px;
            background-image: url(../02-网页特效学习/04-小火箭/images/gotop.png);
            display: none;
        }

        a:hover {
            background-image: url(../02-网页特效学习/04-小火箭/images/gotop.gif);
        }

        /* a {
        width: 150px;
        height: 195px;
        position: fixed;
        bottom: 100px;
        right: 50px;
        background-image: url(./images/gotop.png);
        /* display: none; */
    </style>
</head>

<body>
    <header></header>
    <nav></nav>
    <div>
        <h1>1</h1>
        <h1>2</h1>
        <h1>3</h1>
        <h1>4</h1>
        <h1>5</h1>
        <h1>6</h1>
        <h1>7</h1>
        <h1>8</h1>
        <h1>9</h1>
        <h1>10</h1>
        <h1>11</h1>
        <h1>12</h1>
        <h1>13</h1>
        <h1>14</h1>
        <h1>15</h1>
        <h1>16</h1>
        <h1>17</h1>
        <h1>18</h1>
        <h1>19</h1>
        <h1>20</h1>
        <h1>21</h1>
        <h1>22</h1>
        <h1>23</h1>
        <h1>24</h1>
        <h1>25</h1>
        <h1>26</h1>
        <h1>27</h1>
        <h1>28</h1>
        <h1>29</h1>
        <h1>30</h1>
        <h1>31</h1>
        <h1>32</h1>
        <h1>33</h1>
        <h1>34</h1>
        <h1>35</h1>
        <h1>36</h1>
        <h1>37</h1>
        <h1>38</h1>
        <h1>39</h1>
        <h1>40</h1>
        <h1>41</h1>
        <h1>42</h1>
        <h1>43</h1>
        <h1>44</h1>
        <h1>45</h1>
        <h1>46</h1>
        <h1>47</h1>
        <h1>48</h1>
        <h1>49</h1>
        <h1>50</h1>
        <h1>51</h1>
        <h1>52</h1>
        <h1>53</h1>
        <h1>54</h1>
        <h1>55</h1>
        <h1>56</h1>
        <h1>57</h1>
        <h1>58</h1>
        <h1>59</h1>
        <h1>60</h1>
        <h1>61</h1>
        <h1>62</h1>
        <h1>63</h1>
        <h1>64</h1>
        <h1>65</h1>
        <h1>66</h1>
        <h1>67</h1>
        <h1>68</h1>
        <h1>69</h1>
        <h1>70</h1>
        <h1>71</h1>
        <h1>72</h1>
        <h1>73</h1>
        <h1>74</h1>
        <h1>75</h1>
        <h1>76</h1>
        <h1>77</h1>
        <h1>78</h1>
        <h1>79</h1>
        <h1>80</h1>
        <h1>81</h1>
        <h1>82</h1>
        <h1>83</h1>
        <h1>84</h1>
        <h1>85</h1>
        <h1>86</h1>
        <h1>87</h1>
        <h1>88</h1>
        <h1>89</h1>
        <h1>90</h1>
        <h1>91</h1>
        <h1>92</h1>
        <h1>93</h1>
        <h1>94</h1>
        <h1>95</h1>
        <h1>96</h1>
        <h1>97</h1>
        <h1>98</h1>
        <h1>99</h1>
        <h1>100</h1>
    </div>
    <a href="javascript:;"></a>
    <script>
        let header = document.querySelector('header')
        let nav = document.querySelector('nav')
        let a = document.querySelector('a')
        window.addEventListener('scroll', function () {
            let scrollTop = document.documentElement.scrollTop;
            if (scrollTop >= 200) {
                nav.classList.add('fix')
                header.style.marginBottom = 240 + 'px'
            } else {
                nav.classList.remove('fix')
                header.style.marginBottom = 0

            };
            if (scrollTop >= 2000) {
                a.style.display = 'block';
            } else {
                a.style.display = 'none';
            };


        })

        a.addEventListener('click', function () {
            let timeId = setInterval(() => {
                document.documentElement.scrollTop -= 100;
                if (document.documentElement.scrollTop === 0) {
                    clearInterval(timeId)
                }
            }, 20);


        })


    </script>
</body>

</html>

offset家族

1.初识offset
使用场景
  • 前面案例滚动多少距离,都是我们自己算的,最好是页面滚动到某个元素,就可以做某些事。
  • 简单说,就是通过js的方式,得到元素在页面中的位置这样我们可以做,页面滚动到这个位置,就可以返回顶部的小盒子显示…
获取宽高

offset 的宽度跟高度是包含滚动条的(也就是整个元素的宽高->内容 + padding + border

offset 的 宽高 不计算被内容撑开的滚动区域—>可视区

  • 获取元素的自身宽高、包含元素自身设置的宽高、padding、border

  • offsetWidth和offsetHeight

        <script>
            const son = document.querySelector('.son')
            console.log(son.offsetHeight);
            console.log(son.offsetWidth);
        </script>
    
获取位置
  • 获取元素距离自己定位父级元素的左、上距离

  • offsetLeft和offsetTop 注意是只读属性

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xlbwmGeR-1649939359893)(05-DOM-%20%E7%BD%91%E9%A1%B5%E7%89%B9%E6%95%88%E7%AF%87.assets/1649905376207.png)]

    获取元素的位置

    获取当前元素距离 定位了的父元素的大小(找不到定位了的父元素,相对于页面来计算)**

        <script>
            const son = document.querySelector('.son')
            console.log(son.offsetHeight);
            console.log(son.offsetWidth);
            console.log(son.offsetLeft);//距离左侧的距离
            console.log(son.offsetTop);//距离顶部的距离
        </script>
    
2.总结
  1. offsetWidth 获取元素的宽度 包含这滚动条
  2. offsetHeight 获取元素的高度 包含这滚动条
  3. offsetLeft 获取定位了的父元素的 水平距离 左
  4. offsetTop 获取定位了的父元素的 垂直距离 上

client家族

初识client
获取宽高
  • 获取元素的可见部分宽高(不包含边框,滚动条等)

  • clientWidth和clientHeight

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N05rgH46-1649939359893)(05-DOM-%20%E7%BD%91%E9%A1%B5%E7%89%B9%E6%95%88%E7%AF%87.assets/1649906988224.png)]

    client 获取的宽高要减去 滚动条

        <script>
            const box = document.querySelector('.box')
            console.log(box.clientHeight); // 不包含 滚动条(类似 scrollWidth)
            console.log(box.clientWidth);// 不包含 滚动条(类似 scrollHeight)
        </script>
    
获取位置
  • 获取左边框和上边框宽度(没有右边框跟下边框)

  • clientLeft和clientTop

        <script>
            const box = document.querySelector('.box')
            console.log(box.clientHeight);
            console.log(box.clientWidth);
            console.log(box.clientLeft);//获取 左 边框的宽度
            console.log(box.clientTop);//获取 上 边框的宽度
        </script>
    
总结
  1. width
    • scollWidth 获取容器的宽度(包含滚动的区域)
    • offsetWidth 获取可视区域的宽度(包含滚动条)
    • clientWidth 获取可视区域的宽度(不包含滚动条)
  2. left
    • scrollLeft 获取左侧滚动的距离
    • offsetLeft 获取和已经定位了的父级元素的左距离
      ')
      console.log(box.clientHeight); // 不包含 滚动条(类似 scrollWidth)
      console.log(box.clientWidth);// 不包含 滚动条(类似 scrollHeight)

##### 获取位置

- 获取左边框和上边框宽度(没有右边框跟下边框)

- clientLeft和clientTop   

```js
    <script>
        const box = document.querySelector('.box')
        console.log(box.clientHeight);
        console.log(box.clientWidth);
        console.log(box.clientLeft);//获取 左 边框的宽度
        console.log(box.clientTop);//获取 上 边框的宽度
    </script>
总结
  1. width
    • scollWidth 获取容器的宽度(包含滚动的区域)
    • offsetWidth 获取可视区域的宽度(包含滚动条)
    • clientWidth 获取可视区域的宽度(不包含滚动条)
  2. left
    • scrollLeft 获取左侧滚动的距离
    • offsetLeft 获取和已经定位了的父级元素的左距离
    • clientLeft 获取左边框的大小
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值