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:0; bottom:0; left:0; right:0; 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

本文地址:http://xiaoho.com/?p=923

时间: 2024-10-10 17:52:47

table-cell的手机应用场景的相关文章

iOS地图用Xcode跑cpu和内存(静置场景)和模拟手机发热场景

以iOS13.3和Xcode11.4在mac为例,内存数据只能做对比用,静置场景: 使用GPX方案,取脚本和对应的Xcode工程代码到本地用Xcode打开工程,脚本用来生成轨迹文件(暂时还不知道怎么做,后面了解) 图1.1为工程代码,图1.2为脚本 1.解压location-simulation-master.zip,打开maps.xcodeproj,确定打开地图的弹框点击open,再点击Maps,得到图1.5 图1.3 图1.4 图1.5 如果第一次run需要安装证书重签名 2.选择轨迹文件:

TE9手机微信场景

HTML <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"&

Swift设置Table View的Cell中Lable自适应内容高度的

@IBOutletweak var myTableView: UITableView! override func viewDidLoad() { super.viewDidLoad() myTableView.estimatedRowHeight = 44.0 myTableView.rowHeight =UITableViewAutomaticDimension } 最后修改在Table Cell中Label的lines属性,将其设置为0.

ios 官网文档翻译—Create a Table View(swift)

学习IOS中,翻译一下官方文档加深理解顺便提高自己的英文能力.英文很烂,翻译如若有错请谅解. 原文地址 如何创建一个TableView 在这一课中,你要创建FoodTracker(demo app)的主界面.你将创建一个基于table view的显示用户们的食物的列表,并且将完成如下图的自定义table cells来展示用户们的每份食物. 学习目标 在学习完这一劫课程后,你应该会: 创建一个storyboard场景 了解table view的关键组成部分 创建并设计一个自定义table view

MySQL线程处于Waiting for table flush的分析

  最近遇到一个案例,很多查询被阻塞没有返回结果,使用show processlist查看,发现不少MySQL线程处于Waiting for table flush状态,查询语句一直被阻塞,只能通过Kill进程来解决.那么我们先来看看Waiting for table flush的官方解释:https://dev.mysql.com/doc/refman/5.6/en/general-thread-states.html Waiting for table flush   The thread

HTML table、form表单标签的介绍

本篇主要介绍 table.form标签以及表单提交方式. 目录 1. <table> 标签:在HTML 中定义表格布局. 2. <form> 标签:用于创建 HTML 表单. 3. 表单提交方式:介绍get.post方法. 1. <table> 标签 1.1 说明 在HTML 中定义表格布局. 1.2格式 <table> <caption></caption> <tr> <th></th></

[How to]使用自定义cell进行tableview的创建,适用于cell样式不发生变化的情况。

1.简介 在tableview中又默认的cell格式,其中组织如下: <截取自官网文档> 最终的在页面上默认的cell也只能像上述那样的显示效果,如果这种要是无法满足我们的界面要求,那么我们可以自定义cell来进行创建. 2.实现 目标:我们需要制作如下一个table,它的cell高度宽度和排版都是一样的,所以非常适合使用xib来定制cell. 1. 初始化工程后我们将table的数据存放在plist中: 2.在controller中我们以懒加载的方式将plist数据加载进来 详细方法可参考[

MySQL出现Waiting for table metadata lock的原因以及解决方法

转自:http://ctripmysqldba.iteye.com/blog/1938150 (有修改) MySQL在进行alter table等DDL操作时,有时会出现Waiting for table metadata lock的等待场景.而且,一旦alter table TableA的操作停滞在Waiting for table metadata lock的状态,后续对TableA的任何操作(包括读)都无法进行,因为他们也会在Opening tables的阶段进入到Waiting for

Quick-cocos2d-x3.3 Study (六)--------- 跳转场景和过渡动画

跳转场景 1 app:enterScene("GameScene", nil, "SLIDEINT", 1.0) 2 app:enterScene("GameScene", nil, "FADE", 1.0) 3 app:enterScene("GameScene", nil, "MOVEINB", 1.0) 4 app:enterScene("GameScene",