视觉艺术

基本网页特效(一)

2021-10-23  本文已影响0人  OmewSPG

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
        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
        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 异同:

        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

它们的主要用法:

mouseover与mouseenter的区别

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

上一篇 下一篇

猜你喜欢

热点阅读