◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
在网页的制作中,常常会遇到这样的问题,在内容可有可无,但又不能省略的时候,总希望它在不该出现的时候不出现,在该出现的时候出现,就如同折叠椅一样,需要的时候拉出来即坐,不要的时候折叠起来放在角落里不占位置,这就是网页折叠代码的形象比喻,下面就来一组复制既能用的代码,希望能帮到你。
本文通过HTML+CSS+JavaScript技术组合实现了一个响应式网页折叠效果。该方案包含可点击的折叠标题栏、平滑展开动画、旋转箭头指示状态等功能,并针对PC和移动端设备做了差异化样式适配。核心原理是通过CSS过渡动画控制内容区域高度,配合JavaScript动态切换类名实现交互效果,代码简洁且扩展性强。
一、HTML结构解析
代码主打一个简洁,其html也是非常简明,代码如下:
<div class="collapse-container">
<div class="collapse-header" onclick="toggleCollapse()">
<span id="toggleText">展开内容</span>
<span class="arrow">▼</span>
</div>
<div class="collapse-content">
<!-- 内容区域 -->
</div>
</div>
层级结构:包含三级div容器:
collapse-container:整体容器,设置边框和基础样式
collapse-header:可点击的标题栏,绑定点击事件
collapse-content:折叠内容区域,初始状态为隐藏
交互元素:
onclick事件:绑定JavaScript点击函数
toggleText:动态显示"展开/折叠"状态文本
arrow:箭头图标,通过旋转指示状态
二、CSS样式设计
基础样式组:
.collapse-content {
max-height: 0; /* 初始高度为0 */
overflow: hidden; /* 隐藏溢出内容 */
transition: max-height 0.3s ease-out; /* 高度过渡动画 */
}
.collapse-content.active {
max-height: 200px; /* 展开时最大高度 */
padding: 15px; /* 内容边距 */
}
动画原理:通过max-height属性过渡实现平滑展开效果(比直接设置height更安全)
状态切换:.active类控制展开状态,与JavaScript配合切换
交互反馈设计:
.collapse-header {
cursor: pointer; /* 手型光标提示可点击 */
transition: background-color 0.3s; /* 背景色过渡 */
}
.arrow {
transition: transform 0.3s; /* 箭头旋转动画 */
}
.rotate { transform: rotate(180deg); }
通过CSS过渡实现视觉反馈,主要实现两个效果。
1.标题栏背景色渐变
2.箭头180度旋转动画
三、JavaScript交互逻辑
function toggleCollapse() {
const content = document.querySelector('.collapse-content');
const arrow = document.querySelector('.arrow');
const toggleText = document.getElementById('toggleText');
content.classList.toggle('active'); // 切换内容区域显示
arrow.classList.toggle('rotate'); // 切换箭头方向
// 更新状态文本
toggleText.textContent = content.classList.contains('active')
? '折叠内容' : '展开内容';
}
核心方法:
classList.toggle():动态切换CSS类(.active和.rotate)
contains()检测类存在状态
执行流程:
点击标题 → 切换内容区域高度 → 旋转箭头 → 更新按钮文字,以代码实例说明,首次打开为折叠状态,按键文字为“展开内容”,但是当用户展开内容窗口后,又会立刻更新为“折叠内容”,从而实现不同的效果与人性化的体验。
四、响应式适配方案
PC端样式(≥1200px):
@media (min-width:1200px) {
.collapse-content.active { max-height: 200px; }
.collapse-header { font-size: 1em; }
}
移动端样式(≤1190px):
@media (max-width: 1190px) {
.collapse-content.active { max-height: 400px; }
.collapse-header { font-size: 2em; }
}
为了适配不同的客户端面,这里简单的设计了两种,在CSS中使用了媒体查询,PC端最小宽度为1200像素,反之最大宽度在1190像素以下则被视为移动端。当然,如果要细分,还可以分为ipad和手机。
差异化设计:
文字大小:PC端使用1em的字号,而移动端则用2em大字号提升可读性,因为1em在移动端实在是太小了。
内容高度:移动端设置更大高度值适应竖屏显示
弹性布局:标题栏使用display: flex实现文字和右边的箭头自动对齐
五、扩展与优化建议
多实例支持:当前代码为单例模式,可通过document.querySelectorAll改为支持多个折叠面板
内容自适应:将固定max-height改为动态计算实际内容高度
无障碍优化:添加aria-expanded属性提升屏幕阅读器兼容性
动画增强:可组合使用opacity属性实现淡入淡出效果
该方案通过简洁的代码实现了主流的折叠效果,既适合新手学习CSS过渡动画与JavaScript DOM操作的基本原理,也可作为基础组件直接嵌入实际项目使用。
该项目简明快捷,所见即所得,复制即可使用,修改起来也是相当方便,整个实例代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>html+js实现网页折叠效果</title>
<style>
/*共同样式*/
.collapse-container {
margin: 20px auto;
border: 1px solid #ddd;
border-radius: 5px;
overflow: hidden;
font-size: 16px; /* 新增基准字体 */
}
.collapse-header {
padding: 15px;
background-color: #f8f9fa;
cursor: pointer;
display: flex;
justify-content: space-between;
align-items: center;
transition: background-color 0.3s;
}
.collapse-header:hover {
background-color: #e9ecef;
}
.collapse-content {
padding: 0;
max-height: 0;
overflow: hidden;
transition: max-height 0.3s ease-out;
overflow-y: auto;
font-size: 0.9em; /* 内容字体稍小 */
}
.collapse-content.active {
padding: 15px;
transition: max-height 0.3s ease-in;
}
.arrow {
transition: transform 0.3s;
font-size: 1.2em; /* 箭头大小 */
}
.rotate {
transform: rotate(180deg);
}
/* PC样式*/
@media (min-width:1200px) {
.collapse-container {
max-width: 100%;/*文本窗口宽度调整*/
}
.collapse-content.active {
max-height: 200px;/*文本窗口高度调整*/
}
.collapse-header {
font-size: 1em; /* 相对单位 */
}
.collapse-container .collapse-content {
font-size: 1em;
}
}
/*移动端样式*/
@media (max-width: 1190px) {
.collapse-container {
max-width: 100%;/*文本窗口宽度调整*/
}
.collapse-content.active {
max-height: 400px;/*文本窗口高度调整*/
}
.collapse-header {
font-size: 2em; /* 相对单位 */
}
.collapse-container .collapse-content {
font-size: 2em;
}
}
}
</style>
</head>
<body>
<!-- 以下body内容保持不变 -->
<div>
<div onclick="toggleCollapse()">
<span id="toggleText">展开内容</span>
<span>▼</span>
</div>
<div>
<p>这里是折叠的内容区域。你可以在这里添加任意HTML内容,比如文本、图片、列表等。</p>
<p>内容1</p>
<p>内容2</p>
<p>内容3</p>
<p>这个示例使用了CSS过渡效果来实现平滑的展开和折叠动画。</p>
<div style="height: 1200px; padding: 20px; background: #f8f9fa;">
<p>滚动测试内容...</p>
<p>继续滚动测试内容...</p>
</div>
<hr>
<p>本实例来自祝先生的博客,更多实例请访问<a href="http://www.zhu-sir.com/" target="_blank">www.zhu-sir.com</a></p>
</div>
</div>
<script>
function toggleCollapse() {
const content = document.querySelector('.collapse-content');
const arrow = document.querySelector('.arrow');
const toggleText = document.getElementById('toggleText');
content.classList.toggle('active');
arrow.classList.toggle('rotate');
if (content.classList.contains('active')) {
toggleText.textContent = '折叠内容';
} else {
toggleText.textContent = '展开内容';
}
}
</script>
</body>
</html>
