web响应式笔记

我们想要及时地获取信息,而随着各种形状和尺寸的移动设备的剧增,万维网可以出现在你的口袋里、钱包里、背包里,就像它在书桌、餐桌和卧室一样方便。
  现在,网站的建设者需要让访问者能够通过移动电话、智能手机、平板电脑、笔记本电脑、台式机、游戏机、电视机以及未来任何可以上网的设备获取信息。响应式 Web设计就是为此诞生的。
  以前,为了满足移动用户的需求,需要额外建立一个专门为移动设备设计的网站。不久之前这种做法还比较流行,但是目前已经越来越少见了。不过,现在也还有一些公司在这样做。有的还为平板电脑建立了第三个网站。
  不存在可以适应所有情形的某种正确方法。每周都有新的设备投放到市场上,而且毋庸置疑的是,各家公司都在设计新的设备类型。那么,构建和维护多个网站现实吗?甚至说,有必要吗?我们无法预知未来的情形。
  幸好,我们有办法构建一个既可以运行在现在的设备,也可以运行在未来设备上的网站。更棒的是,可以让它在较小的屏幕、较大的屏幕以及介于两者之间的屏幕上显示不同的效果。

构建响应式页面的方法植根于以下三点。
  灵活的图像和媒体。图像和媒体资源的尺寸是用百分数定义的,从而可以根据环境进行缩放。
�  灵活的、基于网格的布局,也就是流式布局。对于响应式网站,所有的width 属性都用百分数设定,因此所有的布局成分都是相对的。其他水平属性通常也会使用相对单位(em、百分数和 rem 等)。
  媒体查询。使用这项技术,可以根据媒体特征(如浏览器可视页面区域的宽度)对设计进行调整。

以下详细介绍:

创建弹性布局的步骤

对于需要某个宽度实现预期布局的元素,设 置 width: percentage; , 其 中 percentage表示你希望元素在水平方向上占据容器空间
的比例。通常说来,不必设置 width: 100%; ,因为默认设置为 display:block; 的元素(如 p 以及其他很多元素)或手动设置为 display: block; 的元素在默认情况下会占据整个可用空间。
  作为可选的一步,对包含整个页面内容的元素设置 max-width: value; ,其中 value表示你希望页面最多可增长到的最大宽度 。通常,value 以像素为单位,不过也可以使用百分数、em 值或其他单位的值。

理解和实现媒体查询

媒体查询增强了媒体类型方法,允许根据特定的设备特性定位样式。
要调整网站的呈现样式,让其适应不同的屏幕尺寸,采用媒体查询特别方便。下面列出了可以包含在媒体查询里的媒体特性。

� width (宽度)
� height (高度)
� device-width (设备宽度)
� device-height (设备高度)
� orientation (方向)
 aspect-ratio (高宽比)
� device-aspect-ratio (设备高宽比)
� color (颜色)
� color-index (颜色数)
� monochrome (单色)
� resolution (分辨率)
� scan (扫描)
� grid (栅格)
还有一些非标准的媒体特性,如
� -webkit-device-pixel-ratio (WebKit设备像素比)
� -moz-device-pixel-ratio (Mozilla设备像素比)

除 了 orientation 、 scan 和 grid 以 外,上述属性均可添加 min- 和 max- 前缀。 min-前缀定位的是“大于等于”对应值的目标,而 max- 前缀定位的则是“小于等于”对应值的目标。
  min-width 和max-width是制作响应式页面时反复用到的两个媒体特性。现代桌面浏览器和移动电话浏览器对媒体查询的支持程度很高。不过,InternetExplorer 8 及以下版本并不支持媒体查询。
  以下是媒体查询的基本语法。

//指向外部样式表的链接:
<link rel="stylesheet" media="logic type and (feature: value)" href="your-stylesheet.css" />

// 位于样式表中的媒体查询:
@media logic type and (feature:value) {
/* 目标 CSS 样式规则写在这里  */
}
<head>
<meta charset="utf-8" />
<title>Media query in link</title>
<meta name="viewport" content="width=
   device-width, initial-scale=1.0" />
<link rel="stylesheet" href="base.css"
   media="all" />
   <!--
  The  logic is only.
  The  type  is screen.
  The  feature: value is min-width: 480px.
  -->
<link rel="stylesheet" media="only
  screen and (min-width: 480px)"
  href="styles-480.css" />
</head>

base.css中的样式用于所有的输出设备。styles-480.css 中的样式则仅用于支持媒体查询且视觉区域宽度不低于 480 像素的浏览器。

/*  常规样式写在这里。
每个设备都能获取它们,
除非被媒体查询中的样式规则覆盖 */
body {
  font: 200%/1.3 sans-serif;
}
p {
  color: green;
}
/*
The  logic is only.
The  type is screen.
The  feature: value is min-width: 480px.
*/
@media only screen and (min-width:480px) {
  p {
    color: red;
    font-weight: bold;
  }
}

通过媒体查询,可以根据设备的媒体属性应用不同的样式。尽管媒体查询包含了很多功能,但其中 min-width 和 max-width 是创建响应式网页时用的最多的。

<link rel="stylesheet" media="only screen and (min-width: 480px) and(max-width:767px)" href="styles.css" />

<link rel="stylesheet" media="only screen and (orientation: landscape)" href="styles.css" />

<link rel="stylesheet" media="only print and (color)" href="color-pages.css" />
<link rel="stylesheet" media="only print and (monochrome)" href="monochrome- pages.css" />
<link rel="stylesheet" media="only screen and (color), projection and (color)" href="styles.css" />
</head>
<body>
//这些媒体查询与上图中的是相同的,只是直接出现在样式表中
/*  基准样式
---------------------------------------- */
/*  针对所有设备的基准样式 */
...
/*  开始媒体查询
---------------------------------------- */
@media only screen and (min-width: 480px) and (max-width: 767px) {
/*  样式规则 */
}
@media only screen and (orientation: landscape) {
/*  样式规则 */
}
@media only print and (color) {
/*  样式规则 */
}
@media only print and (monochrome) {
/*  样式规则 */
}
@media only screen and (color), projection and (color) {
/*  样式规则 */
}

理解视觉区域及使用视觉区域 meta 元素

视觉区域(viewport)指的是浏览器(包括桌面浏览器和移动浏览器)显示页面的区域。它不包含浏览器地址栏、按钮这样的东西,只是浏览区域。媒体查询的 width 特性对应的是视觉区域的宽度。不过, device-width 特性不是,它指的是屏幕的宽度。
  在移动设备(如iPhone)上,默认情况下这两个值通常不一样。Mobile Safari (iPhone的浏览器)的视觉区域默认为 980 像素宽,但 iPhone 的屏幕只有 320 像素宽(iPhone 的 Retina 显示屏的屏幕分辨率有640像素宽,但它们是在相同的空间挤入两倍的像素,因此设备宽度仍为320像素)。
  因此,iPhone 会像设为 980 像素宽的桌面浏览器那样显示页面,并将页面缩小以适应320 像素的屏幕宽度(在纵向模式下)。结果,当你在 Mobile Safari 中浏览大部分为桌面浏览器建立的网站时,会显示将这些网站缩小了的样子。在横向模式下也是这样处理的,只不过宽度为 480 像素(iPhone5 是 568 像素)。如果不进行放大,页面通常是难以阅读的(注意不同设备的默认视觉区域宽度并不相同)。

测试页面包含一个 320 像素×480 像素的绿色 div 。Mobile Safari 的视觉区域默认为 980 像素宽,因此 iPhone 会将该 div 缩小,以在 320 像素宽的屏幕内显示它。这就是这个绿色盒子大约占据屏幕宽度的三分之一(即320/980)的缘故。
  幸好,有一种快速解决方案。在页面的 head 部分添加视觉区域 meta 元素即可。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Your page title</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
...
</head>
<body>

这段代码的重点是 width=device-width 。有了这条语句,视觉区域的宽度会被设成与设备宽度(对 iPhone 来说为 320 像素)相同的值,因此在纵向模式下该宽度的页面内容会填充整个屏幕。如果不包含这一语句,使用媒体查询的 min-width 和 max-width 特性将不会得到预期的结果。
  代码中的 initial-scale=1. 部分对 width 和 device-width 值没有影响,但通常会包含这一语句。它将页面的默认缩放级别设成了 100%,换成纵向模式也一样。(意,iOS6 之前的版本有一个 bug,它会裁掉一部分内容,参见http://adactio.com/journal/5802/。)如果不设置 initial-scale=1 ,在 iPhone 中,手机从纵向模式改为横向模式时,网页会被放大,从而让布局与纵向模式的一致。

//兼容ie8/9
<head>
...
<!--[if gt IE 8]><!-->
<link rel="stylesheet" href="css/styles.css" />
<!--<![endif]-->
<!--[if lt IE 9]>
<link rel="stylesheet" href="css/old-ie.css" />
<![endif]-->
</head>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容