如何使用jQuery/JS实现带过渡动画的list/grid/tile视图切换效果
list/grid/tile三种视图带过渡动画切换实现方案
实现核心思路
所有视图切换的本质是样式属性的变化,通过CSS transition 监听可动画属性的变化自动生成过渡效果,无需复杂的JS动画逻辑。
具体实现步骤
1. HTML结构
<!-- 切换按钮组 --> <div class="view-toggle"> <button data-view="list">列表视图</button> <button data-view="grid">网格视图</button> <button data-view="tile">瓷砖视图</button> </div> <!-- 内容容器 --> <div class="content-wrapper" id="viewContainer"> <div class="card"> <div class="card-cover"></div> <div class="card-title">标题示例</div> <div class="card-desc">描述文本示例</div> </div> <!-- 更多卡片重复上面结构即可 --> </div>
2. CSS样式
/* 基础通用样式 */ .content-wrapper { display: grid; gap: 16px; transition: all 0.3s ease; } .card { border-radius: 8px; overflow: hidden; box-shadow: 0 2px 8px rgba(0,0,0,0.1); transition: all 0.3s ease; display: flex; flex-direction: column; } .card-cover { width: 100%; flex-shrink: 0; transition: all 0.3s ease; } .card-title, .card-desc { padding: 8px 12px; transition: all 0.2s ease 0.1s; } /* 网格视图样式 */ .content-wrapper.grid-view { grid-template-columns: repeat(3, 1fr); } .grid-view .card { height: 240px; } .grid-view .card-cover { height: 140px; } .grid-view .card-desc { opacity: 0; visibility: hidden; height: 0; padding: 0 12px; } /* 列表视图样式 */ .content-wrapper.list-view { grid-template-columns: 1fr; } .list-view .card { height: 100px; flex-direction: row; } .list-view .card-cover { width: 160px; height: 100%; } .list-view .card-desc { opacity: 1; visibility: visible; height: auto; padding: 8px 12px; } /* 瓷砖视图样式 */ .content-wrapper.tile-view { grid-template-columns: repeat(4, 1fr); } .tile-view .card { height: 160px; } .tile-view .card-cover { height: 100%; } .tile-view .card-title, .tile-view .card-desc { opacity: 0; visibility: hidden; height: 0; padding: 0 12px; }
3. 交互逻辑
jQuery实现版本
$('.view-toggle button').on('click', function() { // 获取目标视图类型 const targetView = $(this).data('view'); // 移除容器所有视图类,添加目标视图类 $('#viewContainer') .removeClass('list-view grid-view tile-view') .addClass(targetView); // 给当前激活的按钮加选中样式 $(this).addClass('active').siblings().removeClass('active'); });
原生JS实现版本
document.querySelectorAll('.view-toggle button').forEach(btn => { btn.addEventListener('click', function() { const targetView = this.dataset.view; const container = document.getElementById('viewContainer'); container.classList.remove('list-view', 'grid-view', 'tile-view'); container.classList.add(targetView); // 切换按钮激活状态 document.querySelectorAll('.view-toggle button').forEach(b => b.classList.remove('active')); this.classList.add('active'); }); });
注意事项
- 所有需要隐藏的元素不要用
display: none控制,改用opacity + visibility + 高度/内边距置0的组合,才能触发过渡效果 - 所有会变化的样式属性都要在基础样式里提前声明
transition,不要写在各视图的子类中,避免切换时没有入场/退场动画 - 可以根据需求调整
transition的时长和缓动函数,不同属性可以分开设置过渡参数,实现更自然的动画效果
内容的提问来源于stack exchange,提问作者SGR
相关产品推荐
相关产品推荐

