要实现标题全屏居中(同一时候在垂直和水平方向居中)。有若干种方法,包含使用弹性布局、表格单元、绝对定位和自己主动外边距等。

全屏居中

当中眼下比較流行也比較easy理解的方法是使用绝对定位+偏移实现。也就是分两步来把元素居中:

1. 第一步先把元素放在离视口左上角(坐标原点)50%视口宽和50%视口高的地方。

2. 第二步把元素反向偏移其自身宽高的50%。

html,body{background: #333;height:100%; width:100%;margin:0;padding:0;}
h1 {
margin-left: -25%;
margin-top: -35px;/* h1元素边框的高度一半 */
color: white;
width: 50%;
height: 30px;
text-align: center;
position: absolute;
left: 50%;
top: 50%;
padding: 20px 0;
border: 1px solid #666;
}

上述代码使用绝对定位,top: 50%, left: 50%完毕第一步,margin-left和margin-top完毕第二步。

注意标题元素宽度使用百分比,可在水平方向自适应屏幕宽度。

最好设置下min-width,以免屏幕过小时,标题文本溢出。

这种代码是能够工作的。

可是吹毛求疵的话,代码的性能并不好。当然在这种简单用例下不太会被暴露出来。

性能优化

可是假设你想给这个标题加入一些动画效果,比方上下晃动的话,那么就非常有必要优化一下代码。

第二步完毕相对自身尺寸的偏移,刚好能够使用CSS3变换中的translate(使用百分比取值时。以其边框border box尺寸为參照)来实现。

我们先给出代码。然后说明为什么要这样,有什么优点和坏处。

*{margin:0;padding:0;}
html,body{background: #333;height:100%; width:100%;}
h1 {
-ms-transform: translate3d(-50%, -50%, 0);
-webkit-transform: translate3d(-50%, -50%, 0);
transform: translate3d(-50%, -50%, 0);
color: white;
width: 50%;
text-align: center;
position: absolute;
left: 50%;
top: 50%;
}

我们首先须要了解浏览器的渲染过程:

  1. 解析DOM Tree。创建一个或多个渲染层(layer)
  2. 将每一个层独立地绘制进位图(bitmap)中(计算样式->布局->栅格化)
  3. 将层作为纹理(texture)上传至 GPU
  4. 复合(composite)多个层来生成终于的屏幕图像
  5. 每一个层的样式出现调整后,要又一次计算样式->又一次布局(可能没有)->又一次栅格化(可能没有)->又一次组合

使用top/left仅仅会创建一个层。而使用translate方法将促使浏览器(webkit)把h1元素提取出来放在GPU单独的渲染层中(RenderLayer)。这样有3点益处:

1. 该元素不论什么合成属性(Composite Property)的变化将不会影响原有文档,不会导致原文档被又一次布局(relayout或reflow),所谓又一次布局就是又一次计算位置和尺寸,这是前端性能的杀手。位置和角度就是典型的合成属性。

2. 该层将由GPU(Compositor Thread)负责渲染,从而节省CPU资源,不会堵塞主线程JS代码的运行。

3. 动画更为平滑,这是由于使用translate将能够以小于像素的单位(sub-pixel)来绘制。并在帧之间加入了blur(模糊)效果。

可能带来的负作用是额外的渲染层导致很多其它的线程间通信,假设过度使用,导致生成成百上千的渲染层,那反而会导致组合各层图像的成本迅速上升成为主要矛盾,且我们须要记住GPU也是有内存限制的。当然另一个前提是translate方法得到了浏览器支持。这在移动端没有问题。

另外使用translate的3D版本号和translate 2d版本号的差别在于能够强迫在声明后就创建独立的渲染层。这样一旦动画開始,无需等待。

在线实例

这里有一个在线用例是居中标题区块的完整实现

http://wow.techbrood.com/fiddle/6908

还有两个在线用例用来比較top/left和translate方法的性能(你须要学会使用Chrome DevTools):

http://wow.techbrood.com/fiddle/17737

http://wow.techbrood.com/fiddle/17739

by iefreer

使用CSS3实现响应式标题全屏居中和站点前端性能的更多相关文章

  1. 响应式网站-全屏banner响应的2中方法 - 被吃掉的banner

    通常来讲, 设计师们喜欢把banner设计成全屏(1920px或以上) 主题内容控制在一定的范围内一般在1200px左右 这样的设计即可以在宽屏上的表现很好.也能向下兼容一些小屏幕的设备: 如下图(所 ...

  2. 用CSS3 vh 简单实现DIV全屏居中

    vh.vw.vmin.vmax介绍 vw:视窗宽度的百分比(1vw 代表视窗的宽度为 1%)vh:视窗高度的百分比vmin:当前 vw 和 vh 中较小的一个值vmax:当前 vw 和 vh 中较大的 ...

  3. 如何通过CSS3 实现响应式Web设计

    如何通过CSS3 实现响应式Web设计: 分为三个步骤:(1)允许网页宽度自动调整.首先在页面头部中,我们需要加入这样一行:<meta name="viewport" con ...

  4. 一款基于jquery和css3的响应式二级导航菜单

    今天给大家分享一款基于jquery和css3的响应式二级导航菜单,这款导航是传统的基于顶部,鼠标经过的时候显示二级导航,还采用了当前流行的响应式设计.效果图如下: 在线预览   源码下载 实现的代码. ...

  5. HTML5、CSS3与响应式Web设计入门(2)

    HTML5的宽泛含义开拓了Web开发的视野,增加了开发方案的多样性,同时也带给很多Web开发者不小的困惑,就是HTML5在涉及到Web某个应用领 域的开发时,到底代表了什么?本篇文章的目的就在于跟大伙 ...

  6. html5 + css3 + jQuery + 响应式布局设计

    1. [代码][HTML]代码     <!DOCTYPE html><html dir="ltr" lang="zh-CN">< ...

  7. Android 无标题 全屏设置

    标题栏和状态栏 Android程序默认情况下是包含状态栏和标题栏的. 在Eclipse中新建一个Android程序,运行后显示如下: 图中标出了状态栏(显示时间.电池电量.网络等)和标题栏(显示应用的 ...

  8. HTML5+CSS3的响应式网页设计:自动适应屏幕宽度

    这几天都在修改博客上面的样式.本来用的是d83.0的模板.自己又修改了许多地方,其中自己修改的一些地方在手机里面显示的效果不是很理想,于是想改成自适应的效果.对CSS3不是特别的熟练,只能去网上找找案 ...

  9. CSS3之响应式布局

    在没有C3的时候,响应式布局是通过js来实现的. 开始研究响应式web设计,CSS3 Media Queries是入门. Media Queries,其作用就是允许添加表达式用以确定媒体的环境情况,以 ...

随机推荐

  1. Dijkstra【p4943】密室

    Description 密室被打开了. 哈利与罗恩进入了密室,他们发现密室由n个小室组成,所有小室编号分别为:1,2,...,n.所有小室之间有m条通道,对任意两个不同小室最多只有一条通道连接,而每通 ...

  2. 洛谷——P1152 欢乐的跳

    P1152 欢乐的跳 题目描述 一个n个元素的整数数组,如果数组两个连续元素之间差的绝对值包括了[1,n-1]之间的所有整数,则称之符合“欢乐的跳”,如数组1 4 2 3符合“欢乐的跳”,因为差的绝对 ...

  3. java 中==符号的坑

    在某技术群看到这样的一个面试题目: 这是一个4年经验的java 从业者的答案. 你的答案是什么呢? 正确的答案是true. 为什么? 其实当使用String a="a"+" ...

  4. luogu P1623 [CEOI2007]树的匹配Treasury

    题目链接 luogu P1623 [CEOI2007]树的匹配Treasury 题解 f[i][0/1]表示当前位置没用/用了 转移暴力就可以了 code // luogu-judger-enable ...

  5. Codeforces 785D Anton and School - 2(组合数)

    [题目链接] http://codeforces.com/problemset/problem/785/D [题目大意] 给出一个只包含左右括号的串,请你找出这个串中的一些子序列, 要求满足" ...

  6. [Android]--RadioGroup+RadioButton实现底部导航栏

    RadioGroup+RadioButton组合方式打造简单实用的底部导航栏 代码块: <?xml version="1.0" encoding="utf-8&qu ...

  7. hadoop中URI理解

    1)在编写MR程序的时候经常会有如下代码: String uri=“....”: Configuration conf=new Configuration(): FileSystem fs=FileS ...

  8. Ubuntu 16.04使用rm -rf误删文件恢复方法收集

    说明:不一定有效,需要不断尝试 一.lsof 文件刚刚被删除,想要恢复,先尝试lsof. lsof |grep data.file1 cp /proc/xxx/xxx/xx /dir/data.fil ...

  9. 如何提高码农产量,基于ASP.NET MVC的敏捷开发框架之工作流开发随笔三

    前言 “厂长,APP的那几个功能都差不多了,接下来要做工作流,工作流这东西我完全没概念啊.” “查尔斯,一般来说工作流就是指将指定的数据.文件.任务按照预定的规则进行传递流转.比如说你要请假,拿个请假 ...

  10. High Speed Inter-CHIP USB 2.0 PHY

    转载:http://arasan.com/products/usb/usb-2-0/hsic-phy/ High Speed Inter-CHIP USB 2.0 PHY USB is the ubi ...