美文网首页
面向对象思维用100行代码封装一个拖拽类

面向对象思维用100行代码封装一个拖拽类

作者: codeFarmer | 来源:发表于2018-12-17 16:03 被阅读0次
/**
 * 自定义执行函数将变量封为私有变量
 */
;
(function(window) {
        //这是一个私有属性,不需要被实例访问
        var transform = getTransform();
        function Drag(selector) {
            //放在构造函数中的属性,都是属于每一个实例单独拥有
            this.elem = typeof selector == 'Object' ? selector : document.getElementById(selector);
            this.startX = 0;
            this.startY = 0;
            this.sourceX = 0;
            this.sourceY = 0;

            this.init();
        }
        //原型
        Drag.prototype = {
            constructor: Drag,
            init: function () {
                //初始化需要做些什么事情
                this.setDrag();
            },
            // 稍作改造,仅用于获取当前元素的属性,类似于getName
            getStyle: function(property) {
                return document.defaultView.getComputedStyle ? document.defaultView.getComputedStyle(this.elem, false)[property] : this.elem.currentStyle[property];
            },
            getPosition: function(){
                var pos = {x: 0, y: 0};
                if(transform){
                    var transformValue = this.getStyle(transform);
                    if(transformValue == 'none'){
                        this.elem.style[transform] = 'translate(0, 0)';
                    }else {
                        var temp = transformValue.match(/-?\d+/g);
                        pos = {
                            x: parseInt(temp[4].trim()),
                            y: parseInt(temp[5].trim())
                        }
                    }
                } else {
                    if(this.getStyle('position') == 'static'){
                        this.elem.style.position = 'relative';
                    } else {
                        pos = {
                            x: parseInt(this.getStyle('left') ? this.getStyle('left') : 0),
                            y: parseInt(this.getStyle('top') ? this.getStyle('top') : 0)
                        }
                    }
                }

                return pos;
            },
            setPosition: function(pos){
                if(transform) {
                    this.elem.style[transform] = 'translate('+ pos.x +'px, '+ pos.y +'px)';
                } else {
                    this.elem.style.left = pos.x + 'px';
                    this.elem.style.top = pos.y + 'px';
                }
            },
            setDrag: function() {
                var self = this;
                this.elem.addEventListener('mousedown',start,false);
                function start(event){
                    self.startX = event.pageX;
                    self.startY = event.pageY;

                    var pos = self.getPosition();

                    self.sourceX = pos.x;
                    self.sourceY = pos.y;
                    document.addEventListener('mousemove',move,false);
                    document.addEventListener('mouseup',end,false);
                }
                function move(event) {
                    var currentX = event.pageX;
                    var currentY = event.pageY;
                    var distanceX = currentX - self.startX;
                    var distanceY = currentY - self.startY;
                    self.setPosition({
                        x: (self.sourceX + distanceX).toFixed(),
                        y: (self.sourceY + distanceY).toFixed(),
                    })
                }
                function end() {
                    document.removeEventListener('mousemove',move);
                    document.removeEventListener('mouseup',end);
                }
            },
        };
        //私有方法,仅仅用来获取transform的兼容写法
        function getTransform() {
            var transform = '',
                divStyle = document.createElement('div').style,
                transformArr = ['transform', 'webkitTransform', 'MozTransform', 'msTransform', 'OTransform'],
                i = 0;
                len = transformArr.length;
            for(; i < len; i++){
                if(transformArr[i] in divStyle){
                    return transform = transformArr[i]
                }
            }
            return transform;
        }
        //一种对外暴露的方式
        window.Drag = Drag;
    })(window);
    new Drag('app');

相关文章

  • 面向对象思维用100行代码封装一个拖拽类

  • 面向对象:封装和继承、多态

    面向对象解决的问题 并不是:封装、继承、多态 而是写代码的套路问题(定势思维) 面向对象的继承,用 extend ...

  • 2021-12-05面向对象与面向过程总结

    面向对象 面向对象编程(OOP) 面向对象编程:是一种编程范式,它以类和对象作为组织代码的单元,以封装、抽象、继承...

  • 面向对象02-封装

    面向对象02-封装 [TOC] 好处 广义的封装:方法、类、包狭义的封装:类中的属性的封装 封装的具体体现 规范 代码

  • 设计模式:面向对象

    面向对象编程:以类或对象作为组织代码的基本单元,将封装、抽象、继承、多态,作为代码设计和实现的基石。面向对象编程语...

  • Python25_面向对象

    面向对象 ps:不管是什么语言,面向对象的三要素都是:封装(把变量和函数用类封装起来)、继承、多态 面向对象(OO...

  • 类面对对象、封装 继承 多态

    Python——类、面向对象,封装 继承 多态 面向过程:根据业务逻辑从上到下写代码面向对象:将数据与函数绑定到一...

  • (6) python中面向对象

    有意义的面向对象的代码类 是面向对象最核心的观念类、对象实例化类最基本的作用:封装一定要用self,引用 sel...

  • 037_wz_hm_多态

    面向对象三大特性 封装:根据职责将属性和方法封装到一个抽象的类中 定义类的准则 继承:实现代码的重用,相同的代码不...

  • 面试 | java基础

    面向对象 1、面向对象特征? 封装封装是面向对象的特征之一,是对象和类概念的主要特性。封装,也就是把客观事物封装成...

网友评论

      本文标题:面向对象思维用100行代码封装一个拖拽类

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