Web 是普遍存在的,也是无处不在的,Web可以适应任何尺寸的屏幕以及任何使用环境,因为Web有其固有的灵活性和可塑性。

Web 再也不是某一平台独有的矿藏,而是真正成为了一张名副其实的大网,并将各种设备彼此连接在一起。

而作为开发人员要想不被这愈发迅猛的设备大潮所吞噬,就必须抛弃之前的一切,转而学会适应它、尊重它。

流动布局

随着越来越多设备的涌现,人们越来越难以继续忽略Web所固有的灵活性和不可预测性。

而作为拥抱灵活性的第一步,就是要为我们的站点创建流动布局,并藉此来对不同尺寸的设备屏幕做出不同的相应。

布局选项

  固定布局:在固定布局中,页面宽度会被指定为特定大小的像素,其中960px是使用最为广泛的宽度。

  流动布局:在流动布局中,度量的单文不再是像素,而是变成了百分比,这样可使页面具有可变的特性。

  弹性布局:弹性布局与流动布局类似,只是通常情况下弹性布局会以em来作为单位(1em=16px)。

  混合布局:最后一种选择就是混合布局,它结合了上面提到的两种或两种以上的布局方式。

那么到底哪种方式才是最具响应性的呢?从根本上来说,这取决于你特定的项目。不过,在大多数情况下,流动布局、弹性布局...相比固定布局更能适应变化

字体大小

  像素:由于不同的设备有着不同的像素密度,所以使用像素作为字体大小的单位,是与web的灵活性原则背道而驰的做法。

  em:em可以跨浏览器进行缩放,而且它也是级联的。级联意味着你只需要调整初始化时的基准,其余部分就会自动地进行调整,而且是按比例调整的。

  百分比:和以em为单位的字体一样,以百分比为单位的字体也是可缩放的,而且也是级联的。

  rem:rem与em的区别在于,rem的大小与根元素(HTML)有关。使用rem能够避免发生在嵌套元素中的级联问题。

使用em作为字体的单位是一种更加流行、更具灵活性的方法。使用em不但可以使文字能够缩放,而且维护起来也更加容易。

网格布局

网格有助于实现站点的平衡、间距以及组织结构。一个实现良好的网格系统会使你的站点井井有条,同时还可以提高页面的可读性和可浏览性

使用网格要做的第一件事就是确定画布。你得先把画布划分出若干你需要的列,然后才能继续后面的工作。

让你的内容来决定你的站点结构是一种很好的设计方法,而且这样做也是非常实用的。从一开始就让网格配合内容,这会让每个页面的设计都更具粘性

box-sizing: border-box 可以让浏览器将 padding 的值算在已经定义好的元素宽度内部。通过这一属性,能够使得设计流动布局变得更加容易。

媒介查询

流动布局是个伟大的开端,它消除了固定布局中的种种限制,并使站点能在不同分辨率的屏幕上都能漂亮地展示,但是它也只能带你走这么远。

媒介查询可以让你根据在特定环境下查询到的各种属性值(比如屏幕分辨率)来决定应用什么样的样式。通过使用媒介查询,就可以根据屏幕尺寸对页面做出相应调整了。

视口标签和属性

视口就是浏览器的可视区域,也指浏览器的宽度。

视口标签的形式非常简单,只需指定使用的视口元标签,然后列出一些声明即可:

<meta name="viewport" content="width=device-width" />

该元标签需要放在 HTML 文件的 head 标签中:

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width" />
<title></title>
</head>

  width:width 声明可以让你将视口设置为某一特定的宽度,或者设置为设备屏幕的宽度。在 width 声明中使用 device-width 是最佳的选择。

  height:与 width 对应的就是 height,height 允许你指定一个特定的高度。事实上 height 并不常用,除非你不想让页面垂直滚动。

  user-scalable:user-scalable 声明会告诉浏览器,是否允许用户在页面上进行缩放。在那些追求完美到像素的设计中,常常将user-scalable属性设置为no。

  initial-scale:通过给 initial-scale 赋值为 0.1(10%) 到 10.0(1000%)之间的某个数,来设置页面初始化的缩放层级。

  maximum-scale:maximum-scale 声明可以告诉浏览器允许用户放大页面到什么程度。如果将 maximum-scale 设置为1.0,同样可以禁止用户缩放页面。

  minxmum-scale:minimum-scale 声明会告知浏览器允许用户将页面缩小到什么程度,其默认值是0.25(25%)。

媒介查询结构

媒介查询可以通过询问浏览器来确定特定的表达式是否为真。如果为真,那么就加载一些特殊的、适用于这种情况的样式,从而达到调整布局的目的。

媒介查询的一般形式为:

@media [not|only] type [and] (expr) {
rule
} type:媒介类型,特定的目标设备类型
expr:媒介表达式,测试某一特性是否为真
only:逻辑关键词,例如 and、or、not、only
rule:规则,调整显示效果的基本样式

css中定义了10种不同的媒介类型,每一种媒介类型都会告诉浏览器是否要加载特定的样式表。但在实际的使用过程中,你会发现你几乎只会用到 screen(彩色计算机屏幕)。

样式表中的媒介查询语句如下:

<style>
@media screen {
h1 {
font-size: 1.2rem;
}
}
</style>

此外,你也可以采用外部样式文件的形式,并在link元素内指定媒介属性:

<link rel="stylesheet" href="screen.css" media="screen" />

就媒介类型本身而言,它只允许你指定设备的类型,但是为了对页面进行进一步细分,你需要缩小设备的范围,这时就该媒介表达式登场了。

媒介表达式

媒介查询的强大之处在于它们能够利用表达式来检测出设备不同特性的真假值。

例如通过下面这条简单的声明,你就可以判断出设备视口的宽度是否大于320px:

@media screen and (min-width:320px) {
/* css rule */
}

这条语句首先会检测访问页面的设备是否属于 screen,然后测试设备的视口宽度,其中 min- 前缀会保证视口宽度至少为320px。

常用的媒介特性有 width(设备显示区域的宽度)、height(设备显示区域的高度)、orientation(指定设备处于竖直或水平状态)、resolution(设备的分辨率dpi)。

逻辑关键字

除了媒介类型和媒介表达式外,你还可以通过使用可选的关键字,来使媒介查询语句具有更强大的功能。

  AND:你可以使用 and 来测试多个表达式。 @media screen and (color)

  NOT:对整个表达式的结果取反,而不是对部分表达式的结果取反。 @media not screen and (color)

  OR:使用逗号在一系列表达式中的某一个为真时,加载某些样式表。 @media screen and (color), print and (color)

  ONLY:对于部分老式浏览器,使用only关键字可以隐藏媒介查询。 @media only screen and (color)

规则

媒介查询中的最后一块内容,就是你要应用的实际样式规则。

你可以在这里写基本的CSS规则,它们唯一的特殊之处就是位于媒介查询里面:

@media only screen and (min-width: 800px) and (max-width:1000px) {
body {
font-size: 1.2rem;
font-family: arial;
}
}

内嵌样式与外部样式

媒介查询既可以写在页面内部,也可以通过 link 元素的 media 属性被包含到页面中来。

<style>
@media only screen and (min-width:1200px) {
a {
text-decoration: underline;
}
}
</style> <link href="style.css" media="only screen and (min-width:1200px)" />

无论内嵌样式或外部样式是否会用到,所有的样式都会被下载下来。

外部媒介查询的优势在于文件可以变得很小,进而利于维护。缺点是额外的HTTP请求会使站点变慢。

响应式设计对性能的影响

响应式设计能够解决很多问题,但同时它也很容易在诸如性能、维护这些问题中迷失方向。在这些问题中,性能问题显得尤为重要。

因为在你构建用户体验中,性能是其中一个不可或缺的标准组件,而且很多案例研究表明,性能影响着你的用户的满意度,性能也是你最重要的一道防线。

虽然每个网站的情况都不相同,但有几点原因几乎是所有加载过慢的网站所共有的:

  下载并隐藏:display:none 虽然可以隐藏页面内容,但是被隐藏的资源依旧会被下载,浏览器仍然需要遍历所有资源,DOM元素也依旧会被创建。

  下载并缩小:响应式设计中使用的高质量图片,远远超过小屏幕设备的显示能力,这样一来,那些多余的字节就这样被白白浪费掉了。

  额外的DOM:尽管有些内容会被隐藏,但浏览器还是会解析并处理隐藏部分的DOM。而且复杂的DOM会导致更高的内存消耗、昂贵的回流以及运行的更慢的网站。

这些问题都不容易解决,因为它们是由现有的响应式设计和浏览器的工作模式所共同决定的。

总而言之,响应式设计是一种强劲的、向前思考的技术,但同时它对性能也有着显著的影响。要确信你已经明白了这些挑战,并且要在设计的过程中避免它们。

响应式 Web 设计指南「基础篇」的更多相关文章

  1. 响应式 Web 设计指南「实践篇」

    无论你是奔赴战场.跑马拉松,还是构建一个响应式的站点,准备工作都是关键. 创建一个响应式的站点意味着要考虑多样化的设备生态系统. 如果没有适当的准备,你将发现自己会因为缺少必要的部分而忙里忙外,并且站 ...

  2. <HTML5和CSS3响应式WEB设计指南>译者序

    "不是我不明白,这世界变化快."崔健的这首歌使用在互联网领域最合适不过.只短短数年的功夫,互联网的浪潮还没过去,移动互联网的时代已经来临.人们已经习惯将越来越多的时间花在各种移动设 ...

  3. Web开发——HTML基础(HTML响应式Web设计 Bootstrap)

    参考: 参考:http://www.bootcss.com/ 目录: 1.什么是响应式 Web 设计? 2.创建自己的响应设计 3.使用 Bootstrap 1.什么是响应式 Web 设计? RWD ...

  4. HTML5、CSS3与响应式Web设计入门(2)

    HTML5的宽泛含义开拓了Web开发的视野,增加了开发方案的多样性,同时也带给很多Web开发者不小的困惑,就是HTML5在涉及到Web某个应用领 域的开发时,到底代表了什么?本篇文章的目的就在于跟大伙 ...

  5. 什么是响应式Web设计?怎样进行?

    http://beforweb.com/node/6/page/0/3 开始第一篇.老规矩,先无聊的谈论天气一类的话题.十一长假,天气也终于开始有些秋天的味道,坐在屋里甚至觉得需要热咖啡.话说两年前也 ...

  6. 十大响应式Web设计框架

    http://www.csdn.net/article/2014-05-13/2819739-responsive-frameworks-for-web-design 对于设计师而言,网站设计中的任意 ...

  7. 分享29个超赞的响应式Web设计

    原文自:http://www.csdn.net/article/2013-01-16/2813678-responsive-design-websites 最近几年,响应式Web设计不断印入人们眼帘, ...

  8. 学习之响应式Web设计---一个实例

    周末闲来无事,做了一个响应式设计的例子.当然,由此并不能窥见响应式设计真谛之一斑.但,对于初次接触响应设计,对于响应式设计的概念依旧模糊不清的同学来说,或许是个启蒙! 闲语暂且不表,进入正题,这里没有 ...

  9. HTML5、CSS3与响应式Web设计入门(1)

    HTML5与CSS3已经当仁不让的成为了这两年Web界最火爆的词,他们似乎在HTML4和CSS2统治了Web很多年之后的某一天突然爆发,然 后一直占据着所有Web开发者的视野.HTML5本身就是一个很 ...

随机推荐

  1. python操作haproxy.cfg文件

    需求 1.查 输入:www.oldboy.org 获取当前backend下的所有记录 2.新建 输入: arg = { 'bakend': 'www.oldboy.org', 'record':{ ' ...

  2. 移植BOA服务器到开发板

    移植BOA 服务器到GEC210 开发板 开发平台主机:VMWare--Ubuntu 10.04 LTS开发板:GEC210 / linux-2.6.35.7编译器:arm-linux-gcc-4.5 ...

  3. DOS命令大全(转)

    dos命令大全 CMD是command的缩写,是windows环境下的虚拟DOS窗口,提供有DOS命令,功能强大,如果你以前学习过DOS操作,那就小儿科了.是基于Windows的命令行窗口,在开始-- ...

  4. jmeter之ip欺骗

    说明:我看有的博客说官方文档是在jmeter2.5以上的版本有此功能的实现~ 我的是2.13版本,也可以实现 . 准备工作: 使用IP欺骗功能必须得本地有多个可用IP,通常普通的PC机只有一个物理网卡 ...

  5. PYTHON-基本数据类型-元祖类型,字典类型,集合类型

    内容: 1. 元组 2. 字典 3. 集合=========================== 元祖类型什么是元组: 元组就是一个不可变的列表============================ ...

  6. poj3666 线性dp

    要把一个序列变成一个不严格的单调序列,求最小费用 /* 首先可以证明最优解序列中的所有值都能在原序列中找到 以不严格单增序列为例, a序列为原序列,b序列为升序排序后的序列 dp[i][j]表示处理到 ...

  7. python 全栈开发,Day112(内容回顾,单例模式,路由系统,stark组件)

    一.内容回顾 类可否作为字典的key 初级 举例: class Foo(object): pass _registry = { Foo:123 } print(_registry) 执行输出: {&l ...

  8. python 全栈开发,Day94(Promise,箭头函数,Django REST framework,生成json数据三种方式,serializers,Postman使用,外部python脚本调用django)

    昨日内容回顾 1. 内容回顾 1. VueX VueX分三部分 1. state 2. mutations 3. actions 存放数据 修改数据的唯一方式 异步操作 修改state中数据的步骤: ...

  9. bootstrap之表单和图片

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. NodeMCU入门(3):断线自动重连,指示灯显示连接状态

    准备工作 1.NodeMCU模块 2.ESPlorer v0.2.0-rc6 事件监听器 NodeMCU采用了事件响应的方式.也就是说,只需为事件设置一个回调函数,当事件发生时,回调函数就会被调用. ...