table-cell的手机应用场景
前言
最近在前端观察看见了这篇老文章,看见了元素居中的5种办法,其中提到了display:table-cell这个css显示的新属性,按照当时的浏览器市场来说想必兼容性会是糟糕的一比,但是现在这坛老酒其实可以用到移动端来。
在PC端,应该很少用到 display:table-cell 这个属性,究其原因在于兼容性【IE8+以及现代浏览器才支持】,或者说很少去关注这个标签。此标签的用处就是垂直居中布局功能,这个功能可以让我们不用依赖 margin:0 auto 属性达到居中的目的,并且 margin 外边距还达不到 table-cell 的效果。
元素居中
让一个块级元素居中,我们都想到了 margin:0 auto 属性,一般的最外层的布局经常看见这属性,但是这样的居中只是把元素整体居中,元素中的内容依然按照正常流来排列,从左上角到右下角。但是这样并达不到我们需要的效果,我们需要的效果是不管元素里面的内容有多少,还是添加新内容都是垂直居中于元素。
关于垂直居中的办法,用的最多应该 position + margin 负值的办法达到居中的效果
.test{ height: 400px; position: absolute; top:50%; margin-top: -200px; background-color: #ccc; }
兼容性很好,但是必须先要确定元素的高度,并且假如包含块的高度容不下元素的内容,那么此时就要用 overflow 来处理,假如这个包含块是有背景颜色的,那么就会这样
红色框框中的小渣渣被偷窥地一览无遗,显然这是我们不想看到的,好好的穿着一件裤子,结果裤裆一直处于风口状态,呵呵。
2.float + height +margin负值,代码
.floater {float:left; height:50%; margin-bottom:-120px;} .content {clear:both; height:240px; position:relative;}
还是要知道你的高度,然后折半margin反拉上来。
3.position + margin,利用margin的auto恰好地把上右下左都给填满外边距的办法使其垂直居中,但是IE8-也是不支持的,代码如下
.test { position:absolute; top:; bottom:; left:; right:; margin:auto; height:240px; }
这样也可以达到居中的目的,假说说元素没有设置一个显性高度或者本身不是IMG这类拥有自身高度的元素以外是不会垂直居中的,说白了还是给元素一个高度,也达不到自适应垂直居中的目的。所以还是来炒一下老饭,说不定还可以有不一样的味道。
table-cell
先来了解一下这个属性值,display:table-cell 这个属性等同 HTML中的td和th。假如指定,那么该值所在的元素显示效果等同td或者th标签的效果。在HTML中表单元格td和th都是生成一个个矩形框,这些框有内容,有内边距和边框,就是对外边距 margin 不感冒,所以在表格当中设置一个表单元格外边距,其实是起不了作用的,demo→table中td以及元素table-cell设置margin
说到这里,提一下前辈们说的匿名表对象,在table标签中,假如我们只是写如下代码
<table> <tr> <td>哈哈哈</td> <td>哦哦哦</td> </tr> <tr> <td>嘿嘿嘿</td> </tr> </table>
这个就是所谓的匿名表对象,浏览器在渲染的时候会自动的添加缺失的标签,当然,更加详细的请前往w3c规范文档:匿名表对象
因为设置属性值为 table-cell 的元素本身就具备了td,th的效果,所以假如说在同一个包含块下多个块级元素(如.p标签)使用该属性值,那么这个时候p标签的表象就变成了th也类似 inline-block【IE8+及现代浏览器】 如下代码
.test { display: table-cell; margin-right: 50px; /*此margin无效*/ padding: 10px; border: 1px solid #ccc; }
<p class="test">这是第一个p标签</p> <p class="test">这是第二个p标签</p> <p class="test">这是第三个p标签</p>
效果:
此时设置外边距 margin 同样不感冒,每一个p标签都是紧挨着并排,并且还可以设置 height 因此,这个属性更加近似 inline-block 属性。正是因为该属性值让元素表现得更像传统表格表格布局,假如是N个相同标签并排,那么就会出现一字排开的效果,so,该属性更适合用在单页面移动端,特别是最近一段时间很火的H5单页场景应用垂直居中效果。 
table-cell垂直居中
想要table-cell 垂直居中一个页面,需要几个必要条件:
1.父元素为 display:table,只有当其父元素,也就是包含块声明是table元素,那么才可以让table-cell的元素纯正地显示为th,td;
2.父元素为显示高度,这点可以通过js判断视窗高度,然后给定一个高度 ;
3.vertical-align:center,table-cell 的元素需要指定垂直居中属性,这样才可以妥妥地垂直居中于页面。
.foo{ display: table; width: 100%; height: 100%; } .cell { display: table-cell; vertical-align: middle; height: 100%; }
获取窗口高度js
var height = window.innerHeight; if (typeof height !== "number") { function setHeight () { document.getElementById('foo').style.height = document.documentElement.clientHeight + "px" } }; setHeight();
demo→_→ table-cell自适应垂直居中布局,或者拿出手机出来扫一扫 
这样就可以让一个块级元素妥妥地居中在页面可视化范围内,不过需要注意一点:
避免跟position同用,因为一个页面不可能就只有一个标题还有描述,有时候比较奇葩的还需要用到定位position ,那么这个时候不能在设置 table-cell 的元素同时运用到 position ,这样是为了避免元素返回原本属性。
解决办法就是新建一个标签,所有的定位都是在新建标签上进行。因为前段用到了一个单页面的滑动框架fullpage,对英文不感冒的东西可以去腾讯员工做的一个中文档的 fullpage
,页面用到了 table-cell 值,并且页面中出现定位元素,踩了坑,所以这算是自己的一个小总结吧。
提一提vertical-align
.test { display: table-cell; *display: inline; border: 1px solid #ccc; } .va-t{vertical-align: top;} .va-m{vertical-align: middle;} .va-b{vertical-align: bottom;} .va-bl{vertical-align: baseline;} .va-sup{vertical-align: super;} .va-sub{vertical-align: sub;} .va-tt{vertical-align: text-top;} .va-tb{vertical-align: text-bottom;}
刚刚在测试所以的 vertical-align 属性值的时候发现 baseline 跟 sub,super,text-top,text-bottom 表现出来的效果都是一样的【IE8+及现代浏览器】其实也就是默认值。
对于其他三个值 top 表单元格跟其包含块行框顶端对齐; middle 表单元格内容与其包含块中间对齐; bottom 表单元格内容与其包含块底端对齐。
结语
好了,暂时就是这么多了,推荐该属性用在移动端的H5单页面转化场景应用上,类似现在微信广告H5广告单页面的滑动效果,假如需求就是做到垂直居的,不妨试试这个 table-cell 属性值。
参考资料:
table-display
table-cell的手机应用场景的更多相关文章
- IText 生成pdf,处理table cell列跨页缺失的问题
/** * 创建(table)PDF,处理cell 跨页处理 * @param savePath(需要保存的pdf路径) * @param pmbs (数据库查询的数据) ...
- TE9手机微信场景
HTML <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8& ...
- MySQL出现Waiting for table metadata lock的场景浅析
MySQL版本为5.6.12. 在进行alter table操作时,有时会出现Waiting for table metadata lock的等待场景.而且,一旦alter table TableA的 ...
- alter table锁表,MySQL出现Waiting for table metadata lock的场景浅析及解决方案
在修改/增加表字段的时候,发现很慢, show processlist; 时, Waiting for table metadata lock 能一直锁很久. 官网的一段话,可以理解下 http:// ...
- Guava学习笔记:Guava新集合-Table等
Table 当我们需要多个索引的数据结构的时候,通常情况下,我们只能用这种丑陋的Map<FirstName, Map<LastName, Person>>来实现.为此Guava ...
- 创建一个Table View
在本课程中,您将创建应用程序FoodTracker的主屏幕.您将创建第二个,表视图为主场景,列出了用户的菜谱.你会设计定制表格单元格显示每一个菜谱,它是这样的: 学习目标 在课程结束时,你将能够: 创 ...
- 集合-Table
当我们需要多个索引的数据结构的时候,通常情况下,我们只能用这种丑陋的Map<FirstName, Map<LastName, Person>>来实现.为此Guava提供了一个新 ...
- Table View Programming Guide for iOS---(五)---Creating and Configuring a Table View
Creating and Configuring a Table View Your app must present a table view to users before it can mana ...
- 封装Vue纵向表头左右结构的table表格
我们前端开发人员在使用表格的过程中,大概率碰到的都是表格头部在表格的最上边,然后呈一行展示,紧接着就是表格的每一行的每一个单元格来展示具体内容的场景,很少会遇到表格的头部呈纵向一行展示,也就是说表格的 ...
随机推荐
- iOS NSDictionary、NSData、JSON等 数据类型相互转换
1.NSDictionary类型转换为NSData类型: NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys: @&qu ...
- angularJs项目实战!04:angularjs的性能问题
上一篇文章中我花了很多口舌去介绍angularjs是一个中型框架,面对大型应用时少不了第三方类库的配合.而我的核心议题是:如何以angularjs的思路使用其他类库,这里jquery是最好的例子了,谁 ...
- 正在搞用web.py做的通讯录
正在搞用web.py做的通讯录,应该算是学习吧,学习那个web.py的应用框架,其实已经搞起来了,可以增删改数据了,查询还没可以用,现在正在搞登录认证的问题,久没用python, 但再上手后半小时就有 ...
- 转:pthread_create()
http://blog.csdn.net/youbang321/article/details/7815707 原型:int pthread_create((pthread_t *thread, ...
- Android 读取和保存文件(手机内置存储器)
1:activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/androi ...
- PL/SQL 0.几秒出结果,SQL效率一定高吗?
今天开发问我一个问题,PL/SQL很快出结果了,为什么应用还是很慢 create index F_AGT_SAVB_ACCTINFO_H_idx4 on F_AGT_SAVB_ACCTINFO_H ( ...
- HDU5140---Hun Gui Wei Company (主席树)
主席树太强大了,,如果仅仅用来求第k大就太屈才了..貌似和HDU4605差不多,那个是在图上根据点的顺序建立主席树,这个是根据年龄大小 或者等级高低建立主席树. 题意 大致就是一个二维区间的求和,但是 ...
- AES的S-BOX构造优化
之前写过SBOX的构造,后来看到别人的优秀思路,借鉴过来重新改了一点. 原文地址:http://www.cnblogs.com/7hat/p/3383546.html 主要是将矩阵运算改为列运算之和, ...
- UVa 10048: Audiophobia
这道题要求我们求出图中的给定的两个节点(一个起点一个终点,但这是无向图)之间所有“路径中最大权值”的最小值,这无疑是动态规划. 我开始时想到根据起点和终点用动态规划直接求结果,但最终由于题中S过大,会 ...
- java--对象比较器
在实际的项目中,经常会遇到排序问题,对于基本数据类型java支持Arrays.sort()和Collection.sort()对集合进行排序,但是对用户自定义类型排序呢?java给我们提供了两种解决方 ...