写在前面

MIP 中悬浮元素的特殊情况

其实组件上线已经有一段时间了,最开始看到这个需求是站长提交了一个这中功能的组件过来,不过看过代码立刻就想到了 MIP 页面的特殊性:从结果页打开的 MIP 页面,是嵌套在一个 iframe 之中的。

在这种特殊的情况下,单纯的通过 position: fixed 去实现 DOM 元素的悬浮存在一系列的问题。比如,在 ios 的 safari 浏览器中,当用户滑动页面的时候,页面中的悬浮元素会随着页面的滑动而闪烁。

因此,MIP 提供了 mip-fixed 悬浮布局组件来解决这些问题。

滑动悬浮的使用场景

顾名思义就是一个 DOM 节点在滑动的一定位置的时候,变为悬浮状态。滑动悬浮的使用场景还是很多的,比如一些页面中的导航,当导航滑动到页面顶部的时候则悬浮在页面顶部,以方便用户操作。如:

业界技术实现与存在的问题

业界技术实现

目前业内针对这种滚动页面定位的情况一般使用两种逻辑来写:

(1)将悬浮前后的两个状态分成两个 dom 节点(暂时叫做 staticDOM 和 fixedDOM),并通过 JavaScript 控制两个 dom 节点的显示和隐藏。在页面到达悬浮状态之前:staticDOM 节点显示,fixedDOM 节点隐藏;到达悬浮状态之后:staticDOM 节点隐藏,fixedDOM 节点显示。

  • 优点:JavaScript 逻辑简单
  • 缺点:html 代码冗余

(2)只需要一个 dom 节点(暂时叫做 stickyDOM),所有的逻辑都通过 JavaScript 控制,也就是说,页面到达悬浮状态的时候,将 stickyDOM 的 CSS 样式中的 position 属性的值设置为 fixed, 非悬浮状态的时候,将 stickyDOM 的 CSS 样式中的 position 属性设置为 static。

  • 优点:html 代码清晰
  • 缺点:由于每个页面之间的特性,比较难达到通用性

(3)通过 CSS3 的 position: sticky 实现。这是 CSS3 的新特性,不过目前还不能达到很好的兼容状态,特别是我们这种在 iframe 内的特殊情况。关于 sticky 可以参考文档 position:sticky实现iOS6+下的粘性布局

仍然存在的问题

在 ios 下的 uc、百度和手百浏览器中,无论采用哪种方法,由于浏览器原因,页面滑动的时候,所有的 JavaScript 都无法实时计算并执行。因此,只有当页面滑动停止后,JavaScript 才能去计算页面的位置,然后处理悬浮元素的状态,这样就会看到悬浮元素状态的变化有卡顿的情况,对此,目前并没有十分好的解决办法,如果大家有更好的办法,可以反馈我们

简介

mip-semi-fixed 是滑动悬浮组件,也可以叫做半悬浮组件,命名为 semi-fixed 的灵感来源于半导体(介于导体(conductor)与绝缘体(insulator)之间)。

代码设计融合了业界两种实现方案,非 SF 下 MIP 页面中通过 JavaScript 更换 CSS 实现,iframe下的 MIP 页面由于要特殊处理 fixed 元素,所以会克隆一个 dom 节点,具体代码参考 mip-semi-fixed 开源代码

属性及节点

  • threshold 属性(非必选项)

    元素 fixed 状态时距离页面顶部的距离,默认是 0。

  • fixedClassNames 属性(非必选项)

    元素 fixed 状态时需要添加的类,如果没有这个属性,则 组件只会悬浮不会改变样式。

  • div[mip-semi-fixed-container] 子节点(必选项)

    需要滑动后悬浮的 html 代码的容器,组件科隆的也是这个节点。

MIP 官网文档 mip-semi-fixed 滑动悬浮组件 中对组件各个参数的说明、使用以及默认值等进行了详细的说明。

使用

写在后面

有任何问题可以到 github issues 提问。

文章作者:Pearl
转发自segmentfault

【转】mip-semi-fixed 走走又停停的更多相关文章

  1. MIP开发常见问题解答

    校验相关 1. MIP 页面的 <a>链接校验报错,MIP 是强制 target="_blank" 吗? 如果想直接跳转MIP页,可以用mip-link 组件:MIP ...

  2. MIP (百度移动网页加速器)

    前言:第一次用移动网页加速器,感觉好心情都被弄坏了.确实性能提高了不少,但是限制js,对于一些交互实现都成问题.MIP是Mobile Instant Pages的缩写,指百度移动网页加速器, 是一套应 ...

  3. MIP 问题解决方案大全(2018-06更新)

    在 MIP 推出后,我们收到了一些站长的疑问.现将常见问题整理出来,帮助大家了解 MIP 的知识. 一.MIP 认知类问题 二.改造前准备 三.前端改造,组件使用 四.提交生效 五.MIPCache ...

  4. 百度MIP页规范详解 —— canonical标签

    百度MIP的规范要求必须添加强制性标签canonical,不然MIP校验工具会报错: 强制性标签<link rel="/^(canonical)$/"> 缺失或错误 这 ...

  5. MIP 官方发布 v1稳定版本

    近期,MIP官方发布了MIP系列文件的全新v1版本,我们建议大家尽快完成升级. 一. 我是开发者,如何升级版本? 对于MIP页面开发者来说,只需替换线上引用的MIP文件为v1版本,就可以完成升级.所有 ...

  6. MIP改造常见问题二十问

    在MIP推出后,我们收到了很多站长的疑问和顾虑.我们将所有疑问和顾虑归纳为以下二十个问题,希望对大家理解 MIP 有帮助. 1.MIP 化后对其他搜索引擎抓取收录以及 SEO 的影响如何? 答:在原页 ...

  7. 百度推出新技术 MIP,网页加载更快,广告呢?

    我们在2016年年初推出了MIP,帮助移动页面加速(原理).内测数据表明,MIP页面在1s内加载完成.现在已经有十多家网站加入MIP项目,有更多的网站正在加入中.在我们收到的反馈中,大部分都提到了广告 ...

  8. 百度MIP移动页面加速——不只是CDN

    MIP是用CDN做加速的么?准确答案是:是,但不只是. MIP全称Mobile Instant Pages,移动网页加速器,是百度提出的页面加速解决方案.MIP从前端渲染和页面网络传输两方面进行优化, ...

  9. 如何用百度MIP快速搭建体验友好的移动页面

    在读这篇文章之前,请确定你已经了解MIP定义及加速原理.如果不确定的话,可以到MIP官网了解. 改造前期准备和注意事项: 你可以选择直接将原先的移动站点直接改成MIP站,也可以单独再做一套MIP站点与 ...

随机推荐

  1. 几大时尚前端UI框架的IE支持

    这个文章的Topic比较符合我们这些身在Stone Age用户环境中的开发者所考虑的因素 1.先说目前最火最酷的:Semantic-UI 目前版本:0.17.0 Browser Support Las ...

  2. vi 常用命令使用說明

    vi是一種文字模式全螢幕文字編輯軟體(Text Editor).對初學者來說,vi是個很難用的工具,一般需要2個星期的時間才能得心應手.之所以介紹vi,其理由如下: vi是Unix上的標準文字編輯軟體 ...

  3. 如何优雅的关闭Java线程池

    面试中经常会问到,创建一个线程池需要哪些参数啊,线程池的工作原理啊,却很少会问到线程池如何安全关闭的. 也正是因为大家不是很关注这块,即便是工作三四年的人,也会有因为线程池关闭不合理,导致应用无法正常 ...

  4. CSS学习笔记三:自定义单选框,复选框,开关

    一点一点学习CCS,这次学习了如何自定义单选框,复选框以及开关. 一.单选框 1.先写好body里面的样式,先写几个框 <body> <div class="radio-1 ...

  5. Jupyter-notebook 导出时不显示Input[]代码

    参考: https://stackoverflow.com/questions/34818723/export-notebook-to-pdf-without-code    1. 第一个方式是直接在 ...

  6. Java开源生鲜电商平台-购物车模块的设计与架构(源码可下载)

    ava开源生鲜电商平台-购物车模块的设计与架构(源码可下载) 说明:任何一个电商无论是B2C还是B2B都有一个购物车模块,其中最重要的原因就是客户需要的东西放在一起,形成一个购物清单,确认是否有问题, ...

  7. Python_Excel文件操作

    ''' 使用xlrd模块写入Excel文件 ''' import xlrd book=xlrd.open_workbook(r'/Users/c2apple/Desktop/纪录/测试报告/张涛文件盘 ...

  8. Mac--Homebrew简介及安装

    Homebrew官网:https://brew.sh/index_zh-cn.html 参考:http://www.jianshu.com/p/d229ac7fe77d 关于Homebrew Mac ...

  9. Object类的toString()方法总结

    1.java语言很多地方会默认调用对象的toString方法. 注:如果不重写toString方法,将会 使用Object的toString方法,其逻辑为  类名@散列码,toString方法是非常有 ...

  10. 我热爱Coding,但厌恶这个IT互联网

    在我十岁的时候,我觉得这个世界上没有什么东西能比我老爸的那台破电脑更好玩的了.后来,我成为一名Web开发爱好者.大学毕业之后,我在一个软件公司工作,那个时候赚得并不多.再后来,我成为一名正式的Web开 ...