ivue-material-plus
Version:
A high quality UI components Library with Vue.js
246 lines (205 loc) • 5.42 kB
text/typescript
import { throwError } from '../utils/error';
/* eslint-disable */
const SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g;
const MOZ_HACK_REGEXP = /^moz([A-Z])/;
// 转换驼峰class
function camelCase(name: string) {
return name
.replace(SPECIAL_CHARS_REGEXP, (_, separator, letter, offset) => {
return offset ? letter.toUpperCase() : letter;
})
.replace(MOZ_HACK_REGEXP, 'Moz$1');
}
const trim = function (s: string) {
return (s || '').replace(/^[\s\uFEFF]+|[\s\uFEFF]+$/g, '');
};
// 类型判断
function typeOf(obj) {
const toString = Object.prototype.toString;
const map = {
'[object Boolean]': 'boolean',
'[object Number]': 'number',
'[object String]': 'string',
'[object Function]': 'function',
'[object Array]': 'array',
'[object Date]': 'date',
'[object RegExp]': 'regExp',
'[object Undefined]': 'undefined',
'[object Null]': 'null',
'[object Object]': 'object',
};
return map[toString.call(obj)];
}
// 判断参数是否是其中之一
export const oneOf = (
value: string | boolean,
validList: Array<string | boolean>
) => {
for (let i = 0; i < validList.length; i++) {
if (value === validList[i]) {
return true;
}
}
return false;
};
// 获取样式
export const getStyle = (element: any, styleName: any): string => {
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];
}
};
// 判断是否有class
export function hasClass(el: HTMLElement, cls: string): boolean {
if (!el || !cls) {
return false;
}
if (cls.indexOf(' ') !== -1) {
throwError('hasClass', 'className should not contain space');
}
if (el.classList) {
return el.classList.contains(cls);
} else {
return (' ' + el.className + ' ').indexOf(' ' + cls + ' ') > -1;
}
}
// 删除class
export function removeClass(el: HTMLElement, cls: string): void {
if (!el || !cls) {
return;
}
const classes = cls.split(' ');
let curClass = ' ' + el.className + ' ';
for (let i = 0, j = classes.length; i < j; i++) {
const 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);
}
}
// 添加 class
export function addClass(el: HTMLElement, cls: string): void {
if (!el) {
return;
}
let curClass = el.className;
const classes = (cls || '').split(' ');
for (let i = 0, j = classes.length; i < j; i++) {
const 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;
}
}
/**
* 滚动到顶部
* @param el 元素
* @param from 开始的位置
* @param to 结束的位置
* @param duration 滚动动画持续时间,单位 毫秒
* @param endCallback 结束后的回调
*/
export function scrollTop(
el,
from: number = 0,
to: number,
duration = 500,
endCallback?
) {
// requestAnimationFrame 兼容
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: number, end: number, step: number) {
// 滚动结束
if (start === end) {
endCallback && endCallback();
return;
}
let d = start + step > end ? end : start + step;
// 开始位置大于结束
if (start > end) {
d = start - step < end ? end : start - step;
}
// window 节点使用 scrollTo
if (el === window) {
window.scrollTo(d, d);
}
// 元素节点使用 scrollTop
else {
el.scrollTop = d;
}
// requestAnimationFrame
window.requestAnimationFrame(() => scroll(d, end, step));
}
// 滚动
scroll(from, to, step);
}
// 深拷贝
export const deepCopy = (data) => {
const _typeOf = typeOf(data);
let object;
// 数组
if (_typeOf === 'array') {
object = [];
}
// 对象
else if (_typeOf === 'object') {
object = {};
}
// 两个都不是返回原值
else {
return data;
}
// 数组
if (_typeOf === 'array') {
for (let i = 0; i < data.length; i++) {
object.push(deepCopy(data[i]));
}
}
// 对象
else if (_typeOf === 'object') {
for (let i in data) {
object[i] = deepCopy(data[i]);
}
}
return object;
};