好久没写博客了,刚好今天跨年夜没约到什么妹子,在家宅着不如写点东西好了。

需求

昨天晚上,给公司年会做一个移动端的投票页面,遇到一个UI优化的问题:

· 正文内容少于一屏时,投票提交按钮固定显示在页面底部(如图一)
· 正文内容多于一屏时,投票提交按钮,跟随内容,流式显示在内容下面(如图二)
附图:

 

以前做一些管理后台的时候,底部的版权信息声明就是这样的UI需求,实现思路大概就是:
底部按钮,需要一直显示在底部,可以给body设个最小100%高度,然后用绝对定位把按钮显示在body底边靠上一点的位置,这样内容少的时候,100%的高度起作用,按钮会显示在底部,内容多的时候,内容会把body的高度撑出一屏出现滚动条,而按钮是基于body绝对定位,所以可以跟着滚动条走,一直在内容的底部显示。

关键代码就是这样:

html结构:
html>body>.wrap+.bottom-bar html {
height: 100%;
}
body {
min-height: 100%;
position:relative;
}
.bottom-bar {
position: absolute;
bottom: 0px;
}

本以为轻车熟路,5-10分钟搞定的事情,因为一个bfc的问题,我硬生生调了大半夜,现在记录一下。

问题、意外

按照刚才的写法,内容刚好一屏的时候,提交按钮会挡住文档底部的部分内容,所以这里还需要给body设置一个下边距,值要等于bottom-bar的height。
这个时候问题出来了:
body下的子元素的magin-top和margin-bottom值会影响到body的渲染,进而影响到基于body做相对定位的bottom-bar。

调试一番之后,总结了两点特征,就是块级元素&默认情况下&垂直方向的渲染规则:
· 子元素的margin,会影响父元素的UI渲染,父元素不会被子元素的margin想当然地撑开,就是说渲染上,子元素的margin作用在了父元素上
· 父元素的margin会被子元素的覆盖掉,如果父元素magin值比较小的话,表现就是父元素的margin被子元素的吃掉了

此时,不由得想起来CSS2里面非常弯弯绕的一个概念,BFC。

注:如果BFC小测试 这道题能瞬间答对的话,下面的BFC描述可以直接跳过了。

BFC

之前对BFC模式下margin会折叠的理解仅限于兄弟节点之间,没有意识到父子之间也有这类情况。实话说,多数中文的BFC技术文章里讲的,都是在阐述自己的理解或者抄来抄去,有些讲的模棱两可的,恐怕作者自己都没有搞清楚。

先贴一下mdn和w3的文档供大家参考下:
https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Block_formatting_context
https://www.w3.org/TR/CSS21/visuren.html#block-formatting
https://www.w3.org/TR/CSS21/visuren.html#block-level

备注:· 仔细看看w3的介绍,我相信block containers/block boxes/Block-level elements/block-level box这几个词一定会让你看得想要放弃治疗的,哈哈!
· 另,以上英文文档看得比较费劲的,可以再参考另一位同仁对BFC解释的文章:BFC 神奇背后的原理

再次复习了一下BFC的概念之后,我尝试着总结一下我对这个东西的理解:
1. Block formatting context,是一个上下文环境(可以理解为js里的作用域),这个环境中的元素,遵守块级元素的渲染规则。比如:
  · 从上到下排布,各占一行
  · 垂直方向的margin值,会在相邻节点(兄弟或父子)之间被折叠
  · 自身高度不会被子节点的margin撑大
  · 自身高度不会被浮动子节点撑开
2. 一个默认的html文档流中,只有一个上下文环境
3. 如果需要打破1中所述规则,需要创建一个新的上下文(establish new block formatting contexts for their contents),方法是:
  · 适用于父子/兄弟
    float:left/right、position:absolute、display:非block
  · 仅适用于父子
    overflow:非visible

终极方案

新年快要到了,不多说了,结合以上需求和对BFC的再次理解,直接贴代码:

html结构:
html>body>.wrap+.bottom-bar * {
padding:;
margin:;
}
html {
height: 100%;
overflow: auto;
}
body {
position: relative;
overflow: auto;
min-height: 100%;
}
.wrap {
overflow: auto;/*为了防止子元素对body产生影响,这里需要专门开辟一个新上下文*/
margin-bottom: 40px;/*这里也可以加到body去,body{box-sizing: border-box;padding-bottom:40px;}*/
}
.bottom-bar {
position: absolute;
bottom: 0px;
height: 40px;
width: 100%;
}

“fixed+relative==absolute”——对BFC的再次思考的更多相关文章

  1. “fixed+relative≈≈absolute”——对BFC的再次思考

    好久没写博客了,刚好今天跨年夜没约到什么妹子,在家宅着不如写点东西好了. 需求 昨天晚上,给公司年会做一个移动端的投票页面,遇到一个UI优化的问题: · 正文内容少于一屏时,投票提交按钮固定显示在页面 ...

  2. /*透明度设置的两种方式,以及hover的用法,fixed,(relative,absolute)这两个一起用*/

    <!DOCTYPE html> /*透明度设置的两种方式,以及hover的用法,fixed,(relative,absolute)这两个一起用*/ <html lang=" ...

  3. css属性position: static|relative|absolute|fixed|sticky简单解析

    目录 static 静态定位(默认) relative 相对定位 正常文档流 加了relative之后的布局 加上margin/padding/border之后的布局 absolute 绝对定位 正常 ...

  4. Position属性四个值:static、fixed、absolute和relative的区别和用法

    Position属性四个值:static.fixed.absolute和relative的区别和用法 在用CSS+DIV进行布局的时候,一直对position的四个属性值relative,absolu ...

  5. css position static | absolute | fixed | relative

    <div id="bigbox1">    <div id="box1" class="box">box1</ ...

  6. CSS position relative absolute fixed

    position属性absolute与relative 详解   最近一直在研究javascript脚本,熟悉DOM中CSS样式的各种定位属性,以前对这个属性不太了解,从网上找到两篇文章感觉讲得很透彻 ...

  7. What is the difference between position: static,relative,absolute,fixed

    What is the difference between static,relative, absolute,fixed we can refer to this link: expand

  8. z-index的理解 z-index 属性仅在节点的 position 属性为 relative, absolute 或者 fixed 时生效.

    今天做游戏的Exercise模式的时候,发现把所有的div设置为position:absolute;后,点击play进入到游戏界面的时候,鼠标点击数字的时候,完全没反应.经过我的反复检查,发现只要给所 ...

  9. css的定位,relative/absolute/fixed的用法

    其实position的值有四个,static/relative/absolute/fixed,而static是默认值,不算具有有定位属性,这里就不讲了. 定位其实就是跟元素设置定位属性,然后设置其对位 ...

随机推荐

  1. StringMVC 中如何做数据校验

    步骤一:引入四个jar包 步骤二:注册类型转换器 <context:component-scan base-package="cn.happy.controller"> ...

  2. C语言 · 整数平均值

    编写函数,求包含n个元素的整数数组中元素的平均值.要求在函数内部使用指针操纵数组元素,其中n个整数从键盘输入,输出为其平均值. 样例输入: (输入格式说明:5为输入数据的个数,3 4 0 0 2 是以 ...

  3. wordpress多站点配置

    wordpress作为全球第一的个人博客搭建平台一直在国内外有着较高的人气,从3.0版本开始就已经支持多站点的搭建.该功能可以让子站点运行主站点的程序,不需要再每个站点分别存放网站程序.最近更新的4. ...

  4. 在jekyll模板博客中添加网易云模块

    最近使用GitHub Pages + Jekyll 搭建了个人博客,作为一名重度音乐患者,博客里面可以不配图,但是不能不配音乐啊. 遂在博客里面引入了网易云模块,这里要感谢网易云的分享机制,对开发者非 ...

  5. CSS三个定位——常规、浮动、绝对定位

    .dage { width: 868px; background: #5B8C75; border: 10px solid #A08C5A; margin-top: -125px; margin-le ...

  6. SAP CRM 用户界面对象类型和设计对象

    在CRM中的用户界面对象类型的帮助下,我们可以做这些工作: 进行不同的视图配置 创建动态导航 从设计层控制字段标签.值帮助 控制BOL对象的属性的可视性 从导航栏访问自定义组件 一个用户界面对象类型之 ...

  7. 敏捷转型历程 - Sprint3 一团糟的演示会

    我: Tech Leader 团队:团队成员分布在两个城市,我所在的城市包括我有4个成员,另外一个城市包括SM有7个成员.另外由于我们的BA离职了,我暂代IT 的PO 职位.PM和我在一个城市,但他不 ...

  8. TFS 2015 敏捷开发实践 – 看板的使用

    看板在现代应用开发过程中使用非常广泛,不管是使用传统的瀑布式开发还是敏捷开发,都可以使用看板管理.因为看板拥有简单的管理方法,直观的显示方式,所以很多软件开发团队选择使用看板进行软件开发管理.本文不在 ...

  9. [异常特工]android常见bug跟踪

    前言 对app的线上bug的收集(友盟.云捕等)有时会得到这样的异常堆栈信息:没有一行代码是有关自身程序代码的.这使得对bug的解决无从下手,根据经验,内存不足OOM,Dialog关闭,ListVie ...

  10. Xamarin和微软发起.NET基金会

    新闻<微软宣布成立.NET基金会全面支持开源项目 包括C#编译器Roslyn>,看到大家对微软的开放都很兴奋.在此之前在.NET社区也有了大量的开源项目,所列的24个项目也是早就开源,这次 ...