UNPKG

bin-ui

Version:

基于 vue2.6 / vue-cli3 的 UI 组件库

200 lines (172 loc) 5.09 kB
// 去除空格 import Vue from 'vue' const isServer = Vue.prototype.$isServer const trim = function (string) { return (string || '').replace(/^[\s\uFEFF]+|[\s\uFEFF]+$/g, '') } // 监听事件 export const on = (function () { if (!isServer && document.addEventListener) { return function (element, event, handler) { if (element && event && handler) { element.addEventListener(event, handler, false) } } } else { return function (element, event, handler) { if (element && event && handler) { element.attachEvent('on' + event, handler) } } } })() // 移除事件 export const off = (function () { if (!isServer && document.removeEventListener) { return function (element, event, handler) { if (element && event) { element.removeEventListener(event, handler, false) } } } else { return function (element, event, handler) { if (element && event) { element.detachEvent('on' + event, handler) } } } })() // 监听一次事件 export const once = function (el, event, fn) { const listener = function () { if (fn) { fn.apply(this, arguments) } off(el, event, listener) } on(el, event, listener) } // 是否有class类名 export function hasClass(el, cls) { if (!el || !cls) return false if (cls.indexOf(' ') !== -1) throw new Error('className should not contain space.') if (el.classList) { return el.classList.contains(cls) } else { return (' ' + el.className + ' ').indexOf(' ' + cls + ' ') > -1 } } // 添加class export function addClass(el, cls) { if (!el) return let curClass = el.className let classes = (cls || '').split(' ') for (let i = 0, j = classes.length; i < j; i++) { let clsName = classes[i] if (!clsName) continue if (el.classList) { el.classList.add(clsName) } else if (!hasClass(el, clsName)) { curClass += ' ' + clsName } } if (!el.classList) { el.className = curClass } } // 移除一个class样式 export function removeClass(el, cls) { if (!el || !cls) return let classes = cls.split(' ') let curClass = ' ' + el.className + ' ' for (let i = 0, j = classes.length; i < j; i++) { let clsName = classes[i] if (!clsName) continue if (el.classList) { el.classList.remove(clsName) } else if (hasClass(el, clsName)) { curClass = curClass.replace(' ' + clsName + ' ', ' ') } } if (!el.classList) { el.className = trim(curClass) } } // getStyle export function getStyle(element, styleName) { if (!element || !styleName) return null styleName = camelCase(styleName) if (styleName === 'float') { styleName = 'cssFloat' } try { const computed = document.defaultView.getComputedStyle(element, '') return element.style[styleName] || computed ? computed[styleName] : null } catch (e) { return element.style[styleName] } } // 获取浏览器滚动条宽度 export function getScrollBarWidth() { let scrollBarWidth if (isServer) return 0 if (scrollBarWidth !== undefined) return scrollBarWidth const outer = document.createElement('div') outer.className = 'bin-scrollbar__wrap' outer.style.visibility = 'hidden' outer.style.width = '100px' outer.style.position = 'absolute' outer.style.top = '-9999px' document.body.appendChild(outer) const widthNoScroll = outer.offsetWidth outer.style.overflow = 'scroll' const inner = document.createElement('div') inner.style.width = '100%' outer.appendChild(inner) const widthWithScroll = inner.offsetWidth outer.parentNode.removeChild(outer) scrollBarWidth = widthNoScroll - widthWithScroll return scrollBarWidth } const SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g // eslint-disable-line const MOZ_HACK_REGEXP = /^moz([A-Z])/ // eslint-disable-line function camelCase(name) { return name.replace(SPECIAL_CHARS_REGEXP, function (_, separator, letter, offset) { return offset ? letter.toUpperCase() : letter }).replace(MOZ_HACK_REGEXP, 'Moz$1') } // scrollTop animation export function scrollTop(el, from = 0, to, duration = 500, endCallback) { if (!window.requestAnimationFrame) { window.requestAnimationFrame = ( window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) { return window.setTimeout(callback, 1000 / 60) } ) } const difference = Math.abs(from - to) const step = Math.ceil(difference / duration * 50) function scroll(start, end, step) { if (start === end) { endCallback && endCallback() return } let d = (start + step > end) ? end : start + step if (start > end) { d = (start - step < end) ? end : start - step } if (el === window) { window.scrollTo(d, d) } else { el.scrollTop = d } window.requestAnimationFrame(() => scroll(d, end, step)) } scroll(from, to, step) } export function firstUpperCase(str) { return str.toString()[0].toUpperCase() + str.toString().slice(1) }