DOM&BOM基础第5篇

作者: 硅谷干货 | 来源:发表于2021-12-22 00:00 被阅读0次

    前言

    DOM&BOM基础是很重要前端知识,在这里我准备了所有相关知识的概念描述以及示例Demo,连载7篇,和大家一起温故而知新,覆盖每一个知识点,相信在以后的开发和面试中你总会用到它。

    image.png

    offset系列属性

    <body>
        <div class="father">
            <div class="son"></div>
        </div>
        <div class="w"></div>
        <script>
            // offset 系列
            var father = document.querySelector('.father');
            var son = document.querySelector('.son');
            // 1.可以得到元素的偏移 位置 返回的不带单位的数值  
            console.log(father.offsetTop);
            console.log(father.offsetLeft);
            // 它以带有定位的父亲为准  如果么有父亲或者父亲没有定位 则以 body 为准
            console.log(son.offsetLeft);
            var w = document.querySelector('.w');
            // 2.可以得到元素的大小 宽度和高度 是包含padding + border + width 
            console.log(w.offsetWidth);
            console.log(w.offsetHeight);
            // 3. 返回带有定位的父亲 否则返回的是body
            console.log(son.offsetParent); // 返回带有定位的父亲 否则返回的是body
            console.log(son.parentNode); // 返回父亲 是最近一级的父亲 亲爸爸 不管父亲有没有定位
        </script>
    </body>
    

    offset与style的区别

    <body>
        <div class="box" style="width: 200px;"></div>
        <script>
            // offset与style的区别
            var box = document.querySelector('.box');
            console.log(box.offsetWidth);
            console.log(box.style.width);
            // box.offsetWidth = '300px';
            box.style.width = '300px';
        </script>
    </body>
    

    计算鼠标在盒子内的坐标

    <body>
        <div class="box"></div>
        <script>
            // 我们在盒子内点击, 想要得到鼠标距离盒子左右的距离。
            // 首先得到鼠标在页面中的坐标( e.pageX, e.pageY)
            // 其次得到盒子在页面中的距离(box.offsetLeft, box.offsetTop)
            // 用鼠标距离页面的坐标减去盒子在页面中的距离, 得到 鼠标在盒子内的坐标
            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>
    

    拖动的模态框

    <body>
        <div class="login-header"><a id="link" href="javascript:;">点击,弹出登录框</a></div>
        <div id="login" class="login">
            <div id="title" class="login-title">登录会员
                <span><a id="closeBtn" href="javascript:void(0);" class="close-login">关闭</a></span>
            </div>
            <div class="login-input-content">
                <div class="login-input">
                    <label>用户名:</label>
                    <input type="text" placeholder="请输入用户名" name="info[username]" id="username" class="list-input">
                </div>
                <div class="login-input">
                    <label>登录密码:</label>
                    <input type="password" placeholder="请输入登录密码" name="info[password]" id="password" class="list-input">
                </div>
            </div>
            <div id="loginBtn" class="login-button"><a href="javascript:void(0);" id="login-button-submit">登录会员</a></div>
        </div>
        <!-- 遮盖层 -->
        <div id="bg" class="login-bg"></div>
        <script>
            // 1. 获取元素
            var login = document.querySelector('.login');
            var mask = document.querySelector('.login-bg');
            var link = document.querySelector('#link');
            var closeBtn = document.querySelector('#closeBtn');
            var title = document.querySelector('#title');
            // 2. 点击弹出层这个链接 link  让mask 和login 显示出来
            link.addEventListener('click', function() {
                    mask.style.display = 'block';
                    login.style.display = 'block';
                })
                // 3. 点击 closeBtn 就隐藏 mask 和 login 
            closeBtn.addEventListener('click', function() {
                    mask.style.display = 'none';
                    login.style.display = 'none';
                })
                // 4. 开始拖拽
                // (1) 当我们鼠标按下, 就获得鼠标在盒子内的坐标
            title.addEventListener('mousedown', function(e) {
                var x = e.pageX - login.offsetLeft;
                var y = e.pageY - login.offsetTop;
                // (2) 鼠标移动的时候,把鼠标在页面中的坐标,减去 鼠标在盒子内的坐标就是模态框的left和top值
                document.addEventListener('mousemove', move)
    
                function move(e) {
                    login.style.left = e.pageX - x + 'px';
                    login.style.top = e.pageY - y + 'px';
                }
                // (3) 鼠标弹起,就让鼠标移动事件移除
                document.addEventListener('mouseup', function() {
                    document.removeEventListener('mousemove', move);
                })
            })
        </script>
    </body>
    

    client系列

    <head>
        <style>
            div {
                width: 200px;
                height: 200px;
                background-color: pink;
                border: 10px solid red;
                padding: 10px;
            }
        </style>
    </head>
    
    <body>
        <div></div>
        <script>
            // client 宽度 和我们offsetWidth 最大的区别就是 不包含边框
            var div = document.querySelector('div');
            console.log(div.clientWidth);
        </script>
    </body>
    
    </html>
    

    touch触摸事件

    <body>
        <div></div>
        <script>
            // 1. 获取元素
            // 2. 手指触摸DOM元素事件
            var div = document.querySelector('div');
            div.addEventListener('touchstart', function() {
                console.log('我摸了你');
    
            });
            // 3. 手指在DOM元素身上移动事件
            div.addEventListener('touchmove', function() {
                console.log('我继续摸');
    
            });
            // 4. 手指离开DOM元素事件
            div.addEventListener('touchend', function() {
                console.log('轻轻的我走了');
    
            });
        </script>
    </body>
    

    触摸事件对象touchEvent

    <body>
        <div></div>
        <script>
            // 触摸事件对象
            // 1. 获取元素
            // 2. 手指触摸DOM元素事件
            var div = document.querySelector('div');
            div.addEventListener('touchstart', function(e) {
                // console.log(e);
                // touches 正在触摸屏幕的所有手指的列表 
                // targetTouches 正在触摸当前DOM元素的手指列表
                // 如果侦听的是一个DOM元素,他们两个是一样的
                // changedTouches 手指状态发生了改变的列表 从无到有 或者 从有到无
                // 因为我们一般都是触摸元素 所以最经常使用的是 targetTouches
                console.log(e.targetTouches[0]);
                // targetTouches[0] 就可以得到正在触摸dom元素的第一个手指的相关信息比如 手指的坐标等等
    
    
            });
            // 3. 手指在DOM元素身上移动事件
            div.addEventListener('touchmove', function() {
    
    
            });
            // 4. 手指离开DOM元素事件
            div.addEventListener('touchend', function(e) {
                // console.log(e);
                // 当我们手指离开屏幕的时候,就没有了 touches 和 targetTouches 列表
                // 但是会有 changedTouches
    
    
            });
        </script>
    </body>
    

    像素比和pageshow事件

    <body>
    
        <script>
            // console.log(window.devicePixelRatio);
            window.addEventListener('pageshow', function() {
                alert(11);
            })
        </script>
        <a href="http://www.itcast.cn">链接</a>
    </body>
    

    scroll系列

    <head>
        <style>
            div {
                width: 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);
            console.log(div.clientHeight);
            // scroll滚动事件当我们滚动条发生变化会触发的事件
            div.addEventListener('scroll', function() {
                console.log(div.scrollTop);
    
            })
        </script>
    </body>
    
    </html>
    

    仿淘宝固定侧边栏

    <head>
        <style>
            .slider-bar {
                position: absolute;
                left: 50%;
                top: 300px;
                margin-left: 600px;
                width: 45px;
                height: 130px;
                background-color: pink;
            }
            
            .w {
                width: 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 就是被卷去头部的大小 一定要写到滚动的外面
            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>
    

    mouseenter和mouseover的区别

    <head>
        <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>
    

    上一篇:DOM&BOM基础第4篇 - 简书 (jianshu.com)
    下一篇:DOM&BOM基础第6篇 - 简书 (jianshu.com)

    点赞加关注,永远不迷路

    相关文章

      网友评论

        本文标题:DOM&BOM基础第5篇

        本文链接:https://www.haomeiwen.com/subject/gprafrtx.html