• 用面向对象编程解决常见需求场景


    面向对象编程的一个好处是格式套路化,书写格式套路化更有利于记忆。而es6的class比es5的构造函数模式更加套路化,所以采用class形式来写。

    1,写一个拖动组件

       class dragDropDom {
                constructor(id) {
                    this.mouseDownX = 0
                    this.mouseDownY = 0
                    this.initX = 0
                    this.initY = 0
                    this.flag = false // 标记是否滑动
                    this.obj = document.getElementById(id)
                }
                createMoveBox() {
                    this.addEvent()
                }
    
                addEvent() {
                    this.obj.onmousedown = (e) => {
                        //鼠标按下时的鼠标所在的X,Y坐标  
                        this.mouseDownX = e.pageX;
                        this.mouseDownY = e.pageY;
    
                        //初始位置的X,Y 坐标  
                        const {
                            offsetLeft,
                            offsetTop
                        } = this.obj
                        this.initX = offsetLeft;
                        this.initY = offsetTop;
    
                        //表示鼠标已按下  
                        this.flag = true;
                    }
                    window.onmousemove = (e) => {
                        this.resetDefaultEvent(e)
                        // 确保鼠标已按下  
                        if (this.flag) {
                            const {pageX, pageY} = e
                            const left = parseInt(pageX) - parseInt(this.mouseDownX) + parseInt(this.initX) +
                                "px"
                            const top = parseInt(pageY) - parseInt(this.mouseDownY) + parseInt(this.initY) +
                                "px"
                            this.obj.style.cssText = `left:${left};top:${top}`
                        }
    
                    }
                    window.onmouseup = (e) => {
                        this.resetDefaultEvent(e)
                        //标识已松开鼠标  
                        this.flag = false;
                    }
                }
    
                resetDefaultEvent(e) {
                    e.preventDefault();
                    e.stopPropagation();
                }
            }
            const inst = new dragDropDom('box')
            inst.createMoveBox()
    

      

    2,无限加载实现

    <!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>前端无限加载</title>
        <style>
            .parent-div {
                height: 300px;
                 200px;
                border: 1px solid red;
                overflow: auto;
                padding: 0;
            }
    
            .parent-div ol {
                margin: 0;
            }
    
            .parent-div ol li {
                height: 50px;
            }
        </style>
    </head>
    
    <body>
        <div class="parent-div">
            <ol class="list-box">
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
            </ol>
        </div>
        <script>
    
            class noLimitLoad {
                constructor() {
                    this.pagesize = 10
                    this.wrapper = document.querySelector('.parent-div');
                    this.listBox = this.wrapper.querySelector('.list-box');
                }
                generateFragment() {
                    const fragment = document.createDocumentFragment();
                    for (let i = 0; i < this.pagesize; i++) {
                        const li = document.createElement('li');
                        li.innerHTML = 'apple' + i;
                        fragment.appendChild(li);
                    }
                    return fragment
                }
    
                addScrollEvent() {
                    this.wrapper.addEventListener('scroll', (e) => {
                        const boxHeight = this.wrapper.clientHeight;
                        const {
                            scrollTop
                        } = e.target;
                        const listHeight = this.listBox.clientHeight;
                        if (boxHeight + scrollTop + 10 >= listHeight) {
                           this.listBox.appendChild(this.generateFragment())
                        }
                    });
                }
    
                init(){
                    this.addScrollEvent()
                }
            }
    
            const load = new noLimitLoad()
            load.init()
        </script>
    </body>
    
    </html>
    

    3,图片懒加载的两种方案

    <!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>图片懒加载</title>
        <style>
            img {
                display: block;
                 100%;
                height: 300px;
                margin-bottom: 20px;
            }
        </style>
    </head>
    
    <body>
        <img data-src="./images/1.jpg" alt="">
        <img data-src="./images/2.jpg" alt="">
        <img data-src="./images/3.jpg" alt="">
        <img data-src="./images/4.jpg" alt="">
        <img data-src="./images/5.jpg" alt="">
        <img data-src="./images/6.jpg" alt="">
        <img data-src="./images/7.jpg" alt="">
        <img data-src="./images/8.jpg" alt="">
        <img data-src="./images/9.jpg" alt="">
        <img data-src="./images/10.jpg" alt="">
        <img data-src="./images/1.jpg" alt="">
        <img data-src="./images/2.jpg" alt="">
    </body>
    <script>
      
    
        class lazyLoadImg1 {
            constructor() {
                this.imgs = document.querySelectorAll('img');
            }
    
            lazyLoad() {
                let H = document.documentElement.clientHeight; //获取可视区域高度
                let S = document.documentElement.scrollTop || document.body.scrollTop;
                let len = this.imgs.length
                for (let i = 0; i < len; i++) {
                    if (H + S > this.getTop(this.imgs[i])) {
                        this.imgs[i].src = this.imgs[i].getAttribute('data-src');
                    }
                }
            }
    
            getTop() {
                let T = e.offsetTop;
                while (e = e.offsetParent) {
                    T += e.offsetTop;
                }
                return T;
            }
    
            addEvent() {
                window.onload = window.onscroll = () => { //onscroll()在滚动条滚动的时候触发
                    this.lazyLoad(this.imgs);
                }
            }
        }
    
        // 利用getBoundingClientRect
        class lazyLoadImg2 {
            constructor() {
                this.imgs = document.querySelectorAll('img');
            }
    
            isIn(el) {
                let bound = el.getBoundingClientRect();
                let clientHeight = window.innerHeight;
                return bound.top <= clientHeight;
            }
    
            check() {
                Array.from(this.imgs).forEach((el)=> {
                    if (this.isIn(el)) {
                        this.loadImg(el);
                    }
                })
            }
    
            loadImg(el) {
                if (!el.src) {
                    let source = el.dataset.src;
                    el.src = source;
                }
            }
    
            addEvent() {
                window.onload = window.onscroll =  ()=> { //onscroll()在滚动条滚动的时候触发
                    this.check();
                }
            }
        }
        
    </script>
    
    </html>
    

      就像高考想要得高分,除了对题目有深刻的理解还需要一定量的题目练习。不是题海战术,但没有一定数量的题目练习想要在面试中有一个好的成绩也是不行的。

          github地址:https://github.com/zhensg123/ordinary-exercise

    我站在山顶看风景!下面是我的家乡!
  • 相关阅读:
    Python+MySQL学习笔记(一)
    MySQL的基本操作
    2016.08.15
    使用vue为image的src动态赋值
    json对象与json字符串的转化
    js三元运算符
    uniapp vue中的短信验证码
    设计模式
    回调函数
    自定义注解
  • 原文地址:https://www.cnblogs.com/zhensg123/p/14738305.html
Copyright © 2020-2023  润新知