🎯 本文是TTS-Web-Vue系列的第十五篇文章,重点介绍项目在移动端侧边栏和响应式布局方面的深度优化。相比上一版本,我们完全重构了移动端的交互逻辑,移除了遮罩层,优化了过渡动画,并解决了内容区域被遮挡的问题,让移动端用户获得更加流畅自然的使用体验。
📖 系列文章导航
🌟 本次优化亮点
相比上一版本,本次更新主要包含以下重大改进:
移除遮罩层设计:
- 取消了全屏遮罩的交互方式
- 采用更轻量级的侧滑交互
- 提升了操作的流畅度
优化过渡动画:
- 使用 transform 代替 visibility 控制
- 添加了平滑的过渡效果
- 解决了闪烁和白条问题
响应式布局优化:
- 修复了内容区域被遮挡的问题
- 统一了移动端页面间距
- 优化了组件层级关系
💻 技术实现详解
侧边栏基础样式
新版本中,我们使用 transform 和 left 属性来控制侧边栏的显示和隐藏:
/* 移动端样式 */
.app-mobile .sidebar-container {
position: fixed;
top: var(--header-height);
left: -64px; /* 初始位置在屏幕外 */
bottom: 0;
width: 64px;
background-color: var(--card-background);
box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1);
z-index: 1001;
transition: left 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.app-mobile .sidebar-container.sidebar-mobile {
left: 0;
}
移动端把手按钮
添加了专门的侧边栏控制把手:
.mobile-handle {
position: fixed;
top: 50%;
left: 0;
transform: translateY(-50%);
width: 24px;
height: 48px;
background: var(--primary-color);
border-radius: 0 24px 24px 0;
display: flex;
align-items: center;
justify-content: center;
color: white;
cursor: pointer;
z-index: 1000;
box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1);
transition: all 0.3s ease;
}
.mobile-handle:active {
transform: translateY(-50%) scale(0.95);
}
内容区域适配
优化了内容区域的边距和样式处理:
const adjustContentMargins = () => {
nextTick(() => {
const isMobile = window.innerWidth <= 768;
// 获取当前激活的内容区域
let activeContent;
if (page.value.asideIndex === '1') {
activeContent = document.querySelector('.input-area-card');
} else if (page.value.asideIndex === '2') {
activeContent = document.querySelector('.batch-area-card');
} else if (page.value.asideIndex === '3') {
activeContent = document.querySelector('.config-page-container');
} else if (page.value.asideIndex === '4') {
activeContent = document.querySelector('.doc-page-container');
} else if (page.value.asideIndex === '5') {
activeContent = document.querySelector('.content-area');
}
if (activeContent) {
if (isMobile) {
// 移动端设置
activeContent.style.marginTop = '80px';
activeContent.style.paddingTop = '10px';
activeContent.style.borderRadius = '0';
activeContent.style.width = '100%';
activeContent.style.maxWidth = '100%';
activeContent.style.boxShadow = 'none';
activeContent.style.border = 'none';
} else {
// PC端设置
activeContent.style.marginTop = '0px';
activeContent.style.paddingTop = '0';
activeContent.style.borderRadius = 'var(--border-radius-large)';
activeContent.style.width = '100%';
activeContent.style.maxWidth = '1000px';
activeContent.style.boxShadow = 'var(--shadow-medium)';
activeContent.style.border = '1px solid var(--border-color)';
}
}
});
};
移动端样式优化
统一的移动端样式处理:
@media (max-width: 768px) {
.modern-main {
padding: 0;
}
.modern-main .input-area-card,
.modern-main .batch-area-card,
.modern-main .config-page-container,
.modern-main .doc-page-container,
.modern-main .content-area {
margin-top: 80px !important;
padding: 10px;
width: 100%;
border-radius: 0;
box-shadow: none;
border: none;
}
.modern-main .content-area .empty-state {
margin-top: 80px !important;
padding: 20px;
text-align: center;
}
.modern-main .compact-controls-bar {
padding: 16px;
margin-top: 10px;
background-color: var(--card-background);
border-top: 1px solid var(--border-color);
}
}
🔄 与上一版本的主要区别
交互逻辑的改进:
- 旧版:使用遮罩层覆盖全屏,点击遮罩关闭侧边栏
- 新版:移除遮罩层,使用更轻量的侧滑交互,提升操作流畅度
动画效果的优化:
- 旧版:使用 visibility 和 opacity 控制显隐,容易产生闪烁
- 新版:使用 transform 和 left 属性,实现更平滑的过渡效果
响应式布局的提升:
- 旧版:内容区域容易被顶部导航栏遮挡
- 新版:统一设置 80px 顶部边距,确保内容完全可见
代码结构的改进:
- 旧版:样式和逻辑混杂,维护困难
- 新版:清晰的代码组织,更好的可维护性
🎯 实现要点
- 移动端检测:
const isMobile = window.innerWidth <= 768;
- 样式优先级处理:
.modern-main .input-area-card {
margin-top: 80px !important;
}
- 动态样式应用:
if (isMobile) {
activeContent.style.marginTop = '80px';
activeContent.style.borderRadius = '0';
} else {
activeContent.style.marginTop = '0px';
activeContent.style.borderRadius = 'var(--border-radius-large)';
}
📱 效果展示
侧边栏交互:
- 轻滑打开/关闭
- 把手按钮控制
- 平滑过渡效果
响应式布局:
- 合理的内容边距
- 统一的视觉风格
- 无遮挡的显示效果
🔮 未来优化方向
手势交互增强:
- 添加更多手势操作
- 优化触摸反馈
性能优化:
- 减少重排重绘
- 优化动画性能
可访问性改进:
- 添加键盘导航
- 支持屏幕阅读
📝 总结
本次更新通过重构移动端交互逻辑,显著提升了用户体验:
- 移除遮罩层,让交互更加轻量自然
- 优化过渡动画,提供流畅的视觉反馈
- 完善响应式布局,确保内容完整显示
- 统一移动端样式,提供一致的视觉体验
这些改进不仅提升了产品的易用性,也为未来的功能扩展打下了坚实的基础。我们将继续收集用户反馈,不断改进和优化移动端的使用体验。
🔗 相关链接
注意:本文介绍的功能仅供学习和个人使用,请勿用于商业用途。如有问题或建议,欢迎在评论区讨论!