代码先锋网 代码片段及技术文章聚合

CSS视口单位:快速入门

技术标签: css  VW  Vh  vmin  vmax

CSS视口单位:快速入门

翻译 2017年04月27日 08:36:45
  • 685

翻译自CSS Viewport Units: A Quick Start。此文章简单介绍了视口单位及其应用,用于提升大家css知识的广度

单位意义

CSS中有四个基于视口单位,分别为vhvwvminvmax

  • 视口高度(vh)- 这个单位表示视口的高度。1vh等于视口高度的1%;
  • 视口宽度(vw)-这个单位表示视口的宽度。1vm等于视口宽度的1%;
  • 视口最小值(vmin)- 这个单位表示视口的更小尺寸。如果视口高度小于宽度,1vmin等于视口高度1%。同样,如果宽度小于高度,1vmin代表视口宽度1%。
  • 视口最大值(vmax)-这个单位表示视口的更大尺寸。如果视口高度大于宽度,1vmax等于视口高度1%。同样,如果宽度大于高度,1vmax代表视口宽度1%。

在不同情形下,这些单位的值代表什么 
- 如果视口宽1200px,高1000px。则10vw值为120px,10vh为100px。因为宽度大于高度,10vmax等于120px,10vmin等于100px。 
- 如果现在设备旋转,宽为1000px,高1200px。则10vw值为100px,10vh为120px。10vmax仍等于120px,因为高度仍大于宽度,10vmin等于100px。 
- 如果重新设计窗口以至于视口宽1000px,高800px,则10vw值为100px,10vh为80px。因为宽度大于高度,10vmax等于100px,10vmin等于80px。

在这一点上,视口单位也许小于百分数。然而,他们是不同的,就百分数而言,子元素宽度和高度取决于其父元素。

如上面例子,第一个子元素被设为父元素宽度的80%。第二个子元素为宽度的80vw,而其宽于父元素

视口单位的应用

因为这些单位基于视口尺寸,所以在相对于视口设置元素的宽度和高度时,使用它们非常方便。

全屏背景图片或部分

设置元素的背景图片充满屏幕这种方式很常见。同样,你也许想设计一个网站,其产品或服务的部分覆盖整个屏幕。这样情况下,你可以设置响应元素宽度为100%,高为100vh

举个例子,

<div class="fullscreen a">
  <p>a<p>
</div>
  • 1
  • 2
  • 3

你可以使用以下CSS来实现背景图片部分:

.fullscreen {
  width: 100%;
  height: 100vh;
  padding: 40vh;
}

.a {
  background: url('path/to/image.jpg') center/cover;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

创造完美适应的标题

你也许听过或使用过FitText插件。可以使用此插件缩放标题,他们会占据父元素的宽度。正如上文提过,视口单位的值会基于视口尺寸改变。这就意味着如果你使用视口单位设置标题的font-size,会很完美适应屏幕。无论视口宽度什么时候改变,浏览器会恰当地缩放标题。所要做就是计算出就视口单位而言font-size初始值。

设置font-size主要问题是文本大小会基于视口改变。例如,font-size值为8vw,则屏幕宽度1200px时,font-size96px;宽度为400px,值为33px;宽度为1920px时,值为154px。这就会让文本太大或太小而无法阅读。可以阅读《基于排版的视口单位》这篇文章,结合calc()函数,设置恰好的文本大小

居中元素

当想把元素放在屏幕中央时,可以使用视口单位。在知道元素高度情况下,设置margin头部和底部属性等于[(100-height)/2]vh

.centered {
  width: 60vw;
  height: 70vh;
  margin: 15vh auto;
}
  • 1
  • 2
  • 3
  • 4
  • 5

注意事项

使用视口单位时,需要注意一些事情。

注意当使用视口单位设置元素宽度时,因为当根本元素的overflow属性设为auto时,浏览器会假设滚动条不存在,会造成元素宽度大于你所期待的。

举个例子

div {
  height: 50vh;
  width: 50vw;
  float: left;
}
  • 1
  • 2
  • 3
  • 4
  • 5

正常情况下,你期待每个div元素占据屏幕的四分之一,然后每个元素宽度是基于没有滚动条下计算的。所以其宽度会大于。

解决办法是设置宽度为50%。结论是当设置块级元素宽度应使用百分数

同样问题也会发生在移动端,因为地址栏出现与否取决于用户是否在滚动。会导致视口高度改变,用户在看内容时会吓一跳。

浏览器支持

caniuse数据显示,主要的浏览器都支持这些单位。然而,仍有一些bug和问题需要注意。例如,IE9支持vm而不是vmin,IE10+/Edge不支持vmax单位,同样当使用视口单位,Chrome不会打印元素

版权声明:本文为qq_39207948原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_39207948/article/details/79501522

智能推荐

CSS—viewport视口详解

目录 一、概述 二、移动端视口 一、概述 视口是浏览器上显示网页的一块区域,大小并不局限于浏览器可视区域范围。PC端和移动端视口差别很大。PC端中视口宽度始终与浏览器窗口宽度一致,移动端视口与浏览器窗口宽度完全独立。 PC端视口大小等于浏览器窗口可视区域大小,无论浏览器是否缩放。如下代码均可获得PC端视口宽度。 二、移动端视口 移动端视口分为三类,其一布局视口、其二视觉视口、其三完美视口。...

[006]基于视口单位的垂直居中

虽然基于绝对定位的垂直居中方案不错,但是对于整个布局的影响还是非常强烈的,如果开发者不想使用绝对定位,仍然可以采用translate把元素以其自身宽高一半为距离进行移动,那么如何把元素左上角设置到容器的正中心呢? 如果只是想要把元素相对于视口进行居中,那么可以采用视口长度单位。 1vw表示视口宽度的1%。 1vh表示视口高度的1%。 当视口宽度小于高度时,1vmin等于1vw,否则等于1vh。 当...

Viewport 视口 Css响应式设计

  http://www.runoob.com/css/css-rwd-viewport.html 菜鸟传送门 Bootstrap响应式布局模板 viewport 是用户网页的可视区域。 viewport 翻译为中文可以叫做"视区"。 手机浏览器是把页面放在一个虚拟的"窗口"(viewport)中,通常这个虚拟的"窗口"...

视口

布局适口 一般用document.documentElement.clientWidth 视觉适口 一般用window.innerWidth  rem 适配  viewport 适配 // 将所有视口的宽度调整为设计图宽度 // 需要在页面上写好 <meta name="viewport" content="width=device-widt...

视口

布局视口 移动设备默认宽度980px 缺点:移动设备物理尺寸较小,像素宽度比较大,显示出的东西就会比较小,不容易操作 理想视口 可以把相同的样式内容,在PC端和移动端显示的物理尺寸相同(device-width) meta标签设置视口...

猜你喜欢

视口

视口(viewport) 就是浏览器显示页面内容的屏幕区域,视口课分为布局视口,视觉视口 和 理想视口 最常用的还是理想视口 布局视口 layout viewport 一般移动设备的浏览器都默认设置了一个布局视口,用于解决早期的PC端页面在手机上显示的问题。 ios android 基本都将这个视口分辨率设置为980px,所以PC上的网页大多都能在手机上呈现,只不过元素看上去很小,一般默认可以通过...

视口

浅谈视口 视口:即虚拟容器 目的:使pc端的网站放到手机端,自适应宽度。 把一个pc端的网站放到手机端分为两步: 1)把电脑的网站放到虚拟容器中,这个虚拟容器的宽度是980px,这个980是人为规定的,手机在出厂时就设置好的。 如果电脑端的网站整体宽度也是980px就会正好放到这个虚拟容器。 如果电脑端的网站宽度大于980,你的网站在这个虚拟容器中就会产生一个水平滚动条。 如果电脑端的网站宽度小于...

快速提示:不要忘记视口元标记

我记得我进行了响应式网页设计的处女航。 我使用了经典的网格,灵活的布局,并首次处理了媒体查询。 拉伸和缩小浏览器窗口可以使我的设计对周围的环境感到满意。 然后,我在手机上对其进行了测试。 它没有用-我正在查看缩小的全屏设计版本。 事实证明,解决方案很简单。 注意:本教程于2012年2月首次发布,但在其他教程中(它有所变化)通常用作参考,因此我认为需要进行更新。 症结 如果您在这篇文章中没有读到其他...

hdu 6405 (n 个串中本质不同的子串以及他们出现在了哪些串中)

题意:给定 n 个串,询问长度为m的串在这n个串中的贡献之和的期望。贡献的求法是 出现的所有串的val的乘积。 思路:首先要求输出分数,那我们分为分子和分母来考虑,分母很好求。对于分子来说,我们只需要算出长度小于等于m的所有串的贡献之和。  问题转化为 n个串中所有本质不同的子串的贡献,那么我们统计每个状态在那些串中出现过即可。 疑问:这题我一开始采用在线的做法,就是每加入一个字母就更新...