使用CSS3实现响应式标题全屏居中和站点前端性能
要实现标题全屏居中(同一时候在垂直和水平方向居中)。有若干种方法,包含使用弹性布局、表格单元、绝对定位和自己主动外边距等。
全屏居中
当中眼下比較流行也比較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%;
}
我们首先须要了解浏览器的渲染过程:
- 解析DOM Tree。创建一个或多个渲染层(layer)
- 将每一个层独立地绘制进位图(bitmap)中(计算样式->布局->栅格化)
- 将层作为纹理(texture)上传至 GPU
- 复合(composite)多个层来生成终于的屏幕图像
- 每一个层的样式出现调整后,要又一次计算样式->又一次布局(可能没有)->又一次栅格化(可能没有)->又一次组合
使用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
使用CSS3实现响应式标题全屏居中和站点前端性能的更多相关文章
- 响应式网站-全屏banner响应的2中方法 - 被吃掉的banner
通常来讲, 设计师们喜欢把banner设计成全屏(1920px或以上) 主题内容控制在一定的范围内一般在1200px左右 这样的设计即可以在宽屏上的表现很好.也能向下兼容一些小屏幕的设备: 如下图(所 ...
- 用CSS3 vh 简单实现DIV全屏居中
vh.vw.vmin.vmax介绍 vw:视窗宽度的百分比(1vw 代表视窗的宽度为 1%)vh:视窗高度的百分比vmin:当前 vw 和 vh 中较小的一个值vmax:当前 vw 和 vh 中较大的 ...
- 如何通过CSS3 实现响应式Web设计
如何通过CSS3 实现响应式Web设计: 分为三个步骤:(1)允许网页宽度自动调整.首先在页面头部中,我们需要加入这样一行:<meta name="viewport" con ...
- 一款基于jquery和css3的响应式二级导航菜单
今天给大家分享一款基于jquery和css3的响应式二级导航菜单,这款导航是传统的基于顶部,鼠标经过的时候显示二级导航,还采用了当前流行的响应式设计.效果图如下: 在线预览 源码下载 实现的代码. ...
- HTML5、CSS3与响应式Web设计入门(2)
HTML5的宽泛含义开拓了Web开发的视野,增加了开发方案的多样性,同时也带给很多Web开发者不小的困惑,就是HTML5在涉及到Web某个应用领 域的开发时,到底代表了什么?本篇文章的目的就在于跟大伙 ...
- html5 + css3 + jQuery + 响应式布局设计
1. [代码][HTML]代码 <!DOCTYPE html><html dir="ltr" lang="zh-CN">< ...
- Android 无标题 全屏设置
标题栏和状态栏 Android程序默认情况下是包含状态栏和标题栏的. 在Eclipse中新建一个Android程序,运行后显示如下: 图中标出了状态栏(显示时间.电池电量.网络等)和标题栏(显示应用的 ...
- HTML5+CSS3的响应式网页设计:自动适应屏幕宽度
这几天都在修改博客上面的样式.本来用的是d83.0的模板.自己又修改了许多地方,其中自己修改的一些地方在手机里面显示的效果不是很理想,于是想改成自适应的效果.对CSS3不是特别的熟练,只能去网上找找案 ...
- CSS3之响应式布局
在没有C3的时候,响应式布局是通过js来实现的. 开始研究响应式web设计,CSS3 Media Queries是入门. Media Queries,其作用就是允许添加表达式用以确定媒体的环境情况,以 ...
随机推荐
- HDU 2256 Problem of Precision (矩阵快速幂)(推算)
Problem of Precision Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- [BZOJ 1143] 祭祀river
Link:https://www.lydsy.com/JudgeOnline/problem.php?id=1143 Solution: 一道最长反链的模板题 由Dilworth定理可知:最小链覆盖数 ...
- [CF819B]Mister B and PR Shifts
题意:定义一个排列$p_{1\cdots n}$的“偏移量”$D=\sum _{i=1}^n\left|p_i-i\right|$ 求它所有的轮换排列中偏移量最小的是多少,要求输出轮换序数 暴力就是求 ...
- python3 开发面试题(字典和拷贝)5.30
""" 问:执行完下面的代码后, l,m的内容分别是什么? """ def func(m): for k,v in m.items(): m ...
- [CF735E/736C]Ostap and Tree
题目大意: 一个$n(n\le100)$个点的树,将一些点染成黑点,求满足每个点到最近黑点的距离$\le k(k\le\min(20,n-1))$的方案数. 思路: 树形DP. 用$f[i][j]$表 ...
- HashMap源码分析(Java8)
1. HashMap public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, ...
- 图像视图-ImageView
(一) 知识点: (1)imageView.setImageAlpha(Alpha):设置图片透明度 (2)在布局imageView中设置图片位置:android:scaleType="ce ...
- UWP 程序抛出异常时总是跳到“global::System.Diagnostics.Debugger.Break();”的解决办法
调试 C# 程序时,如果遇到异常,VS 会中断,指出导致异常的语句.但是最近调试 UWP 程序时,发现总是在“global::System.Diagnostics.Debugger.Break();” ...
- 移植u-boot-2012.4到Tiny6410_1G_Nandflash
Uboot-2012.4的启动流程: 自从Uboot-2010后的Uboot在文件结构和启动流程方面都有非常大的改变,所以移植Uboot-2012.4的时候还是费了我不少时间, 首先在编译Uboot的 ...
- 64945e3dtw1dii6vfdr19j.jpg(PNG 图像,1497x929 像素)
64945e3dtw1dii6vfdr19j.jpg(PNG 图像,1497x929 像素)