简单总结CSS3中视窗单位Viewport的常见用法


Posted in HTML / CSS onFebruary 04, 2016

介绍视窗(Viewport)单位

视窗(Viewport)是你的浏览器实际显示内容的区域——换句话说是你的不包括工具栏和按钮的网页浏览器。这些单位是vw,vh,vmin和vmax。它们都代表了浏览器(视窗(Viewport))尺寸的比例和窗口大小调整产生的规模改变。

比方说我们有一个1000px(宽)和800px(高)的视窗(Viewport)

vw——代表视窗(Viewport)的宽度为1%,在我们的例子里50vw = 500px。
vh——窗口高度的百分比 50vh = 400px。
vmin——vmin的值是当前vw和vh中较小的值。在我们的例子里因为是横向模式,所以50vim = 400px。
vmax——大尺寸的百分比。50vmax = 500px。
你可以在任何一个可以使用像素值的地方使用它们,比如width,height,margin,font-size等等。它们将通过窗口大小的调整或旋转设备的浏览器来重新计算这些值。

占用页面的整个高度

每一个前端开发人员都致力于这件事。你的第一直觉是这样做:

CSS Code复制内容到剪贴板
  1. #elem{   
  2.     height: 100%;   
  3. }  

然而,除非我们为html和body添加100%的高度,但只是这样还是不行的,因为这样的代码并不优雅而且很有可能会破坏你的设计的其余部分。使用vh就变得相当容易了,只需要为高度设置100vh,那它将永远都是你窗口的高度。

CSS Code复制内容到剪贴板
  1. #elem{   
  2.     height: 100vh;   
  3. }  

视口宽度大小
vw是CSS3新加入的一个使用视口宽度来计算字体大小的单位。这样可以允许更多的响应字体大小。

尽管这似乎是为响应式设计的一个很有用的单位,但我个人不是它的粉丝。因为它并不能在字体大小上给我更多的控制权,他总是显示的过大或过小。

我的方法

在我做这项研究之前,我一直使用像素来设置我的字体大小。这是因为现在的大多数浏览器允许用户在字体太小的情况下自行放大页面,所以使用像素并没有什么问题。

但是,我发现这种方式在很大程度上限制了扩展能力。虽然我的字体在中小屏幕上看起来不错,但他应该在大屏幕上有更好的优化。即便用户有放大的选项,这也不应该是我们希望他们来做的事情。

因此我使用rem设置的解决方案是(使用像素作为备用)。

CSS Code复制内容到剪贴板
  1. html {   
  2.   font-size: 62.5%; /* sets the base font to 10px for easier math */  
  3. }   
  4. body {   
  5.   font-size16px;   
  6.   font-size: 1.6rem;   
  7.   /* sets the default sizing to make sure nothing is actually 10px */  
  8. }   
  9. h1 {   
  10.   font-size32px;   
  11.   font-size: 3.2rem;   
  12. }  

这样我扩大了字体大小而只需要这样写——

CSS Code复制内容到剪贴板
  1. @media screen and (min-width1280px) {   
  2.   html {   
  3.     font-size: 100%;   
  4.   }   
  5. }  

这个方法是用像素作为降级单位因为IE8及以下不支持rem。这有一个问题是当我改变基础字体大小时只能应用在可扩展性大小上面而不适用于后备字体大小。不过我不认为这是一个巨大的问题,因为这个问题对于较大规模的设备的核心来说只是一个额外的问题。

如果你有任何关于如何改善这个问题的想法,请在评论里让我知道。我也可以写一个SCSS的混入,这样我可以不必输入这两个后备和rem单位。

子元素大小根据浏览器改变而不是父元素

在某些情况下,你想要的是子元素的大小相对于窗口改变而不是父元素。同样的,按照前面的例子,这样是不行的:

CSS Code复制内容到剪贴板
  1. #parent{   
  2.     width400px;   
  3. }   
  4. #child{   
  5.     /* This is equal to 100% of the parent width, not the whole page. */  
  6.     width: 100%;   
  7. }   
  8. 如果我们用vw来设置子元素,那么它会简单的溢出并采取网页的全宽:   
  9.   
  10. #parent{   
  11.     width400px;   
  12. }   
  13. #child{   
  14.     /* This is equal to 100% of page, regardless of the parent size. */  
  15.     width: 100vw;   
  16. }  

响应垂直居中

通过设置元素的width,height和margin的视窗(Viewport)单位,你可以不使用任何其它技巧来设置居中。

这里有一个高度为60vh 上下外边距为20vh的矩形,它们加起来是100vh(60+2*20),使它即便调整窗口大小也可以始终居中。

CSS Code复制内容到剪贴板
  1. #rectangle{   
  2.     width: 60vw;   
  3.     height: 60vh;   
  4.     margin: 20vh auto;   
  5. }  

等宽列

你可以使用视窗(Viewport)单位来设置响应式网格。它们的行为类似于百分比但总是相对于视窗(Viewport)的大小。所以你可以将它们放在一个比窗口宽的父元素里,但它仍然有网格来保持其应有的宽度。这样来创建全屏滑块可谓得心应手。

这项技术需要元素用float:left来对齐彼此相邻的元素:

CSS Code复制内容到剪贴板
  1. .column-2{   
  2.     floatleft;   
  3.     width: 50vw;   
  4. }   
  5. .column-4{   
  6.     floatleft;   
  7.     width: 25vw;   
  8. }   
  9. .column-8{   
  10.     floatleft;   
  11.     width: 12.5vw;   
  12. }  

总结

视窗(Viewport)单位有它的用途而且值得尝试。它们易于理解,而且在某些情况下对于代替CSS更加难的解决方案或不可能实现的技术有非常大的帮助。

HTML / CSS 相关文章推荐
详解纯CSS3制作的20种loading动效
Jul 05 HTML / CSS
HTML5混合开发二维码扫描以及调用本地摄像头
Dec 27 HTML / CSS
Html5实现单张、多张图片上传功能
Apr 28 HTML / CSS
实例讲解HTML5的meta标签的一些应用
Dec 08 HTML / CSS
HTML5通用接口详解
Jun 12 HTML / CSS
HTML5中input[type='date']自定义样式与日历校验功能的实现代码
Jul 11 HTML / CSS
iphoneX 适配客户端H5页面的方法教程
Dec 08 HTML / CSS
HTML5 解决苹果手机不能自动播放音乐问题
Dec 27 HTML / CSS
利用canvas实现图片压缩的示例代码
Jul 17 HTML / CSS
基于HTML5+tracking.js实现刷脸支付功能
Apr 16 HTML / CSS
AmazeUI 折叠面板的实现代码
Aug 17 HTML / CSS
Canvas绘制像素风图片的示例代码
Sep 25 HTML / CSS
CSS3+Sprite实现僵尸行走动画特效源码
Jan 27 #HTML / CSS
结合CSS3的布局新特征谈谈常见布局方法
Jan 22 #HTML / CSS
css3 border旋转时的动画应用
Jan 22 #HTML / CSS
CSS3实现swap交换动画
Jan 19 #HTML / CSS
基于CSS3制作立体效果导航菜单
Jan 12 #HTML / CSS
纯HTML5+CSS3制作图片旋转
Jan 12 #HTML / CSS
CSS3 text shadow字体阴影效果
Jan 08 #HTML / CSS
You might like
暴雪前总裁遗憾:没尽早追赶Dota 取消星际争霸幽灵
2020/03/08 星际争霸
用PHP生成静态HTML速度快类库
2007/03/18 PHP
PHPMailer安装方法及简单实例
2008/11/25 PHP
php中header跳转使用include包含解决参数丢失问题
2015/05/08 PHP
PHP register_shutdown_function()函数的使用示例
2015/06/23 PHP
PHP二进制与字符串之间的相互转换教程
2016/10/14 PHP
PHP中的使用curl发送请求(GET请求和POST请求)
2017/02/08 PHP
修改Laravel自带的认证系统的User类的命名空间的步骤
2019/10/15 PHP
jquery ajax 登录验证实现代码
2009/09/23 Javascript
为jquery.ui.dialog 增加“自动记住关闭时的位置”的功能
2009/11/24 Javascript
IE6下出现JavaScript未结束的字符串常量错误的解决方法
2010/11/21 Javascript
博客侧边栏模块跟随滚动条滑动固定效果的实现方法(js+jquery等)
2013/03/24 Javascript
解析ScrollPic在ie8下只滚动一遍,然后变为空白 ie6,ie7,chrome,firefox正常
2013/06/26 Javascript
导入extjs、jquery 文件时$使用冲突问题解决方法
2014/01/14 Javascript
JavaScript中的值是按值传递还是按引用传递问题探讨
2015/01/30 Javascript
js实现鼠标悬停图片上时滚动文字说明的方法
2015/02/17 Javascript
jQuery插件Tooltipster实现漂亮的工具提示
2015/04/12 Javascript
JavaScript中for循环的使用详解
2015/06/03 Javascript
js基于面向对象实现网页TAB选项卡菜单效果代码
2015/09/09 Javascript
利用Vue2.x开发实现JSON树的方法
2018/01/04 Javascript
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
2020/11/27 Vue.js
Python读写ini文件的方法
2015/05/28 Python
利用Django内置的认证视图实现用户密码重置功能详解
2017/11/24 Python
django-rest-swagger的优化使用方法
2019/08/29 Python
您的健身减肥和健康饮食专家:vitafy
2017/06/06 全球购物
世界上最大的家庭自动化公司:Smarthome
2017/12/20 全球购物
澳大利亚网上买书:Angus & Robertson
2019/07/21 全球购物
致标枪运动员广播稿
2014/02/06 职场文书
更夫岗位责任制
2014/02/11 职场文书
人力资源管理专业求职信
2014/07/23 职场文书
党校学习党性分析材料
2014/12/19 职场文书
2016年“抗战胜利纪念日”71周年校园广播稿
2015/12/18 职场文书
redis哨兵常用命令和监控示例详解
2021/05/27 Redis
Android开发EditText禁止输入监听及InputFilter字符过滤
2022/06/10 Java/Android
Win11 21h2可以升级22h2吗?看看你的电脑符不符合要求
2022/07/07 数码科技