common.js

这篇博客介绍了JavaScript中的一些实用函数,包括通过ID、Class和标签名获取元素,元素事件绑定的兼容处理,以及动画函数的封装。其中,animate函数实现了匀速移动元素到指定位置,animateBian函数则提供了变速动画效果。此外,还包含了获取元素样式属性值和设置样式属性值的函数,以及处理鼠标跟随效果的相关方法。这些函数对于JavaScript开发者在实现动态效果和交互时非常有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我的common.js

// 通过id名获取元素
function my$(id) {
    return document.getElementById(id);
}

// 通过class名获取元素
function cl$(cla) {
    return document.getElementsByClassName(cla);
}

// 通过标签名获取元素
function ele$(el) {
    return document.getElementsByTagName(el);
}

// 元素绑定事件兼容处理
// function addEventListener(element, type, fn) {
//     // 判断是不是支持这个方法
//     if(element.addEventListener) {
//         element.addEventListener(type, fn, false);
//     }else if(element.attachEvent) {
//         element.attachEvent("on" + type, fn);
//     }else {
//         element["on" + type] = fn;
//     }
// }

// 封装匀速动画函数--->任意一个元素移动到指定的目标位置
// @params:元素 目标位置
function animate(element, target) {
    // 先清理定时器
    clearInterval(element.timeId);
    element.timeId = setInterval(function () {
        var flag = true;
        // 1.获取元素当前的位置
        var current = element.offsetLeft;
        // 2.div每次移动多少
        var step = 10;
        // 判断往哪边移动
        step = current <= target ? step : -step;
        // 3.每次移动后得距离
        current += step;
        // 4.判断移动后的位置是否达到目标位置
        if (Math.abs(target - current) > Math.abs(step)) {
            element.style.left = current + "px";
            flag = false;
        } else {
            // 清理定时器
            clearInterval(element.timeId);
            element.style.left = target + "px";
            flag = true;
        }
    }, 5)
}

// 简化:封装获取页面向上或者向左卷曲出去的距离值
function getScroll() {
    return {
        left: window.pageXOffset || document.documentElement.scrollLeft,
        top: window.pageYOffset || document.documentElement.scrollTop
    }
}

// 封装变速动画函数--->任意一个元素移动到指定的目标位置
// @params:元素 目标位置
function animateBian(element, target) {
    // 先清理定时器
    clearInterval(element.timeId);
    element.timeId = setInterval(function () {
        var flag = true;
        // 1.获取元素当前的位置
        var current = element.offsetLeft;
        // 2.div每次移动多少
        var step = (target - current) / 10;
        // 判断步数 > 0 向上取整,否则向下取整
        step = step > 0 ? Math.ceil(step) : Math.floor(step);
        // 3.每次移动后得距离
        current += step;
        element.style.left = current + "px";
        if (current == target) {
            clearInterval(element.timeId);
        }
        // console.log("目标位置:" + target);
        // console.log("每步的距离:" + step);
        // console.log("当前位置:" + current);
    }, 10)
}

// 获取任意一个元素的任意一个样式属性值
// @params:element(元素)   attr(属性名)
function getStyle(element, attr) {
    // 判断是否支持该方法
    if (window.getComputedStyle) {
        return window.getComputedStyle(element, null)[attr];
    } else {
        return element.currentStyle[attr];
    }
}
// 设置任意一个元素的任意一个样式属性值打到任意一个目标位置
// @params:
//          element --- 元素
//          json --- 对象
//          fn --- 回调函数:函数当作参数使用
function animateStyle(element, json, fn) {
    // 先清理定时器
    clearInterval(element.timeId);
    element.timeId = setInterval(function () {
        // 开关:假设全部到达目标位置
        var flag = true;
        // 遍历的去设置目标位置
        for (var attr in json) {
            // 判断这个属性attr是不是opacity
            if (attr == "opacity") {
                // 先获取元素当前的属性值
                var current = getStyle(element, attr) * 100;// 转化为数字类型 1*100=100
                // 存储的是每一个的目标位置
                var target = json[attr] * 100;// 0.2*100=20
                // 2.变化的数值
                var step = (target - current) / 10;// -8
                // 判断步数 > 0 向上取整,否则向下取整
                step = step > 0 ? Math.ceil(step) : Math.floor(step);// -8
                // 3.移动后元素当前的属性值
                current += step;// 92
                // 给元素设置对应属性值
                element.style[attr] = current / 100;// 92 / 100
            } else if (attr == "zIndex") {
                // 直接改变这个属性的值
                element.style[attr] = json[attr];
            } else {
                // 先获取元素当前的属性值
                var current = parseInt(getStyle(element, attr));// 转化为数字类型
                // 存储的是每一个的目标位置
                var target = json[attr];
                // 2.变化的数值
                var step = (target - current) / 10;
                // 判断步数 > 0 向上取整,否则向下取整
                step = step > 0 ? Math.ceil(step) : Math.floor(step);
                // 3.移动后元素当前的属性值
                current += step;
                element.style[attr] = current + "px";
            }
            // 某一个的当前属性 == 目标属性,条件成立
            // 问题:只判断一个属性达到目标位置就会清理定时器
            // if (current == target) {
            //     clearInterval(element.timeId);
            // }
            // 判断有一个没有达到目标位置,立马让flag = false;
            if (current != target) {
                flag = false;
            }
        }
        if (flag) {
            // 清理定时器
            clearInterval(element.timeId);
            // 判断用户有没有传fn函数
            if (fn) {
                fn();
            }
        }
    }, 20)
}

// 希望图片跟着鼠标飞,可以在任何的浏览器实现
// 1.window.event和事件对象event的兼容
// 2.clientX和clientY的单独使用,在IE8中需要用window.event.clientX
// 3.scrollTop和scrollLeft的兼容
// 4.pageX/pageY和clientX+scrollLeft/clientY+scrollTop的兼容
var evt = {
    // 1.window.event和事件对象event的兼容
    getEvent: function (e) {
        return window.event || e;
    },
    // 2.clientX和clientY的单独使用,在IE8中需要用window.event.clientX
    // 可视区域的横坐标:Google--->e.clientX   IE8--->window.event.clientX
    getClientX: function (e) {
        return this.getEvent(e).clientX;
    },
    getClientY: function (e) {
        return this.getEvent(e).clientY;
    },
    // 3.scrollTop和scrollLeft的兼容
    // 页面向左卷曲出去的横坐标
    getScrollLeft: function () {
        return window.pageXOffset || document.documentElement.scrollLeft;
    },
    // 页面向上卷曲出去的纵坐标
    getScrollTop: function () {
        return window.pageYOffset || document.documentElement.scrollTop;
    },
    // 4.pageX/pageY和clientX+scrollLeft/clientY+scrollTop的兼容
    // 基于页面的横坐标
    pageX: function (e) {
        return this.getEvent(e).pageX ? this.getEvent(e).pageX : this.getEvent(e) + this.getScrollLeft();
    },
    // 基于页面的纵坐标
    pageY: function (e) {
        return this.getEvent(e).pageY ? this.getEvent(e).pageY : this.getEvent(e) + this.getScrollTop();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WA终结者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值