自适应页面设计: Viewport控制, media query和相对单位

时间:2023-03-10 02:19:22
自适应页面设计: Viewport控制, media query和相对单位

viewport,视口,就是对用户的可见部分, 大小因设备而不同。H5引入。

* 没有它: 整体缩放 ( 老网页是固定的大小,浏览器在手机上只是简单地缩放整个页面,所以用户体验很差)
* 有了它: 浏览器会重新排版。而且,
屏幕大小就是Chrome仿真器提示的size。 所以, mobile页面必须要它

用户习惯:

*
用户都习惯上下滚动网站,而不是横向滚动,因此,如果用户必须横向滚动或缩放页面才能阅读,那么这将给用户带来糟糕的体验。

Best Practice:

* 自适应设计的主要概念基础是流畅性和比例可调节性

自适应网页设计(这一概念最初是由 Ethan Marcotte 在’A
List Apart’中
提出的)回应了用户及其所用设备的需求。版式会因根据设备的大小和功能而变化。例如,手机可能会以单列视图的形式呈现内容,而同样的内容可能会以双列的形式呈现在平板电脑上。

一、视口元素 (viewport meta tag是Apple 的Mobile Safari 引入的,专门对Mobile, 并非标准, 但是多数Mobile浏览器支持)

(Apple官方资料见
https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariWebContent/UsingtheViewport/UsingtheViewport.html)

其HTML文档中必须包含元视口元素(如下),指示浏览器如何对网页尺寸和缩放比例进行控制。

<meta
name="viewport"
content="width=device-width, initial-scale=1.0">

(以上是正式的写法  HTML5的)

or simplified
as:

<meta
viewport="width=device-width, initial-scale=1.0">

其中:
   width=device-width指令浏览器给网页重排内容,使之适合不同的屏幕大小
  initial-scale=1  指示浏览器在不考虑设备方向的情况下,将 CSS 像素与设备无关像素的比例设为 1:1,并允许网页完全占用横向宽度 (特别是  手机旋转模式下)

注意

  • 使用英文逗号分隔属性,确保旧版浏览器可以准确解析相关属性。除了设置 initial-scale 外,您还可以在视口上设置以下属性:
  • minimum-scale
  • maximum-scale
  • user-scalable

但是,设置后,这些属性可以停用用户缩放视口的功能,可能会造成网页访问方面的问题。

实例: 
<meta name="viewport" content="width=device-width,
initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0">

视图参数: 
  宽度是Device的宽度, 不缩放 (初始比例1,最小比例1,
最大比例1)

二、不要使用很宽的元素,浏览器无法自动重排它。
如果图片宽度大于视口宽度,那么就会导致视口横向滚动。您应该调整此内容,使其适合视口内的宽度,以便用户无需横向滚动
1)       如果元素的css宽度过大,则它在窄视口的设备上水平超界. ==》用相对单位100%好. (例如,iPhone 等宽度为 320 CSS 像素的设备)

2)       如果元素的css位置过大,则它超界,显示在屏幕外.

。因此,请改为使用相对宽度值,例如 width: 100%。同样请注意,使用较大的绝对定位值可能会使元素脱离小屏幕上的视口

设计元素的最佳效果,不要依赖于viewport的宽度。 因为以css像素单位表达的某些屏幕的分辨率和宽度变化很大。

三、媒体查询(@media)

媒体查询是可应用于 CSS 样式的简单过滤器。有了这些过滤器,我们可以根据设备呈现内容的特点轻松更改样式,包括显示屏类型、宽度、高度、方向甚至是分辨率

您可以将打印必需的所有样式放在打印媒体查询中:

<link
rel="stylesheet" href="print.css"
media="print">

* 在样式表链接中使用 media 属性
* 嵌入 CSS 文件的媒体查询:@media 和 @import。(尽量避免使用 @import,以提高性能)。

例如: 下面的代码片段, 当 设备的宽度介于500px到 600px之间, 而其是 横屏的时候,定义一组样式。

@media (min-width: 500px) and (max-width: 600px)  and (orientation: landscape) {

h1 {

color: blue;

}

.desc:after {

content:" 本设备的宽度介于500px到 600px, 而其是 横屏";

}

}

其中使用了media的min-width, max-width和orientation参数,用了逻辑运算and, 还可以查询min-height, max-height等参数, 更多参数和逻辑运算参考:https://www.w3schools.com/cssref/css3_pr_mediaquery.asp

不同媒体查询适用的逻辑并不是互斥的,因此,开发者可以根据 CSS 中优先级的标准规则,应用满足生成的 CSS 区块标准的任何过滤器。

<link
rel="stylesheet" media="(max-width: 640px)"
href="max-640px.css">

<link
rel="stylesheet" media="(min-width: 640px)"
href="min-640px.css">

  • 当浏览器宽度介于 0 像素和 640 像素之间时,系统将会应用 max-640px.css。
  • 当浏览器宽度为 640 像素或大于此值时,系统将会应用 min-640px.css。

<l <link
rel="stylesheet" media="(orientation: portrait)"
href="portrait.css">

<link
rel="stylesheet" media="(orientation: landscape)"
href="landscape.css">

  • 在竖版Portrait时,使用 portrait.css。
  • 在横版Landscape时,使用 landscape.css。

用min-width创建查询, 不要用min-device-width。因为:min-width 以浏览器窗口尺寸为依据,浏览器支持度好。

备注(  min-device-width
屏幕尺寸为依据,浏览器支持差, 或者误报为预期的视口宽度。另外,使用 *-device-width 会阻止内容适应允许窗口调整大小的桌面设备或其他设备,因为该查询基于设备的实际大小,而非浏览器窗口大小)

四、使用相对单位

在* div 上设置 width: 100% 可以确保其横跨视口的宽度,对视口来说既不会太大也不会太小。无论设备是宽度为 320 像素的 iPhone、宽度为 342 像素的 Blackberry Z10,还是宽度为 360 像素的 Nexus 5,div 均会适合这些屏幕。

此外,使用相对单位可让浏览器根据用户缩放程度呈现内容,而无需为网页添加横向滚动条。

div.fullWidth { 
 width: 100%; }

https://developers.google.com/web/fundamentals/layouts/rwd-fundamentals/size-content-to-the-viewport?hl=zh-cn

(RWD: Responsive Web Design)

五、基于视口大小的相对单位,vw, vh,vmin和vmax

这4个相对单位是CSS3新增的

vw: 1% viewport width

vh: 1% viewport height
vmin: 就是min(vw, vh)
vmax: 就是max(vw, vh)

举个例子,如果视口宽 = 1024, 高=768, 那么

10vw 就是102.4
10vh 就是76.8
在横屏的时候, vmin就等于 vh, 768
在竖屏的时候, vmin就等于 vw

使用此单位的设计,能够自动使用各种手机屏幕的大小。省去了media query。

附录: 常见手机的设备分辨率和viewport分辨率 (http://www.cnblogs.com/GameEngine/p/7237405.html)