基本网页特效(一)

offset系列

offset概述

offset.png

offset与style的区别

offset与style的区别.png

演示

HTML:

    <div class="father">
        <div class="son"></div>
    </div>
    <div class="w"></div>

CSS:

    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .father {
            position: relative;
            width: 200px;
            height: 200px;
            background-color: pink;
            margin: 150px;
        }

        .son {
            width: 100px;
            height: 100px;
            background-color: purple;
            margin-left: 45px;
        }

        .w {
            height: 200px;
            background-color: skyblue;
            margin: 0 auto 200px;
            padding: 10px;
            border: 15px solid red;
        }
    </style>
image.png
  • 元素偏移offset:可以得到元素的偏移位置,返回不带单位的数值
        var father = document.querySelector('.father');

        console.log(father.offsetTop);   // 150
        console.log(father.offsetLeft);   // 150

如果有定位的父元素,则以定位父元素为准
如果没有定位的父元素,则以body为准

        var son = document.querySelector('.son');

        console.log(son.offsetTop);    // 0
        console.log(son.offsetLeft);   // 45
  • 获取元素大小:返回的值是元素固有的宽度或高度加上padding和border的值
        var w = document.querySelector('.w');
        
        console.log(w.offsetWidth);   // style 中并没有设定 width 值,所以会根据其在屏幕中显示的大小来输出值
        console.log((w.offsetHeight));  // 250 = 200 + (10 + 15)*2
  • 返回当前元素的父元素:
        console.log(son.offsetParent);  // 返回带有定位的父元素,否则直接返回body
        console.log(son.parentNode);   // 直接返回父元素

得到鼠标在盒子中的距离

<!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>
    <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">

    <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);
            var x = e.pageX - this.offsetLeft;    //  鼠标离文档左边界的距离 - div盒子离文档左边界的距离
            var y = e.pageY - this.offsetTop;     //  同上
            // console.log(x);
            // console.log(y);
            this.innerHTML = 'index_X: ' + x + '    index_Y: ' + y;
        });
    </script>
</body>
</html>

client系列

元素可视区client系列

client直译为客户端,使用client系列的相关属性来获取元素可视区的相关信息。通过client系列的相关属性可以动态的得到该元素的边框大小、元素大小等等


元素可视区client.png

client属性

client.png
        // client 宽度 和我们offsetWidth 最大的区别就是 不包含边框
        var div = document.querySelector('div');
        console.log(div.clientWidth);

立即执行函数

  • 传统函数的声明与调用:不调用不执行:
        function fn() {
            console.log(1);
        }
        fn();
  • 立即执行函数:不需要调用,立马能够自己执行的函数:
( function() {} )();

也可以这样写:

( function(){}() );

可以传递参数进来:

        (function (a, b) {
            console.log(a + b);
            var num = 10;
        })(1, 2);     // 第二个小括号可以看做是调用函数

或者:

        (function sum(a, b) {
            console.log(a + b);
            var num = 10;     // 局部变量
        }(2, 3));

立即执行函数最大的作用就是 独立创建了一个作用域, 里面所有的变量都是局部变量 不会有命名冲突的情况

现在分析以下立即执行函数

(function flexible(window, document) {
    var docEl = document.documentElement        // 获取的html 的根元素
    var dpr = window.devicePixelRatio || 1           // dpr 物理像素比

    // adjust body font size  设置我们body 的字体大小
    function setBodyFontSize() {
        // 如果页面中有body 这个元素 就设置body的字体大小
        if (document.body) {
            document.body.style.fontSize = (12 * dpr) + 'px'
        } else {
            // 如果页面中没有body 这个元素,则等着 我们页面主要的DOM元素加载完毕再去设置body
            // 的字体大小
            document.addEventListener('DOMContentLoaded', setBodyFontSize)
        }
    }
    setBodyFontSize();

    // set 1rem = viewWidth / 10    设置我们html 元素的文字大小
    function setRemUnit() {
        var rem = docEl.clientWidth / 10
        docEl.style.fontSize = rem + 'px'
    }
    setRemUnit()

    // reset rem unit on page resize  当我们页面尺寸大小发生变化的时候,要重新设置下rem 的大小
    window.addEventListener('resize', setRemUnit)
        // pageshow 是我们重新加载页面触发的事件
    window.addEventListener('pageshow', function(e) {
        // e.persisted 返回的是true 就是说如果这个页面是从缓存取过来的页面,也需要从新计算一下rem 的大小
        if (e.persisted) {
            setRemUnit()
        }
    })

    // detect 0.5px supports  有些移动端的浏览器不支持0.5像素的写法
    if (dpr >= 2) {
        var fakeBody = document.createElement('body')
        var testElement = document.createElement('div')
        testElement.style.border = '.5px solid transparent'
        fakeBody.appendChild(testElement)
        docEl.appendChild(fakeBody)
        if (testElement.offsetHeight === 1) {
            docEl.classList.add('hairlines')
        }
        docEl.removeChild(fakeBody)
    }
}(window, document))

scroll系列

scroll直译过来为滚动的,使用scroll系列的相关属性可以动态得到该元素的大小、滚动距离等

scroll.png
scroll属性.png

HTML:

    <div class="box">
        This is a very long para...
        This is a very long para...
        This is a very long para...
        This is a very long para...
        This is a very long para...
        This is a very long para...
        This is a very long para...
        This is a very long para...
        This is a very long para...
        This is a very long para...
        This is a very long para...
        This is a very long para...

    </div>
image.png

scrollHeight 与 clientHeight 异同:

  • 都是只包含 width 和 padding ,不包含 border 和 margin
  • scrollHeight 包含盒子中内容的长度,clientHeight 仅包含元素可视区的长度
        var div = document.querySelector('.box');

        console.log(div.scrollHeight);    // 332
        console.log(div.clientHeight);    // 220

scroll 滚动事件:当滚动条发生变化时,会触发事件

        div.addEventListener('scroll', function(){
            console.log(div.scrollTop);      // 返回被卷起的上侧距离
        })

三大系列总结

三大系列总结1.png

它们的主要用法:

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

mouseover与mouseenter的区别

当鼠标移动到元素上就会触发mouseenter事件
类似于mouseover,它们之间的区别是:

  • mouseover 鼠标经过自身盒子会触发,经过子盒子还会触发。而mouseenter只会经过自身盒子触发
  • 之所以这样,是因为mouseenter不会冒泡
  • 跟mouseenter搭配使用的mouseleave同样不会冒泡
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容