一、Chrome杀了个回马枪

position:sticky早有耳闻也有所了解,后来,Chrome放弃了对其支持,我也就不关心这个声明了,今天偶然发现,卧槽,Chrome什么时候杀了个回马枪,居然又支持了。眼瞅着,各个浏览器纷纷立了山头,要必要关心关心position:sticky了,不要被人留下厚此薄彼的口舌。

Safari目前还需要-webkit-私有前缀。

二、position:sticky简介

单词sticky的中文意思是“粘性的”,position:sticky表现也符合这个粘性的表现。基本上,可以看出是position:relativeposition:fixed的结合体——当元素在屏幕内,表现为relative,当元素要滚出显示器屏幕时,表现为fixed。例如,可以滚动下面这个框框感受下交互表现:
position:sticky实现的富有层次的滚动交互demo


注意:

  • sticky是相对于滚动的父窗口
  • 不仅要设置position: sticky; 还要设置top、left、等那4个属性
  • sticky相当于是relative和fixed的结合体,在没有sticky以前,一般通过监听滚动事件,当到达某个高度后将CSS属性的relative改变为fixed来实现吸附,现在有了sticky,就更方便了,但是注意的是sticky的兼容性问题。

快速生成HTML标签方法:

ul>li{nihao$}*3
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><style>article {max-width: 600px;margin: 1em auto;height: 300px;overflow: auto;}article h4,article footer {position: -webkit-sticky; /* for Safari */position: sticky;}article h4 {margin: 2em 0 0;background-color: #333;color: #fff;padding: 10px;top: 0;z-index: 1;}article content {display: block;background-color: #ffffe0;position: relative;padding: 1px 10px;}article footer {background-color: red;padding: 10px;bottom: 20vh;z-index: -1;}</style></head><body><article><section><h4>网曝某某某</h4><content><p>12月2日,有网友爆料称12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称.12月2日,有网友爆料称....</p></content><footer>网友评论网友评论网友评论网友评论网友评论网友评论网友评论网友评论网友评论网友评论网友评论网友评论网友评论网友评论网友评论网友评论网友评论网友评论网友评论网友评论网友评论网友评论网友评论网友评论网友评论网友评论:...</footer></section><section><h4>知情人他他他</h4><content><p>嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿v...</p></content><footer>网友神评论网友神评论网友神评论网友神评论网友神评论网友神评论网友神评论网友神评论网友神评论网友神评论网友神评论网友神评论网友神评论网友神评论网友神评论网友神评论网友神评论网友神评论网友神评论网友神评论网友神评论网友神评论网友神评论网友神评论网友神评论网友神评论网友神评论网友神评论网友神评论:...</footer></section>...</article></body>
</html>

三、你可能不知道的position:sticky

position:sticky有个非常重要的特性,那就是sticky元素效果完全受制于父级元素们。

这和position:fixed定位有着根本性的不同,fixed元素直抵页面根元素,其他父元素对其left/top定位无法限制。

根据我简单的测试,发现了sticky元素以下一些特性表现:

  1. 父级元素不能有任何overflow:visible以外的overflow设置,否则没有粘滞效果。因为改变了滚动容器(即使没有出现滚动条)。因此,如果你的position:sticky无效,看看是不是某一个祖先元素设置了overflow:hidden,移除之即可。
  2. 2019-05-22新增
    父级元素设置和粘性定位元素等高的固定的height高度值,或者高度计算值和粘性定位元素高度一样,也没有粘滞效果。我专门写了篇文章深入讲解了粘性效果无效的原因,可以点击这里查看。
  3. 同一个父容器中的sticky元素,如果定位值相等,则会重叠;如果属于不同父元素,且这些父元素正好紧密相连,则会鸠占鹊巢,挤开原来的元素,形成依次占位的效果。至于原因需要理解粘性定位的计算规则,同样点击这里查看。
  4. sticky定位,不仅可以设置top,基于滚动容器上边缘定位;还可以设置bottom,也就是相对底部粘滞。如果是水平滚动,也可以设置left和right值。

下面,我们再看看看富有层次的滚动效果的实现原理。

四、层次滚动实现原理

首先,HTML结构如下(结构很重要):

<article><section><h4>网曝王宝强殴打马蓉</h4><content><p>12月2日,有网友爆料称...</p></content><footer>网友评论:...</footer></section><section><h4>知情人爆料称马蓉闯入王宝强家拿剪刀对峙</h4><content><p>...</p></content><footer>网友评论:...</footer></section>...
</article>

其中,标题<h4>和底部<footer>设置了sticky定位,如下:

article h4,
h4 {position: sticky;top: 0;z-index: 1;
}
content {position: relative;
}
footer {position: sticky;bottom: 50vh;z-index: -1;
}

由于每一段短新闻都在section标签中,属于不同的父元素,因此,滚动的时候,后面的新闻标题才能把前面已经sticky定位的新闻标题推开,这是sticky定位天然的特性,无需任何JavaScript的帮助。

如果,我们这里的HTML结构做调整,标题都是平级的,如下:

<article><section><h4>网曝王宝强殴打马蓉</h4><content><p>12月2日,有网友爆料称...</p></content><footer>网友评论:...</footer><!-- 下一个短新闻 --><h4>知情人爆料称马蓉闯入王宝强家拿剪刀对峙</h4><content><p>...</p></content><footer>网友评论:...</footer></section>...
</article>

则最终效果是所有sticky定位的新闻标题都会重叠在一起,这并不是我们想要的效果。所以,记住了,position:sticky布局的时候,使用合适的HTML结构很重要。

效果中,网友评论从后面钻出来的效果又是如何实现的呢?

两个关键点:

  1. 定位用的bottom,效果和top正好是对立的。设置top粘滞的元素随着往下滚动,是先滚动后固定;而设置bottom粘滞的元素则是先固定,后滚动;
  2. z-index:-1让网友评论footer元素藏在了content的后面,于是才有了“犹抱琵琶半遮面”的效果。

参考链接1:https://www.zhangxinxu.com/wordpress/2018/12/css-p
osition-sticky/

参考链接2

position:sticky新特性相关推荐

  1. position:sticky 的 polyfill——stickyfill 源码浅析

    本人最近在修改 blogsue 中的样式时,使用到了 position: sticky.话不多说,开始主要内容. 定义 position: sticky 是 CSS position 属性的一个新值. ...

  2. 山东标梵Biaofun详解CSS3新特性

    CSS3 新特性 CSS 盒模型 设置一个元素的背景颜色,背景颜色会填充哪些区域 margin/padding 设置百分比是相对谁的 link 和 @import 的区别 CSS 选择器的解析规则 C ...

  3. CSS学习笔记(一) CSS基础+CSS3新特性

    思维导图 文章目录 思维导图 1. CSS 简介 2. CSS 引入方式 2.1 行内样式表 2.2 内部样式表 2.3 外部样式表 2.4 CSS 引入方式总结 3. CSS 选择器 3.1 CSS ...

  4. css样式大全(总结、心得、css3新特性、盒子居中模型等)

    css.html.js是前端的 三剑客 学习好css,这能让前端页面'妆扮'成更加美丽! 行内元素(display:inline) span a bi em label input select te ...

  5. JDK1.5 新特性

    Java 5.0发布了,许多人都将开始使用这个JDK版本的一些新增特性.从增强的for循环到诸如泛型(generic)之类更复杂的特性,都将很快出现在您所编写的代码中.我们刚刚完成了一个基于Java ...

  6. Swift 3 新特性

    原文:What's New in Swift 3? ,作者:Ben Morrow,译者:kmyhy Swift 3将于今年下半年推出,为Swift开发者们带来了很多核心代码的改变.如果你没有关注过 S ...

  7. css grid 自动高度_2020年你不应该错过的CSS新特性(二)

    茫茫人海中与你相遇 相信未来的你不会很差 作者:阿里巴巴淘系技术 来源:https://juejin.im/post/6886258269137043464 Web排版 先看布局上将会有的一些新特性: ...

  8. Java 5~11各个版本新特性史上最全总结

    Java 5 Java5开发代号为Tiger(老虎),于2004-09-30发行 特性列表 泛型 枚举 自动装箱拆箱 可变参数 注解 foreach循环(增强for.for/in) 静态导入 格式化( ...

  9. jQuery Mobile 1.1八大新特性介绍

    随着HTML 5时代的来临,移动开发开始进入了一个新的时代,现在只需要懂得HTML5,配合一定的开发框架,就可以开发出十分漂亮的HTML5的移动应用.在众多的 移动HTML5开发框架中,比较著名的是j ...

最新文章

  1. git常用基本简单命令
  2. 【BZOJ】4259: 残缺的字符串 FFT
  3. G - Bad Hair Day (单调栈)
  4. JZOJ 5697. 【gdoi2018 day1】农场(farm)
  5. VTK:网格之SplitPolyData
  6. Exceptions
  7. 机器学习和统计里面的auc怎么理解?
  8. android gridview横向显示图片,Android使用Gridview单行横向滚动显示
  9. go实现文件服务器,golang文件服务器的两种方式(可以访问任何目录)
  10. 语言用pad流程图求和例题_易编玩初级课解析:如何用编程玩转流程图?
  11. MFC获取文件夹路径并得到该字符串
  12. Xianfeng轻量级Java中间件平台:权限管理
  13. idea2020更新功能_idea2020 插件备份
  14. java解释器是什么_java编译器和解释器
  15. 2022年流行的Java框架有哪些?
  16. redis持久化、主从和哨兵模式详解
  17. 大道至简:软件工程实践者的思想(读后感想)
  18. 全景视频预测头部移动-Predicting Head Movement in Panoramic Video: A Deep Reinforcement Learning Approach
  19. Android编程制作漫画,画出自己的漫画 Android漫画风制作所
  20. 百度小米滴滴躬身入局,新能源造车如此多娇,引无数大厂竟折腰?

热门文章

  1. 怎么编译Linux内核?
  2. Arduino基础入门篇12—火焰报警器
  3. ORB-Mono原理梳理
  4. Oracle Synonym and Grant
  5. 标志寄存器(flag)
  6. JS中onpropertychange事件和onchange事件区别
  7. Problem--133A--Codeforces--A. HQ9+
  8. 数据库指南-SQL与NoSQL
  9. 2023年Android现代开发
  10. 推荐几个Sublime插件