各位刚入行的前端小伙伴,有没有遇到过这种情况?产品经理非要你在移动端做个"查看更多"按钮,结果展开时页面卡得像PPT切换?去年我给电商平台做商品详情页时就栽在这个需求上,今天咱们就把文字折叠的源码秘密扒个底朝天!
基础三连问:这玩意儿到底有啥用?
场景一:评论区瀑布流
• 用户长评超过三行自动折叠(防止页面无限拉长)
• 展开时带动画效果(别直接用display:none跳变)
• 记住上次展开状态(用localStorage存个标记位)
场景二:移动端新闻摘要
• 首段显示前100字符(中文算两个字符)
• 展开后自动滚动到锚点(加个scrollIntoView方法)
• 华为手机要单独处理滚动定位(EMUI系统有兼容问题)
场景三:数据报表展示
• 表格超过五行显示折叠按钮
• 展开时加载更多数据(别一次性全渲染)
• 加个loading动画(转圈圈比卡住体验好十倍)
三大实现方案对比
方案类型 | 代码量 | 兼容性 | 动画 |
---|---|---|---|
纯CSS | 20行 | IE10+ | 生硬 |
JS操控class | 50行 | 全平台 | 流畅 |
Vue指令封装 | 30行 | 现代浏览器 | 丝滑 |
这里插播个实战技巧:用IntersectionObserver做懒加载折叠内容,比监听scroll事件省性能!上个月用这招把页面FPS从40提升到55+
代码排雷手册
坑一:展开后布局塌陷
• 父容器加overflow:hidden(防内容溢出)
• 用max-height代替height做过渡(别写死具体数值)
• 安卓机要加-webkit-transform:translateZ(0)(触发GPU加速)
坑二:点击穿透bug
• 折叠按钮别用position:absolute(容易点到下层元素)
• 事件委托记得阻止冒泡(e.stopPropagation())
• 华为Mate系列要加touch-action:none(防止误触)
坑三:SEO收录不全
• 隐藏内容用CSS clip-path替代display:none
• 异步加载的数据要预渲染(写进标签)
• 上周发现百度爬虫能解析sessionStorage里的内容
性能优化三板斧
- 防抖函数必须加(别让用户狂点展开按钮)
- 离屏渲染要避免(transform别乱用will-change)
- 内存泄漏检查(定时器记得clearTimeout)
这里举个反面教材:去年有个外包项目,折叠动画导致iPhone12发热——查出来是用了20层box-shadow!
老司机的私房建议
在前端圈混了七年,总结出三条保命法则:
- 永远先做移动端适配(80%用户用手机访问)
- 折叠高度用requestAnimationFrame计算(别直接取scrollHeight)
- 留个手动展开开关(防止自动检测抽风)
最近发现个邪门现象——Safari15对max-height过渡动画支持变差了!解决方案是改用grid布局的rows动画。记住啊,好代码都是调试出来的,有啥具体问题评论区见!