vue按钮长按进度条效果

281 阅读1分钟

最近又复习复习Vue指令部分,写点儿常用的指令。忽然想到长按指令不存在进度效果,故此写一个。

展示效果:

完成.gif

代码实现:

/**
 * 长按指令,两秒触发长按
 * @author maple
 * @time 2023-04-10
 * @param value {function} 外部方法
 * */
let timer,
    progressTimer,
    progressIndex,
    start,
    cancel,
    clear;

export default {
    inserted(el, {value}) {
        progressIndex = 0;
        el.style.position = 'relative';
        let progress = document.createElement('span');
        progress.style.position = 'absolute';
        progress.style.pointerEvents = 'none';
        progress.style.top = '0';
        progress.style.left = '0';
        progress.style.width = '0px';
        progress.style.height = el.offsetHeight + 'px';
        progress.style.backgroundColor = 'rgba(0, 255, 0, 0.3)';
        start = function () {
            el.appendChild(progress);
            progressTimer = setInterval(() => {
                progressIndex++;
                progress.style.width = progressIndex + '%';
            }, 20);
            timer = setTimeout(() => {
                value();
                clearInterval(progressTimer);
                clear();
            }, 2000);
        };
        cancel = function () {
            if (progressTimer) {
                clear();
                clearInterval(progressTimer);
            }
            if (timer) {
                clear();
                clearTimeout(timer);
            }
        };
        clear = function () {
            progressIndex = 0;
            progress.remove();
        };
        el.addEventListener('mousedown', start);
        el.addEventListener('mouseup', cancel);
        el.addEventListener('mouseout', cancel);
    },
    unbind(el) {
        el.removeEventListener('mousedown', start);
        el.removeEventListener('mouseup', cancel);
        el.removeEventListener('mouseout', cancel);
    }
}

相关问题:

这里还存在一个自定义的问题,我的建议是如果系统中存在自定义自定义样式需求,则新增几个modifiers,可区分开就好。