/** * 判断传入的值是否为空 * @param {*} val * @returns */ export function isNull(val) { if (typeof val == "boolean") { return false; } if (typeof val == "number") { return false; } if (val instanceof Array) { if (val.length == 0) return true; } else if (val instanceof Object) { if (JSON.stringify(val) === "{}") return true; } else { if ( val == "null" || val == null || val == "undefined" || val == undefined || val == "" ) return true; return false; } return false; } // 不为空 export function isDef(val) { return val !== undefined && val !== null; } // 是否是一个数字 export function isNumeric(val) { return /^\d+(\.\d+)?$/.test(val); } // 是一个对象 export function isObject(val) { return Object.prototype.toString.call(val) === "[object Object]" } // 是一个字符串 export function isString(val) { return Object.prototype.toString.call(val) === "[object String]" } // 添加单位 export function addUnit(value) { if (!isDef(value)) { return undefined; } value = String(value); return isNumeric(value) ? `${value}px` : value; } // 获得角度 export function getAngle(angx, angy) { return Math.atan2(angy, angx) * 180 / Math.PI; }; // 根据起点终点返回方向 1向上 2向下 3向左 4向右 0未滑动 export function getDirection(startx, starty, endx, endy) { var angx = endx - startx; var angy = endy - starty; var result = 0; // 如果滑动距离太短 if (Math.abs(angx) < 5 && Math.abs(angy) < 5) { return result; } var angle = getAngle(angx, angy); if (angle >= -160 && angle <= -20) { result = 1; } else if (angle > 20 && angle < 160) { result = 2; } else if ((angle >= 160 && angle <= 180) || (angle >= -180 && angle < -160)) { result = 3; } else if (angle >= -20 && angle <= 20) { result = 4; } return result; } export function friendlyDate(timestamp) { var formats = { 'year': '%n% 年前', 'month': '%n% 月前', 'day': '%n% 天前', 'hour': '%n% 小时前', 'minute': '%n% 分钟前', 'second': '%n% 秒前', }; var now = Date.now(); var seconds = Math.floor((now - timestamp) / 1000); var minutes = Math.floor(seconds / 60); var hours = Math.floor(minutes / 60); var days = Math.floor(hours / 24); var months = Math.floor(days / 30); var years = Math.floor(months / 12); var diffType = ''; var diffValue = 0; if (years > 0) { diffType = 'year'; diffValue = years; } else { if (months > 0) { diffType = 'month'; diffValue = months; } else { if (days > 0) { diffType = 'day'; diffValue = days; } else { if (hours > 0) { diffType = 'hour'; diffValue = hours; } else { if (minutes > 0) { diffType = 'minute'; diffValue = minutes; } else { diffType = 'second'; diffValue = seconds === 0 ? (seconds = 1) : seconds; } } } } } return formats[diffType].replace('%n%', diffValue); } // 获取元素的节点信息 export function getRect(selector, vm) { return new Promise((resolve, reject) => { if (!selector) reject('Parameter is empty'); let query = null; // #ifdef MP-ALIPAY query = uni.createSelectorQuery(); // #endif // #ifndef MP-ALIPAY query = uni.createSelectorQuery().in(vm); // #endif query.select(selector).boundingClientRect() query.exec(data => resolve(Array.isArray(data) ? data[0] : data)); }) } // 获取头部区域高度(状态栏+标签栏) export function getHeaderHeight() { // 微信小程序 7.0+、百度小程序、H5、App(2.0.3+)支持navigationStyle设为custom,取消默认的原生导航栏 const info = uni.getSystemInfoSync(); let navHeight = 0; // console.log("info:", JSON.stringify(info)); // App、微信小程序、支付宝小程序、百度小程序、抖音小程序、QQ小程序、快手小程序、京东小程序 // #ifdef MP-WEIXIN || MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || MP-QQ || MP-KUAISHOU || MP-JD const btnInfo = uni.getMenuButtonBoundingClientRect() // #endif // 微信/百度/快手/字节跳动/京东小程序 // #ifdef MP-WEIXIN || MP-ALIPAY || MP-BAIDU || MP-KUAISHOU || MP-TOUTIAO || MP-JD // console.log("btnInfo:", JSON.stringify(btnInfo), info?.statusBarHeight); navHeight = btnInfo?.bottom + btnInfo?.top - info?.statusBarHeight; // #endif // APP // #ifdef APP-PLUS navHeight = (info?.statusBarHeight || 0) + 45 // #endif // 支付宝小程序导航栏不支持自定义,但是可以通过改变透明度,使其隐藏,且不占据文档流 // 支付宝的titleBarHeight为标题栏高度,statusBarHeight为状态栏高度 // #ifdef MP-ALIPAY navHeight = info?.titleBarHeight + info?.statusBarHeight; // #endif // QQ在开发者工具中测试是根据top+buttom才能正确计算出高度 // #ifdef MP-QQ navHeight = btnInfo?.bottom + btnInfo?.top; // #endif // 飞书 // #ifdef MP-LARK navHeight = info?.navigationBarSafeArea?.height + info?.navigationBarSafeArea?.top; // #endif return { navHeight } }