/** * 气泡动画 WXS 模块 * 在视图层独立线程中执行,不占用 JS 主线程 */ /** * 生成随机的左边距位置(百分比) * @param {number} textLength - 文本长度 * @param {number} viewportWidth - 视口宽度 * @returns {number} 左边距百分比 */ function generateLeftPosition(textLength, viewportWidth) { // 预估气泡宽度 var estimatedBubbleWidth = textLength * 12 + 48 var bubbleWidthPercent = (estimatedBubbleWidth / viewportWidth) * 100 // 确保气泡完全在可视区域内 var minLeft = 5 var maxLeft = 95 - bubbleWidthPercent if (maxLeft < minLeft) { maxLeft = minLeft } var range = maxLeft - minLeft var random = Math.random() return random * range + minLeft } /** * 生成随机的动画时长(秒) * @returns {number} 动画时长 */ function generateAnimationDuration() { var random = Math.random() return random * 2 + 4 // 4-6秒 } /** * 获取气泡样式 * @param {string} text - 气泡文本 * @param {number} viewportWidth - 视口宽度 * @returns {string} 样式字符串 */ function getBubbleStyle(text, viewportWidth) { var textLength = text.length var leftPosition = generateLeftPosition(textLength, viewportWidth) var duration = generateAnimationDuration() return 'left: ' + leftPosition + '%; animation-duration: ' + duration + 's;' } /** * 计算气泡的 transform 值(用于优化动画性能) * @param {number} progress - 动画进度 0-1 * @returns {string} transform 样式 */ function calculateTransform(progress) { // 垂直移动距离 var translateY = -100 - (progress * 200) // 从 -100rpx 到 -300rpx // 水平偏移 var translateX = progress * 20 // 0 到 20rpx // 透明度变化 var opacity = 1 if (progress < 0.1) { opacity = progress * 10 // 0-0.1: 淡入 } else if (progress > 0.9) { opacity = (1 - progress) * 10 // 0.9-1: 淡出 } return 'transform: translate(' + translateX + 'rpx, ' + translateY + 'rpx); opacity: ' + opacity + ';' } module.exports = { generateLeftPosition: generateLeftPosition, generateAnimationDuration: generateAnimationDuration, getBubbleStyle: getBubbleStyle, calculateTransform: calculateTransform }