一些常规操作的js小插件

if (!window.myPlugin) {
    window.myPlugin = {};
}

/**
 * 克隆obj对象,deep默认位true
 */
window.myPlugin.cloneObj = function (obj, deep) {
    if (deep === undefined) {
        deep = true;
    }
    if (Array.isArray(obj)) {
        var newArr = [];
        if (deep) {
            for (var prop in obj) {
                newArr.push(this.cloneObj(obj[prop]));
            }
            return newArr;
        } else {
            return newArr.slice.apply(obj);
        }
    } else if (typeof obj === 'object') {
        var newObj = {};
        if (deep) {
            for (var prop in obj) {
                newObj[prop] = this.cloneObj(obj[prop]);
            }
        } else {
            for (var prop in obj) {
                newObj[prop] = obj[prop];
            }
        }
        return newObj;
    } else {
        //原始类型
        return obj;
    }
}
/**
 * 将obj1混合到obj2,返回一个新对象
 */
window.myPlugin.mixtrueObj = function (obj1, obj2) {
    var newObj = window.myPlugin.cloneObj(obj2, true);
    for (var prop in obj1) {
        newObj[prop] = obj1[prop];
    }
    return newObj;
}

/**
 * 函数防抖:在达到运行条件后,duration ms之后运行一次callback,如果在duration ms之内再次触发函数运行条件,则重新计时
 * @param {*} callback 
 * @param {*} duration 
 * @returns 
 */
window.myPlugin.debounce = function (callback, duration) {
    var timer;
    return function () {
        clearTimeout(timer);
        var args = arguments;
        timer = setTimeout(function () {
            callback.apply(null, args);
        }, duration)
    }
}

/**
 * 函数节流:当触发函数运行条件后,每隔duration运行一次
 * @param {*} callback 
 * @param {*} duration 
 * @param {*} immediately 表示第一次执行是立即执行还是durations ms之后运行
 */
window.myPlugin.throttle = function (callback, duration, immediately) {
    var t;
    var timer;
    if (immediately) {
        return function () {
            if (!t || Date.now() - t >= duration) {
                callback.apply(null, arguments);
                t = Date.now();
            }
        }
    } else {
        return function () {
            var args = arguments;
            timer = setTimeout(function () {
                callback.apply(null, args);
                timer = null;
            }, duration)
        }
    }
}
/**
 * 创建一个图片瀑布流
 * @param {Object} options 
 */
window.myPlugin.waterFall = function (options) {
    var defaultConfig = {
        minGap: 10,
        imgs: [],
        imgWidth: 200,
        container: document.body,
    };
    options = Object.assign({}, defaultConfig, options);
    var imgDoms = [];
    function handleParent() {
        var style = window.getComputedStyle(options.container);
        if (style.position === 'static') {
            options.container.style.position = 'relative';
        }
    }
    var debounce = myPlugin.debounce(setImgPosition, 100);

    handleParent();
    createImg();

    window.onresize = debounce;

    //创建图片元素
    function createImg() {
        var len = options.imgs.length;
        for (var i = 0; i < len; ++i) {
            var img = document.createElement('img');
            img.src = options.imgs[i];
            img.style.position = 'absolute';
            img.style.width = options.imgWidth + 'px';
            imgDoms.push(img);
            img.onload = debounce;
            options.container.appendChild(img);
        }
    }
    //得到水平信息
    function horizontalInfo() {
        var info = {};
        info.totalWidth = options.container.clientWidth;
        info.number = (info.totalWidth + options.minGap) / (options.imgWidth + options.minGap);
        info.number = Math.floor(info.number);
        info.gap = (info.totalWidth - info.number * options.imgWidth) / (info.number - 1);

        return info;
    }
    //设置图片坐标
    function setImgPosition() {
        var tops = [];
        var info = horizontalInfo();
        tops.length = info.number;
        tops.fill(0);
        for (var i = 0; i < imgDoms.length; ++i) {
            var minTop = Math.min.apply(null, tops);
            var index = tops.indexOf(minTop);
            imgDoms[i].style.top = minTop + 'px';
            // if (info.gap > options.minGap) {
            tops[index] += imgDoms[i].clientHeight + info.gap;
            // } else {
            // tops[index] += imgDoms[i].clientHeight + options.minGap;
            // }
            imgDoms[i].style.left = (info.gap + options.imgWidth) * index + 'px';
            var maxTop = Math.max.apply(null, tops) - info.gap;
            options.container.style.height = maxTop + 'px';
        }
    }
}


/**
 * 该函数是一个构造函数
 * 动画插件:css3中的transition有兼容性问题,动画难以停止,难以恢复
 * 动画:某些元素的某些属性。在一段时间内,从一个值变化到另一个值
 * 动画插件:某些数字,在一段时间内,从一个值变化到另一个值
 * @param {*} propObj 
 */
 window.myPlugin.Animate = function (option) {
    var defaultConfig = {
        totalTime: 1000,
        duration: 16,
        begin: {},
        end: {}
    }
    this.option = myPlugin.mixtrueObj(option, defaultConfig);
    this.curData = myPlugin.cloneObj(this.option.begin);
    this.curNumber = 0;
    this.number = Math.ceil(this.option.totalTime / this.option.duration);
    this.distance = {};
    this.timer = null;
    this.everyDis = {};
    for (var prop in this.option.end) {
        this.distance[prop] = this.option.end[prop] - this.option.begin[prop];
        this.everyDis[prop] = this.distance[prop] / this.number;
    };
}
window.myPlugin.Animate.prototype.start = function () {
    if (this.option.onstart) {
        this.option.onstart();
    }
    if (this.timer || this.curNumber === this.number) {
        return;
    }
    var that = this;
    this.timer = setInterval(function () {
        for (var prop in that.option.end) {
            if (that.curNumber === that.number) {
                that.curData[prop] = that.option.end[prop];
            } else {
                that.curData[prop] += that.everyDis[prop];
            }
            if (that.option.onmove) {
                that.option.onmove.call(that);
            }
        }
        if (that.curNumber === that.number) {
            that.stop();
        }
        that.curNumber++;
    }, this.duration);

}

window.myPlugin.Animate.prototype.stop = function () {
    if (this.option.onstop) {
        this.option.onstop();
    }
    clearInterval(this.timer);
    this.timer = null;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值