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

全屏居中

当中眼下比較流行也比較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. 【秦九韶算法】【字符串哈希】bzoj3751 [NOIP2014]解方程

    在模意义下枚举m进行验证,多设置几个模数,而且小一些,利用f(x+p)%p=f(x)%p降低计算次数.UOJ AC,bzoj OLE. #include<cstdio> #include& ...

  2. 【分块】bzoj2453 维护队列

    http://www.cnblogs.com/autsky-jadek/p/4020296.html 同bzoj2120. #include<cstdio> #include<cma ...

  3. Linux下#!/usr/bin/env bash和#!/usr/bin/bash、#!/bin/bash的比较

    #!/usr/bin/env bash #在不同的系统上提供了一些灵活性. #!/usr/bin/bash #将对给定的可执行文件系统进行显式控制. 通过/usr/bin/env运行程序,用户不需要去 ...

  4. Linux命令之 file命令

    该命令用来识别文件类型,也可用来辨别一些文件的编码格式.它是通过查看文件的头部信息来获取文件类型,而不是像Windows通过扩展名来确定文件类型的. 执行权限 :All User 指令所在路径:/us ...

  5. [转] C/C++中printf和C++中cout的输出格式

    原文地址 一. Printf 输出格式 C中格式字符串的一般形式为: %[标志][输出最小宽度][.精度][长度]类型,其中方括号[]中的项为可选项.各项的意义介绍如下:1.类型类型字符用以表示输出数 ...

  6. sql获取汉字的拼音首字母的函数

    ql获取汉字的拼音首字母   if exists (select * from sysobjects where id = object_id(N'[fn_ChineseToSpell]') and ...

  7. linux下获取占用CPU资源最多的10个进程

    linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合: ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head linux下获取占用 ...

  8. install libiconv libraries

    #下载地址: https://ftp.gnu.org/pub/gnu/libiconv/ #编译安装 ./configure --prefix=/usr/local make make install ...

  9. 常见配置Server错误导致import 包无效等问题解决

  10. solr6.6 配置自带中文分词

    1.配置solrconfig.xml solr的自带中文分词包在solr-6.6.0\contrib\analysis-extras\lucene-libs下 修改solrconfig.xml增加 & ...