使用百分比布局创建流动的弹性界面,同时用媒体查询来限制元素的变动范围,两者组合在一起构成了响应式设计的核心。
将固定尺寸转换为相对尺寸的公式:
目标元素宽度 / 上下文元素宽度(父对象元素) = 百分比宽度
用em代替px(IE只能缩放em单位,不支持px缩放)
上面的公式同样可以用于文字的像素单位转换为相对单位,例如:浏览器的默认字体大小是16px,那么有一个元素的字体大小是48px,转换为em则为,48 / 16 = 3em
em是书面形式的大写字母”M“的简称,发音和M相同,指的是特定字母和宽度和高度相对于特定字体磅值的比例。
弹性图片(多媒体)
img, object, video, embed {max-width : 100%;height:auto;} /*IE7+,记得先删除img等标签的宽度和高度属性并提供一个最大视口时能匹配尺寸的图片*/
给弹性图片设置阀值:max-width
为不同的屏幕尺寸提供不同的图片
1、Filament Group的响应式图片: http://filamentgroup.com/lab/responsive_images_experimenting_with_context_aware_image_sizing/
Demo Page : http://filamentgroup.com/examples/responsive-images/
原理:先加载一个JS文件,然后设置标签为<img src="small.r.jpg" data-fullsrc="large.jpg">,再用JS处理和替换。
2、Matt Wilcox的自适应图片: http://adaptive-images.com/
原理:结合Apache、PHP和GD库,依赖WEB服务器端编程。
流动网格布局和媒体查询的默契配合(从大视口匹配到小视口)
@media screen and (min-width : 1001px) and (max-width:1080px) {
h1{font-size:1.4em;}
}
@media screen and (min-width : 805px) and (max-width:1000px) {
h1{font-size:1.25em;}
}
@media screen and (min-width : 769px) and (max-width:804px) {
h1{font-size:1.1em;}
}
CSS网格系统
1、一些支持响应式的网格框架
Semantic http://semantic.gs/
Skeleton http://getskeleton.com/
Less Framework http://lessframework.com/
1140 CSS Grid http://cssgrid.net/
Columnal http://www.columnal.com/
固定宽度的CSS网格框架:960.gs
“移动优先”的思想
第4章 响应式设计中的HTML5
腻子脚本(polyfill)这个词是由Remy Sharp提出的,意指使用腻子来补平老版浏览器的缺陷,具体指一段能给老版本浏览器带来新特性的JS代码。
Sjoerd Visscher发现如果用JS创建HTML5新元素标签,IE能识别这些元素并可设置样式,基于这个发现,JS专家Remy Sharp开发了一个轻量级的增强脚本
http://remysharp.com/2009/01/07/html5-enabling-script/
一个新增强脚本(让IE支持HTML5+CSS3等特性):
Modernizr http://www.modernizr.com/
HTML5样板文件: http://html5boilerplate.com/
HTML5文件头写法:
<!DOCTYPE html> <!-- 大小写没有区别 -->
<html lang="en"> <!-- lang页面主语言属性,语言列表: http://www.iana.org/assignments/languages-subtag-registry -->
<head>
<meta charset="utf-8"> <!-- meta是单闭合元素 -->
相比于XHTML 1.0的严格要求,HTML5不要标签必须小写(可以任意大小写),属性值必须用双引号,标签必须闭合等等。(评:对于有代码洁癖的我(人)来说,这太不好了!)
伟大的<a>标签:可以在a标签内嵌套任意标签,除了a和表单标签。
HTML5废弃的属性或标签:如script标签的language属性等。
http://dev.w3.org/html5/spec/Overview.html#non-configming-features
标签语义化是给标签赋予意义的过程。
HTML5的全新语义化元素
<section> 元素用来定义文档或应用程序中的区域、内容块、版块或节
http://dev.w3.org/html5/spec/Overview.html#the-section-element
<nav> 元素用来定义文档的主导航区域
http://dev.w3.org/html5/spec/Overview.html#the-nav-element
<article>元素用来包裹独立的内容片段
http://dev.w3.org/html5/spec/Overview.html#the-article-element
<aside>元素用来表示与页面主内容松散相关的内容,例如用来作侧边栏、引文、广告或者导航元素(如友情链接等)。
http://dev.w3.org/html5/spec/Overview.html#the-aside-element
<hgroup>用来包裹一组使用h1、h2、h3等标签的标题、标语和副标题
http://dev.w3.org/html5/spec/Overview.html#the-hgroup-element
HTML5的大纲结构算法可以自动组织好大纲,可以在每个容器中任意使用任何级别的标题元素。
HTML5大纲生成器:
http://gsneders.html5.org/outliner/
http://hoyois.github.com/html5outliner/
<header>元素用作网站头部的“刊头“区域,也可用作<article>元素的简要介绍,不计入大纲结构。
http://dev.w3.org/html5/spec/Overview.html#the-header-element
<footer>元素用来作网页的页脚或者<article>的文脚
http://dev.w3.org/html5/spec/Overview.html#the-footer-element
<address>元素用于明确地标注离其最近的<article>或<body>祖先元素的联系信息,为避免混淆,一般不用具体的邮政地址,除非确实需要联系地址。
http://dev.w3.org/html5/spec/Overview.html#the-address-element
HTML5结构元素的实际用法
header、nav、footer标签可以任意使用,每个article和section都可以有自己的头部、脚注和导航:
<header>
<nav>……</nav>
</header>
<div id="content">
<article>
<header>……</header>
<nav>……</nav>
<footer>……</footer>
</article>
</div>
<footer>
……
</footer>
HTML5的文本级语义元素(行内元素标签)
http://dev.w3.org/html5/spec/Overview.html#text-level-semantics
<b>表示加粗和强调的文本
<em>强调内容中的重点
<i>文字斜体效果
WAI-ARIA无障碍网页应用技术
它主要解决一个问题:让残障人士能无障碍地访问网页上的动态内容。
http://www.w3.org/WAI/intro/aria
支持无障碍网页技术的屏幕阅读器
ARIA的地标角色属性role,例如:
<nav role="navigation">……</nav>
针对文档结构的各部分分别有如下的地标角色:
- application 用来定义用作网页应用的区域
- banner 用来定义一个站点级别的区域,如网页的头部和logo
- complementary 用来定义一个对页面主要区域进行补充说明的区域,例如侧边栏某个内容块的标题等
- contentinfo 用来定义与页面主要内容相关的信息区域,例如页面的版权信息区域;
- form 用来定义表单
- main 用来定义页面的主体内容
- navigation 用来定义链向当前文档或者相关文档的导航链接
- serach 用来定义一个用于搜索的区域
无障碍网页应用技术进阶:
http://www.w3.org/TR/wai-aria/roles#role-definitions
在Windows下使用非可视桌面阅读器NVDA免费测试网站可访问性,官网: http://www.nvda-project.org/
这使用了无障碍技术的元素设置样式:nav[role="navigation"]{……}
使用HTML5的视频或音频标签
<video src="video/intro.mp4" width="640" height="480" controls autoplay preload="auto" loop poster="video/intro-poster.jpg">你的浏览器不支持视频播放</video>
<audio src="audio/muisc.mp3'></audio>
controls 属性表示显示播放控制栏
autoplay 属性表示自动播放
preload 属性表示预加载媒体
loop 属性表示循环播放
poster 属性表示媒体的预览或缩略图
提供备用的媒体源文件
- Safari只允许<video>和<audio>元素中使用MP4/H.264/AAC格式的媒体文件;
- Firefox和Opera只支持Ogg和WebM格式;
媒体标签内嵌套支持多种媒体格式
<video width="640" height="480">
<source src="video/intro.ogv" type="video/ogg">
<source src="video/intro.mp4" type="video/mp4">
对不起,您的浏览器不支持这种视频格式。
</video>
针对老版本浏览器的备用方案,如果没有任何支持的播放技术则提示下载视频
<video width="640" height="480">
<source src="video/intro.ogv" type="video/ogg">
<source src="video/intro.mp4" type="video/mp4">
<object width="640" height="480" type="application/x-shockwave-flash" data="video/intro.swf">
<param name="movie" value="video/intro.swf" />
<param name="flashvars" value="controlbar=over&image=video/intro-poster.jps&file=video/intro.mp4" />
<img src="video/intro-poster.jpg" width="640" height="480" alt="__TITLE__" title="没有可播放的视频播放器,请下载视频" />
</object>
<p>下载视频</p>
MP4格式:<a href="video/intro.mp4">MP4</a>
Ogg格式:<a href="video/intro.ogv">Ogg</a>
对不起,您的浏览器不支持这种视频格式。
</video>
响应式视频
删除width和height属性,然后用CSS控制:video{max-width:100%;height:auto;}
解决使用iframe嵌入视频的响应问题,例如Youtube和Vimeo等视频网站,使用一个叫FitVids的jQuery插件来解决这个问题:
<iframe width="640" height="480" src=" http://www.youtube.com/embed/B1_N28DA6gY" frameborder="0" allowfullscreen></iframe>
<script src=" https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
<script src="js/fitvids.js"></script>
<script>
$(function(){
$("#content").fitvids();
});
</script>
下载地址: http://fitvidsjs.com/
FitVids介绍文章: http://daverupert.com/2011/09/responsive-video-embeds-with-fitvids/
离线Web应用,很简单
运行机制是每个需要离线使用的网页都指定一个后缀为.manifest的文本文件,这个文件罗列了该网页离线使用时所需的所有资源文件(HTML、图片、JS等等),浏览器会自动读取该文件,下载文件中罗列的资源文件,并缓存到本地以备无网络时使用。
为每个需要离线使用的页面的HTML标签中追加manifest="/offline.manifest"属性,例如:
<html lang="en" manifest="/offline.manifest">
如果使用了Apache,还需要修改.htaccess文件,以保证.manifest文件拥有正确的MIME类型,即text/cache-manifest
AddType text/cache-manifest .manifest
在.htaccess文件加上这段代码,用来阻止浏览器缓存这个离线缓存文件offline.manifest:
<Files offline.manifest>
ExpiresActive On
ExpiresDefault "access"
</Files>
offline.manifest文件的内容格式:
CACHE MANIFEST => 必须声明的开头
#Cache Manifest v1 =>注明版本
CACHE: => 罗列离线使用所需的文件,文件的路径是相对于offline.manifest文件而言的,也可使用绝对路径;
xxxx.html
/css/xxxx.css
/img/cccc.jpg
//……
NETWORK: => 不需要被缓存的文件
* => 通配符
FALLBACK: => 部分使用 / 字符定义一个URL模板,访问时检测是否有缓存文件,如果有则显示缓存页面,没有则显示指定的offline.html文件;
//offline.html
页面被自动加载到离线缓存
一个简化了的manifest文件,不过这样只会缓存用户访问的HTML页面,不会缓存页面内引入的图片、JS等资源文件:
CACHE MANIFEST
#Cache Manifest v1
2013-08-10 19:12:05
FALLBACK:
//offline.html
NETWORK:
*
版本注释的用途:(修改更新manifest文件后)会使浏览器下载新版本文件并再次触发离线存储进程。
版本注释参考于《畅游HTML5》一书 http://diveintohtml5.com/
离线Web应用的故障诊断,可以使用Chrome的开发者工具的Console面板来检查哪些文件没有缓存成功或者路径是否正确等,来判断和解决问题。
离线Web应用的完整规范,详见: http://dev.w3.org/html5/spec/Overview.html#offline
第5章 CSS3:选择器、字体和颜色模式
关于IE6到8对CSS3的支持的问题:用CSS3做增强网站,而不是用它提供基本功能。
IE各版本对CSS2.1和CSS3特性的支持情况:
http://msdn.microsoft.com/en-us/library/cc351024%28v=vs.85%29.aspx
CSS3私有前缀及其用法
私有前缀的由来:浏览器厂商用来测试“试验性的”CSS3特性;
先列出私有前缀,后列出没有前缀的通用属性;
.border {
-moz-border-radius :10px; /*Mozilla Firefox*/
-ms-border-radius :10px; /*IE9+*/
-webkit-border-radius :10px; /*Safari and chrome*/
border-radius :10px; /*W3C*/
}
方法:建立可快速编辑CSS3前缀的代码片段和JS方案
-prefix-free http://leaverou.github.com/prefixfree/
一个可以知道目前浏览器对特定CSS3和HTML5特性的支持程序,并提供来自于 http://gs.statcounter.com/ 的全球浏览器使用率统计情况:
http://caniuse.com/
CSS3多栏布局
column-width:12em; /*每列宽度*/
column-count:4; /*列数*/
column-gap:2em; /*每列的间隔宽度*/
column-rule:thin dotted #999; /*分隔线样式*/
更多内容详见: http://www.w3.org/TR/css3-multicol/
文字换行:word-wrap:break-word; /*IE5+*/
CSS3属性选择器
/*CSS2:匹配页面所有含有alt属性的图片标签*/
img[alt]{……}
img[alt=“photo”]{……}
CSS3的子字符串匹配属性选择器
- 以特定前缀开头;
- 包含特定字符串;
- 以特定后缀结尾;
1、匹配开头的属性选择器
例:img[alt^="film"]{……}
2、匹配包含内容的属性选择器
例:img[alt*="film"]{……}
3、匹配结尾的属性选择器
例:img[alt$="film"]{……}
HTML5中的ID值可以是数字开头,详见: http://dev.w3.org/html5/spec/Overview.html#the-id-attribute
CSS3结构伪类
1、:last-child 伪类选择器 => 匹配最后一个元素
2、:first-child 伪类选择器 => 匹配第一个元素
display:table显示模式之表格式布局
nav{display:table;……}
nav ul{display:table-row;……}
nav ul li{display:table-cell;……} /*这样可以是每个菜单像表格单元格那样自动调整宽度和间隔*/
:nth-child (间隔匹配)选择器
例如:
表格的隔行换色
table td{background:#fff;}
table td:nth-child(even) {background:#eee;}
nth规则:
- :nth-child(n)
- :nth-last-child(n)
- :nth-of-type(n)
- :nth-last-of-type(n)
参数n可以使用整数,例如::nth-child(2)表示列表中的第二个列表项;
也可以使用表达式,例如:
:nth-child(3n+1) 表示从第1个元素开始,每3个元素选1个;
:nth-child(2n+3) 表示从第3个元素开始,每2个元素选1个;