以下内容若有问题烦请即时告知我予以修改,以免误导更多人。
页面结构
承接页
- 单个商品+品牌一排一个商品+猜你喜欢一排两列商品
- 置顶效果
品牌页
- 品牌一排一个商品+猜你喜欢一排两列商品
- 置顶效果
遇到问题
1. 有fixed bar的情况下还需优惠券置顶
方案1: append
$(".page-bar").append($("#J_coupon"))
✘- 优点:不需要为
$("#J_coupon")
增加fixed样式 - 缺点:如果券已向右滑动,不便于保持滑动状态,需iscroll/记录translateX(..)
- 优点:不需要为
方案2:
$("#J_coupon.fixed")
✔︎- 优点:能保持券状态
- 缺点:需要为
$("#J_coupon")
增加fixed样式
2. 滚动需监听事件颇多 (目前方案不是最优)
- bar
- 券
- 查看更多xx件商品
- 右下角置顶按钮
- 品牌商品数量 > 20
- 下滑 展示当前已浏览数量
- 上滑 展示置顶按钮
- 品牌商品数量 <= 20
- 展示置顶按钮
- 品牌商品数量 > 20
1 | bindScroll: function() { |
后期优化
优化scroll性能
- 函数节流
- 当持续触发事件时,debounce 会合并事件且不会去触发事件,当一定时间内没有触发再这个事件时,才真正去触发事件。
- 适用于多次提交(commit)的场景,如点击按钮提交发送请求的情况
函数防抖
- 持续触发事件时,throttle 会合并一定时间内的事件,并在该时间结束时真正去触发一次事件。
- 适用于scroll/resize等场景
=> 节流方案
1 | var didScroll = false; |
优化渲染方式
当访问scrollWidth系列、clientHeight系列、offsetTop系列、ComputedStyle等属性时,会JS强制重排,导致Style和Layout前移到JS代码执行过程中
使用
requestAnimationFrame()
,将以上特殊操作汇集并延迟入队
1 | const newScrollTop = this.getPosition(this.panes[index].$refs.content).top - this.distance |
做位移效果时使用tranform代替top/left/bottom/right
top/left/bottom/right
这类属性会影响元素在文档中的布局,可能改变其他元素的位置,引起重排,造成性能开销- 使用
transform属性(3D/animation)
将元素提升至合成层,省去布局和绘制环节合成层
: 合成层的位图,会交由 GPU 合成,比 CPU 处理要快。当需要 repaint 时,只需要 repaint 本身,不会影响到其他的层。
3. 提醒组件
static/super/src/h5/js/common/subscribe-jq.js
增加callback
1 | bindSub: function(selector, spmSub, spmCancel, item) { |
4. iphoneX 1px边框问题 (若遇到相同问题,可进一步公用)
1 | /*fl hairlines */ |
1px在用了hairlines能解决大部分,但在iphoneX的呈现上会出现上细下粗且有毛边
当前解决方案:针对
iphonex
,去掉原有border,将border写为:before
/:after
定位在按钮上,当前测试border宽度宜为.8px
1 | @media only screen and (device-width:375px) and (device-height:812px) and (-webkit-device-pixel-ratio:3) { |
5. iphoneX公用
1 | @supports (padding-bottom:constant(safe-area-inset-bottom)){ |
static/webapp/js/common/attrsniffer.js
static/webapp/js/base.js
1 | if (isIos) { |
1 | // iPhone X、iPhone XS |
6. 圆角悬浮动效
ui想要的效果:
- 边上滑边收圆角
- 页面从z轴分为三层:背景图层,页面滚动层,bar层
实现:
- 圆角:切出一行圆角png图
- 背景图做一个div background-image
z-index:-1;position:fixed;
- bar层做一个div,限制高度,并且background: url(xxx) no-repeat top; 保证从视觉是bar层的背景图是一直在背景图层的
- 券层虽跟bar层在一个平面,但因为独立fixed,所以也加上background
7. skeleton骨架屏切换
- vue-router
this.$route.name
- Fanli.Utility.getUrlParam(url, name)
Fanli.Utility.getUrlParam(href, 'isbrand') == 1
8. 滚动加载 async-data
static/super/src/h5/css/common/async-data.css
static/super/src/h5/js/common/async-data.vue.js
更多内容可以订阅本人微信公众号,一起开启前端小白进阶的世界!