473 lines
10 KiB
Plaintext
473 lines
10 KiB
Plaintext
/**
|
||
* 自定义底部导航栏 - 公众号客服交互模式
|
||
*
|
||
* 两种状态:
|
||
* 状态1(普通):[首页] [设备] [任务] [⌨]
|
||
* 状态2(聊天):[☰] [🔊/⌨] [输入框........] [🎤] [😀] [+]
|
||
*
|
||
* 统一配色方案:
|
||
* 主题色:#1677FF(蓝),用于高亮、选中态、交互反馈
|
||
* 背景:#FFFFFF(白)/ #1A1A1A(深黑)
|
||
* 边框:#E8E8E8(浅灰)/ #2E2E2E(深灰)
|
||
* 文字:#333333(深灰)/ #999999(灰)/ #E8E8E8(浅白)
|
||
*/
|
||
|
||
/* ============================================================
|
||
一、设计令牌(统一颜色变量)
|
||
============================================================ */
|
||
|
||
/* 状态1(普通模式)*/
|
||
.tab-bar {
|
||
/* 背景与边框 */
|
||
--bg-primary: #ffffff;
|
||
--border-primary: #e8e8e8;
|
||
/* Tab 文字 */
|
||
--tab-inactive: #999999;
|
||
--tab-active: #333333;
|
||
/* 键盘按钮 */
|
||
--kb-border: #bbbbbb;
|
||
--kb-icon: #666666;
|
||
--kb-border-left: #f0f0f0;
|
||
/* 聊天模式工具按钮(浅色背景用深色图标) */
|
||
--tool-bg: #f5f5f5;
|
||
--tool-icon: #555555;
|
||
}
|
||
|
||
/* 聊天模式下:导航栏保持白色不变,工具按钮区用浅灰底色区分 */
|
||
.tab-bar.chat-mode {
|
||
/* 背景与边框 — 导航栏保持白色,与整体布局统一 */
|
||
--bg-primary: #ffffff;
|
||
--border-primary: #e8e8e8;
|
||
/* Tab 文字 */
|
||
--tab-inactive: #999999;
|
||
--tab-active: #333333;
|
||
/* 键盘按钮 */
|
||
--kb-border: #bbbbbb;
|
||
--kb-icon: #666666;
|
||
--kb-border-left: #f0f0f0;
|
||
/* 聊天工具按钮 — 浅灰底色,与白色导航栏融合但不突兀 */
|
||
--tool-bg: #f0f0f0;
|
||
--tool-icon: #555555;
|
||
}
|
||
|
||
/* 全局统一色值 */
|
||
page {
|
||
/* 主题蓝(唯一品牌色) */
|
||
--brand-blue: #1677FF;
|
||
--brand-blue-dark: #0958D9;
|
||
--brand-blue-light: #73ADFF;
|
||
--brand-blue-glow: rgba(22, 119, 255, 0.8);
|
||
/* 深色面板 */
|
||
--bg-dark: #0d0d0d;
|
||
--bg-dark-2: #1e1e1e;
|
||
--bg-dark-3: #2e2e2e;
|
||
/* 文字(深色模式) */
|
||
--text-dark: #e8e8e8;
|
||
--text-dark-secondary: #cccccc;
|
||
--text-dark-muted: #888888;
|
||
}
|
||
|
||
/* ============================================================
|
||
二、底部导航栏容器(固定在底部)
|
||
============================================================ */
|
||
.tab-bar {
|
||
position: fixed;
|
||
left: 0;
|
||
right: 0;
|
||
bottom: 0;
|
||
height: 100rpx;
|
||
background-color: var(--bg-primary);
|
||
border-top: 1rpx solid var(--border-primary);
|
||
display: flex;
|
||
align-items: center;
|
||
padding-bottom: env(safe-area-inset-bottom);
|
||
z-index: 99999;
|
||
}
|
||
|
||
/* 聊天模式下切换为深色背景 */
|
||
.tab-bar.chat-mode {
|
||
background-color: var(--bg-primary);
|
||
border-top: 1rpx solid var(--border-primary);
|
||
}
|
||
|
||
|
||
/* ============================================================
|
||
二、状态1:普通导航模式
|
||
============================================================ */
|
||
|
||
/* ---- Tab菜单项(3个平分剩余空间)---- */
|
||
.tab-item {
|
||
flex: 1;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
height: 100%;
|
||
}
|
||
|
||
.tab-item:active {
|
||
opacity: 0.6;
|
||
}
|
||
|
||
.tab-text {
|
||
font-size: 28rpx;
|
||
color: var(--tab-inactive);
|
||
line-height: 1.2;
|
||
}
|
||
|
||
.tab-item.active .tab-text {
|
||
color: var(--tab-active);
|
||
font-weight: 500;
|
||
}
|
||
|
||
/* ---- 右侧键盘按钮(固定窄宽度)---- */
|
||
.keyboard-btn {
|
||
width: 100rpx;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
height: 100%;
|
||
border-left: 1rpx solid var(--kb-border-left);
|
||
cursor: pointer;
|
||
position: relative;
|
||
}
|
||
|
||
.keyboard-btn:active {
|
||
opacity: 0.5;
|
||
background-color: var(--border-primary);
|
||
}
|
||
|
||
.kb-circle {
|
||
width: 52rpx;
|
||
height: 52rpx;
|
||
border-radius: 50%;
|
||
border: 2rpx solid var(--kb-border);
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
}
|
||
|
||
.kb-icon {
|
||
font-size: 26rpx;
|
||
color: var(--kb-icon);
|
||
}
|
||
|
||
|
||
/* ============================================================
|
||
三、状态2:聊天输入模式
|
||
============================================================ */
|
||
|
||
/* ---- 工具按钮(通用:菜单/语音/表情/更多等)---- */
|
||
.chat-tool-btn {
|
||
flex-shrink: 0;
|
||
width: 80rpx;
|
||
height: 80rpx;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
position: relative;
|
||
/* 浅灰底色,融入白色导航栏 */
|
||
border-radius: 12rpx;
|
||
}
|
||
|
||
.chat-tool-btn:active {
|
||
opacity: 0.6;
|
||
background-color: rgba(0,0,0,0.08) !important;
|
||
}
|
||
|
||
.tool-icon {
|
||
font-size: 40rpx;
|
||
line-height: 1;
|
||
color: var(--tool-icon);
|
||
}
|
||
|
||
.send-area .tool-icon {
|
||
font-size: 36rpx;
|
||
color: var(--tool-icon);
|
||
}
|
||
|
||
.send-area.disabled {
|
||
opacity: 0.25;
|
||
}
|
||
|
||
/* ---- 🎤 语音转文字激活状态(高亮)---- */
|
||
.send-icon {
|
||
transition: all 0.2s ease;
|
||
display: inline-block;
|
||
}
|
||
|
||
.send-icon-active {
|
||
animation: voice-pulse 1.5s ease-in-out infinite;
|
||
filter: drop-shadow(0 0 8px var(--brand-blue-glow));
|
||
}
|
||
|
||
@keyframes voice-pulse {
|
||
0%, 100% {
|
||
transform: scale(1);
|
||
filter: drop-shadow(0 0 6px var(--brand-blue-glow));
|
||
}
|
||
50% {
|
||
transform: scale(1.15);
|
||
filter: drop-shadow(0 0 14px var(--brand-blue));
|
||
}
|
||
}
|
||
|
||
/* 🎤激活时按钮高亮(浅色背景下的蓝色边框) */
|
||
.voice-active {
|
||
background: rgba(22, 119, 255, 0.1) !important;
|
||
border: 1.5px solid rgba(22, 119, 255, 0.6) !important;
|
||
border-radius: 12rpx !important;
|
||
box-shadow: 0 0 10px rgba(22, 119, 255, 0.25) !important;
|
||
}
|
||
|
||
/* ---- 发送按钮(替换+号) ---- */
|
||
.send-action-btn {
|
||
background: #1677FF !important;
|
||
border-radius: 16rpx !important;
|
||
width: 96rpx !important;
|
||
box-shadow: 0 4rpx 14rpx rgba(22, 119, 255, 0.3);
|
||
}
|
||
|
||
.send-action-btn:active {
|
||
opacity: 0.85;
|
||
transform: scale(0.95);
|
||
}
|
||
|
||
.send-icon-img {
|
||
width: 42rpx;
|
||
height: 42rpx;
|
||
display: block;
|
||
}
|
||
|
||
.send-arrow-icon {
|
||
font-size: 38rpx;
|
||
color: #ffffff;
|
||
font-weight: bold;
|
||
line-height: 1;
|
||
}
|
||
|
||
.send-label {
|
||
font-size: 26rpx;
|
||
font-weight: 600;
|
||
color: #ffffff;
|
||
letter-spacing: 2rpx;
|
||
}
|
||
|
||
/* ---- 输入框 ---- */
|
||
.chat-input {
|
||
flex: 1;
|
||
height: 68rpx;
|
||
min-width: 0;
|
||
background-color: #f0f0f0;
|
||
border-radius: 12rpx;
|
||
padding: 0 20rpx;
|
||
font-size: 28rpx;
|
||
color: #333333;
|
||
margin: 0 4rpx;
|
||
}
|
||
|
||
.placeholder-style {
|
||
color: #999999;
|
||
font-size: 28rpx;
|
||
}
|
||
|
||
/* ---- 语音录制按钮 ---- */
|
||
.voice-btn {
|
||
flex: 1;
|
||
height: 68rpx;
|
||
min-width: 0;
|
||
border-radius: 12rpx;
|
||
background-color: #f0f0f0;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
position: relative;
|
||
overflow: hidden;
|
||
margin: 0 4rpx;
|
||
transition: all 0.15s ease;
|
||
}
|
||
|
||
.voice-btn:active,
|
||
.voice-btn.recording {
|
||
background-color: var(--brand-blue);
|
||
box-shadow: 0 2rpx 16rpx rgba(22, 119, 255, 0.35);
|
||
}
|
||
|
||
.voice-text {
|
||
font-size: 28rpx;
|
||
color: #666666;
|
||
letter-spacing: 2rpx;
|
||
}
|
||
|
||
.voice-btn.recording .voice-text {
|
||
color: #ffffff;
|
||
}
|
||
|
||
/* 录音波纹动画 */
|
||
.record-wave {
|
||
position: absolute;
|
||
top: 50%;
|
||
left: 50%;
|
||
transform: translate(-50%, -50%);
|
||
pointer-events: none;
|
||
}
|
||
|
||
.wave {
|
||
position: absolute;
|
||
top: 50%;
|
||
left: 50%;
|
||
width: 120rpx;
|
||
height: 120rpx;
|
||
border-radius: 50%;
|
||
border: 3rpx solid rgba(22, 119, 255, 0.3);
|
||
transform: translate(-50%, -50%);
|
||
animation: waveExpand 1.5s ease-out infinite;
|
||
}
|
||
|
||
.wave2 { animation-delay: 0.5s; }
|
||
.wave3 { animation-delay: 1s; }
|
||
|
||
@keyframes waveExpand {
|
||
from { width: 60rpx; height: 60rpx; opacity: 1; border-width: 4rpx; }
|
||
to { width: 200rpx; height: 200rpx; opacity: 0; border-width: 1rpx; }
|
||
}
|
||
|
||
|
||
/* ============================================================
|
||
四、聊天消息面板(覆盖在页面内容上方)
|
||
============================================================ */
|
||
|
||
.chat-overlay {
|
||
position: fixed;
|
||
left: 0;
|
||
right: 0;
|
||
bottom: calc(100rpx + env(safe-area-inset-bottom));
|
||
top: 0;
|
||
z-index: 99998;
|
||
display: flex;
|
||
flex-direction: column;
|
||
}
|
||
|
||
/* 消息列表 */
|
||
.chat-msg-list {
|
||
flex: 1;
|
||
background-color: var(--bg-dark);
|
||
padding: 24rpx;
|
||
overflow-y: auto;
|
||
}
|
||
|
||
.msg-bottom-pad {
|
||
height: 20rpx;
|
||
flex-shrink: 0;
|
||
}
|
||
|
||
/* ---- 单行消息 ---- */
|
||
.msg-row {
|
||
display: flex;
|
||
margin-bottom: 24rpx;
|
||
align-items: flex-start;
|
||
}
|
||
|
||
.msg-user {
|
||
flex-direction: row-reverse;
|
||
}
|
||
|
||
/* 头像 */
|
||
.msg-avatar {
|
||
width: 64rpx;
|
||
height: 64rpx;
|
||
border-radius: 50%;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
font-size: 22rpx;
|
||
font-weight: bold;
|
||
flex-shrink: 0;
|
||
margin: 0 10rpx;
|
||
}
|
||
|
||
.bot-avatar {
|
||
background: linear-gradient(135deg, var(--brand-blue), var(--brand-blue-dark));
|
||
color: #fff;
|
||
}
|
||
|
||
.user-avatar {
|
||
background: linear-gradient(135deg, var(--brand-blue-light), var(--brand-blue));
|
||
color: #fff;
|
||
}
|
||
|
||
/* 消息气泡 */
|
||
.msg-bubble {
|
||
max-width: 65%;
|
||
padding: 18rpx 22rpx;
|
||
border-radius: 18rpx;
|
||
word-break: break-all;
|
||
}
|
||
|
||
.bot-bubble {
|
||
background-color: var(--bg-dark-2);
|
||
border: 2rpx solid rgba(255,255,255,0.06);
|
||
border-radius: 4rpx 18rpx 18rpx 18rpx;
|
||
}
|
||
|
||
.user-bubble {
|
||
background: linear-gradient(135deg, var(--brand-blue), var(--brand-blue-dark));
|
||
border-radius: 18rpx 4rpx 18rpx 18rpx;
|
||
box-shadow: 0 4rpx 14rpx rgba(22, 119, 255, 0.22);
|
||
}
|
||
|
||
.msg-text {
|
||
font-size: 27rpx;
|
||
line-height: 1.5;
|
||
word-break: break-all;
|
||
}
|
||
|
||
.bot-bubble .msg-text { color: var(--text-dark); }
|
||
.user-bubble .msg-text { color: #ffffff; }
|
||
|
||
|
||
/* ============================================================
|
||
五、语音播放中提示
|
||
============================================================ */
|
||
|
||
.voice-playing-toast {
|
||
position: fixed;
|
||
top: 160rpx;
|
||
left: 50%;
|
||
transform: translateX(-50%);
|
||
background-color: rgba(0,0,0,0.85);
|
||
border-radius: 20rpx;
|
||
padding: 22rpx 36rpx;
|
||
display: flex;
|
||
flex-direction: column;
|
||
align-items: center;
|
||
gap: 8rpx;
|
||
z-index: 20000;
|
||
backdrop-filter: blur(10rpx);
|
||
}
|
||
|
||
.playing-wave {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 4rpx;
|
||
height: 38rpx;
|
||
}
|
||
|
||
.p-bar {
|
||
width: 6rpx;
|
||
background-color: var(--brand-blue);
|
||
border-radius: 3rpx;
|
||
animation: barBounce 0.6s ease-in-out infinite alternate;
|
||
}
|
||
.p1{height:16rpx;animation-delay:0s} .p2{height:28rpx;animation-delay:.1s}
|
||
.p3{height:38rpx;animation-delay:.2s} .p4{height:26rpx;animation-delay:.3s}
|
||
.p5{height:18rpx;animation-delay:.4s}
|
||
|
||
@keyframes barBounce {
|
||
from{transform:scaleY(.4)} to{transform:scaleY(1)}
|
||
}
|
||
|
||
.playing-text {
|
||
font-size: 22rpx;
|
||
color: var(--text-dark-secondary);
|
||
}
|