原书: 响应式Web设计实践css
目录:html
媒体查询:html5
媒体查询容许根据设备的信息----诸如屏幕宽度, 方向或者分辨率等属性来使用不一样的样式node
断点:ios
那些被指定的,开始应用某一新的媒介查询的点. 例如, 一个在980px处的断点的意思是, 当浏览器宽度大于或小于这一数值时, 新的媒介查询将被触发git
#container{ width: 95%; padding: .625em 1.05% 1.5em; /*10px/16px 10px/948px 24px/16px*/ margin: auto 0; } .main{ float: left; margin-right: 2.53%; /* 24/948 */ width: 65.823%; /*624/948*/ } .aside{ float: right; width: 31.645%; /*300/948 */ }
aside img, .main img, .slats img{ width:100%; max-width: 100%; }
不能够在html中定义img的height和width的属性值, 若是设定了这些值, 就不能按比例缩放图片了.github
目的: 固定右边边栏, 只让主栏流动
方法: 使用表格布局web
.main{ display: table-cell; padding-right: 2.53%; /* 24/948 */ } aside{ display: table-cell; width: 300px; }
使用条件注释来为IE 7 及如下版本的IE浏览器提供备用样式: (!IEMobile的条件判断是由于Windows Phone 7 也会加载这个备用样式)chrome
<!--[if (lt Ie 8) & (!IEMobile)]> <link rel="stylesheet" type="text/css" href="css/ie.css" media="all"> <![endif]-->
在移动设备上, 不少设备都会给浏览器返回一个数值较大的布局视口. 编程
视口标签:
<meta name="viewport" content="directive, directive" />
视口的属性:
width: 能够将视口设置为某一特定的宽度, 或者设置为设备屏幕的宽度
最佳选择是在width声明中使用device-width
<meta name="viewport" content="width=device-width" />
<meta name="viewport" content="height=device-height" />
<meta name="viewport" content="user-scalable=no" />
<meta name="viewport" content="initial-scale=.5, width=device-width" />
如这个例子中, width属性被设成设备的宽度, 同时initial-scale被设置为.5, 这意味着浏览器将会缩小显示全部东西: 例如在一个320px宽的设备上, 页面会显示为640px
媒介查询能够经过问询浏览器来肯定特定的表达式是否为真. 若是为真, 就加载一些特殊的, 适用于这种状况的样式, 从而达到调整布局的目的.
媒介查询的通常形式为:
@media [not|only] type [and] (expr) { rules }
包含四个基本组成部分:
每一种媒介类型都会告诉用户代理(例如浏览器)是否要加载特定的样式表. 例如, 若是知道screen媒介类型, 那么全部经过计算机显示器来浏览页面的用户代理都会加载相应的样式. 若是是print媒介类型, 那么相应的样式将会在打印或打印预览时进行加载.
十种类型:
all | 全部设备(默认) |
braille | 盲文触觉反馈设备 |
embossed | 分页盲文打印机 |
handeld | 手持设备(一般为小屏幕而且多是黑白屏幕) |
打印或打印预览 | |
projection | 投影仪 |
screen | 彩色计算机屏幕 |
speech | 语言合成器 |
tty | 使用固定字符间距的设备(终端或打印设备) |
tv | 电视机 |
样式中的查询语句以下:
@media print {
}
也能够采用外部样式文件的形式, 并在link元素内指定媒介属性:
<link rel="stylesheet" href="print.css" media="print" />
不管哪一种方法, 被引用的CSS的效果只有在打印或打印预览时才能看到.
每条媒介查询都必须包含一种媒介类型,若是没有设置媒介类型, 该条查询将使用默认值all, 但在不一样浏览器中的实际行为是各不相同的.
判断设备视口的宽度是否大于320px:
@media screen and (min-width: 320px){
}
先检测访问页面的设备是否属于screen, 而后测试设备的视口宽度----宽度至少为320px
可使用的媒介特性, 而且min-和max-前缀也都适用于这些特性
特性 | 描述 | 值 | 能够指定最小或最大 |
width | 描述设备显示区域的宽度 | <长度>(例如320) | 是 |
height | 描述设备显示区域的高度 | <长度>(例如600) | 是 |
device-width | 描述设备渲染界面的宽度 | <长度>(例如320) | 是 |
device-height | 描述设备渲染界面的高度 | <长度>(例如600) | 是 |
orientation | 指定设备处于竖直(高度大于宽度)或者水平(宽度大于高度)状态 | portrait | landscape | 否 |
aspect-ratio | width属性和height属性的比值 | <比值>(例如16/9) | 是 |
device-aspect-ratio | device-width属性和device-height属性的比值 | <比值>(例如16/9) | 是 |
color | 设备的每一个颜色份量的比特数 | <整数>(例如1) | 是 |
color-index | 设备的颜色查找表中的条目数 | <整数>(例如256) | 是 |
monochrome | 黑白屏幕设备每一个像素的比特数(若是不是黑白屏幕将返回0) | <整数>(例如8) | 是 |
resolution | 设备的分辨率(像素密度), 能够以点每英尺[dpi]或者点每厘米[dpcm]来表示 | <分辨率>(例如118dpcm> | 是 |
scan | "tv"类设备的扫描过程 | progressive | interlace | 否 |
grid | 返回该设备是网格设备(1)仍是位图设备(0) | <整数>(例如1) | 否 |
@media screen and (color) {} /*判断设备是否配备有彩色屏幕*/ @media not screen and (color){} /*等于 not (screen and (color))*/ @media screen and (color), projection and (color) /*逗号表示or */ /*不少浏览器支持媒介类型, 但不支持媒介查询, 有时这会致使浏览器去尝试下载那些你不但愿用户看到的样式. 这时候就能够用only关键字, 对那些较老浏览器隐藏媒介查询, 这样它们就并不会识别出相应的样式了. 而支持only关键字的浏览器则会继续处理带有only关键字的查询语句*/ @media only screen and (color) /* 若是设备不支持媒介查询, 那么它将会忽略这条查询. 若是设备支持媒介查询, 那么设备将会将上面这条查询与下面这条查询等效对待 @media screen and (color)
媒介查询既能够写在页面内部, 也能够经过link元素的media属性被包含到页面中去.
@media all and (max-width: 768px){ } @media all and (max-width: 320px){ }
@media all and (min-width: 320px){ } @media all and (min-width: 768px){ }
能得到浏览器更好的支持,
且能够下降css文件的复杂性
传统的作法: 使用一些固定的标准宽度: 320px(iphone和其余一些设备), 768px(ipad)和1024px
存在的问题是: 可能会忽视在这些宽度之间的设备.
1) 更好的作法是 追随内容:
根据内容来决定应该在哪里设置断点以及须要设置多少个断点.
其实就是缩放浏览器, 而后缓慢拉宽窗口直到有些东西须要调整时设置断点.
2) 增长对大屏幕的支持.
3) 使用em为媒体查询增长灵活性
即便用em为单位来设置断点
优先为移动平台建立.
自定义数据属性: 专门为页面存储自定义数据并具备data-前缀的属性, 一般出于脚本编程的目的而设置
<ul class="slats"> <li class="group" data-src="images/ball.jpg"> <a href="#"> <h3>sssssssssss</h3> </a> </li> <li class="group" data-src="images/ball1.jpg"> <a href="#"> <h3>sssssssssss</h3> </a> </li> <li class="group" data-src="images/ball2.jpg"> <a href="#"> <h3>sssssssssss</h3> </a> </li> </ul>
js代码:
//添加一个用来帮助快速选取元素的工具函数 q: function(query){ //HTML5向Web API新引入了document.querySelector以及document.querySelectorAll两个方法用来更方便地从DOM选取元素,功能相似于jQuery的选择器。 //两个方法使用差很少的语法,都是接收一个字符串参数,这个参数须要是合法的CSS选择语法。其中参数能够包含多个css选择器, 用逗号隔开 //使用这两个方法没法查找带伪类状态的元素 //其中, querySelectorAll会返回全部知足添加的元素, 结果是个nodeLists集合 //querySelector返回知足条件的单个元素,按照深度优先和先序遍历的原则使用参数提供的css选择器在DOM进行查找,返回第一个知足条件的元素 if(document.querySelectorAll) { var res = document.querySelectorAll(query); } else { //addRule()貌似是IE中的方法. DOM中用insertRule() var d = document; a = d.styleSheet[0] || d.createStyleSheet(); a.addRule(query, 'f:b'); //遍历文档的全部元素, 若是已经添加了属性(f:b)的话, 意味着这个元素存在. 将其push到数组c中 for(var l=d.all, b=0, c=[], f=l.length; b<f; b++){ l[b].currentStyle.f && c.push(l[b]); a.removeRule(0); var res = c; } return res; } } //加载图片 var lazy = Utils.q('[data-src]'); for(var i=0; i<lazy.length; i++){ var source = lazy[i].getAttribute('data-src'); //建立image var img = new Image(); img.src = source; //插入 lazy[i].insertBefore(img, lazy[i].firstChild); }
//这样,在手机上或其余小窗口浏览器中加载页面时, 就不会请求图片了 if (window.matchMedia("(min-width: 37.5em)").matches) { //load in the images var lazy = Utils.q('[data-src]'); for(var i=0; i<lazy.length; i++){ var source = lazy[i].getAttribute('data-src'); var img = new Image(); img.src = source; lazy[i].insertBefore(img, lazy[i].firstChild); } }
min-resolution //非WebKit. 须要两个值中的一个, 第一个值是屏幕分辨率, 单位多是每英寸的点数, 也能够是每厘米的点数. 或者新的每像素的点数(dppx) -webkit-min-device-pixel-ratio //Webkit. 须要赋予一个十进制的表示像素比的值
中间两章讲设计.
其中涉及到一个模型的问题:
我以前了解的是使用图形处理软件来建立初始模型(好比PS). 可是静态模型对响应式设计并无任何帮助. 因此应当到浏览器中去设计.
return !!window.JSON; //检测设备是否原生支持JSON
此外参考: Media Queries 媒体查询常见设备断点