PC端网页特效

575 阅读3分钟

五 PC端网页特效

1.元素偏移量 offset 系列

1.1 offset 概述

image-20230113124345745.png

image-20230113124409008.png


#### 1.2 offset 与 style 区别

![image-20230113124453929.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5bac8ff7714d430a9afb41a4bc49e6e2~tplv-k3u1fbpfcp-watermark.image?)
​                Document            .box {            width: 200px;            height: 200px;            background-color: pink;            padding: 10px;       }     ​    
    ​ ```

案例:获取鼠标在盒子内的坐标

  • 我们在盒子内点击,想要得到鼠标距离盒子左右的距离。
  • 首先得到鼠标在页面中的坐标(e.pageX, e.pageY)
  • 其次得到盒子在页面中的距离 ( box.offsetLeft, box.offsetTop)
  • 用鼠标距离页面的坐标减去盒子在页面中的距离,得到 鼠标在盒子内的坐标
  • 如果想要移动一下鼠标,就要获取最新的坐标,使用鼠标移动事件 mousemove
  • var box = document.querySelector('.box');
    box.addEventListener('mousemove', function(e) {
    var x = e.pageX - this.offsetLeft;
    var y = e.pageY - this.offsetTop;
    this.innerHTML = 'x坐标是' + x + ' y坐标是' + y;
    })
    
<!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>
        .box {
            width: 300px;
            height: 300px;
            background-color: pink;
            margin: 200px;
        }
    </style>
</head><body>
    <div class="box"></div>
    <script>
        var box = document.querySelector('.box');
        box.addEventListener('mousemove', function(e) {
            // console.log(e.pageX);
            // console.log(e.pageY);
            // console.log(box.offsetLeft);
            var x = e.pageX - this.offsetLeft;
            var y = e.pageY - this.offsetTop;
            this.innerHTML = 'x坐标是' + x + ' y坐标是' + y;
        })
    </script>
</body></html>

2.元素可视区 client 系列

image-20230113125350160.png

<!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 {
            width: 200px;
            height: 200px;
            background-color: pink;
            border: 10px solid red;
            padding: 10px;
        }
    </style>
</head><body>
    <div></div>
    <script>
        // client 宽度 和ffsetWidth 最大区别是 client不包含边框
        var div = document.querySelector('div');
        console.log(div.clientWidth); //220
    </script>
</body></html>
![image-20230113125407048.png](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/cdf2bd8a5969457f8c159580e5316964~tplv-k3u1fbpfcp-watermark.image?)
立即执行函数 (function() {})() 或者 (function(){}())

主要作用: 创建一个独立的作用域。 避免了命名冲突问题

-   立即执行函数:



下面三种情况都会刷新页面都会触发 load 事件。

0.  a标签的超链接

0.  F5或者刷新按钮(强制刷新)

0.  前进后退按钮

    但是 火狐中,有个特点,有个“往返缓存”,这个缓存中不仅保存着页面数据,还保存了DOM和JavaScript的状态;实际上是将整个页面都保存在了内存里。

    所以此时后退按钮不能刷新页面。

    此时可以使用 pageshow事件来触发。,这个事件在页面显示时触发,无论页面是否来自缓存。在重新加载页面中,pageshow会在load事件触发后触发;根据事件对象中的persisted来判断是否是缓存中的页面触发的pageshow事件,注意这个事件给window添加。


### 3.元素滚动 scroll 系列

#### 3.1 元素 scroll 系列属性


![image-20230113125650224.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f08750badf8648a8ab39f32784e5d397~tplv-k3u1fbpfcp-watermark.image?)

![image-20230113125705277.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ce34fb159a7543839446480aada60156~tplv-k3u1fbpfcp-watermark.image?)

#### 3.2 页面被卷去的头部

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

​                Document            div {            width: 200px;            height: 200px;            background-color: pink;            border: 10px solid red;            padding: 10px;            overflow: auto;       }     ​    
      我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容    
    ​ ```

3.4 三大系列总结

image-20230113125946525.png

他们主要用法:

  • offset系列 经常用于获得元素位置 offsetLeft offsetTop
  • client 经常用于获取元素大小 clientWidth clientHeight
  • scroll 经常用于获取滚动距离 scrollTop scrollLeft
  • 注意页面滚动的距离通过 window.pageXOffset 获得

3.5 mouseenter 和mouseover的区别

mouseenter 鼠标事件

  • 当鼠标移动到元素上时就会触发 mouseenter 事件
  • 类似 mouseover,它们两者之间的差别是
  • mouseover 鼠标经过自身盒子会触发,经过子盒子还会触发。 mouseenter 只会经过自身盒子触发
  • 之所以这样,就是因为mouseenter不会冒泡
  • 跟mouseenter搭配 鼠标离开 mouseleave 同样不会冒泡
<!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>
        .father {
            width: 300px;
            height: 300px;
            background-color: pink;
            margin: 100px auto;
        }
        
        .son {
            width: 200px;
            height: 200px;
            background-color: purple;
        }
    </style>
</head><body>
    <div class="father">
        <div class="son"></div>
    </div>
    <script>
        var father = document.querySelector('.father');
        var son = document.querySelector('.son');
        father.addEventListener('mouseenter', function() {
            console.log(11);
​
        })
    </script>
</body></html>