固定宽度布局的缺点
我们经常可以看到固定宽度的布局.例如960px的页面在笔记本上可能显示刚刚好,但是在高分辨率的显示器上两侧就会出现留白,可是我们现在有了智能手机.手机浏览器会将一个标准页面缩放到与视口(即:设备可视区域)恰好匹配.然后用户可以选择在自己感兴趣的内容上放大浏览,这样就导致了用户体验非常糟糕!(想象一下不停的点击放大滑动然后缩小,更可恶的是如果误点击了一个链接).响应式web设计的核心是移动优先.
在使用CSS3属性的时候需要注意浏览器前缀,并且将不带有前缀的添加到最后,这样如果该属性可用就会覆盖之前的声明.
百分比宽度的计算
百分比宽度 = 目标元素宽度 / 上下文元素宽度,例如我们有以下的固定宽度的布局:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| <div id="wrapper"> <header> <nav> <ul> <li><a href="">link1</a></li> <li><a href="">link2</a></li> </ul> </nav> </header> <aside> <p>this is aside</p> </aside> <article> <p>this is content</p> </article> <footer> <p>this is footer</p> </footer> </div> <style> #wrapper{ margin-left: auto; margin-right: auto; width: 960px; } nav{ width: 940px; margin: 26px 0 0 -10px; padding: 25px 10px 0 10px; } nav ul li{ display: inline-block; } aside{ border: none; border-right: #e8e8e8 solid 2px; margin: 58px 10px 0 10px; padding-right: 10px; float: left; width: 220px; } article{ margin: 58px 10px 0 0; float: right; width: 698px; } footer{ float: left; margin: 20px 10px 0 10px; clear: both; width: 940px; } </style>
|
根据经验,我们将最外层的#wrapper的宽度设置为96%,那么nav的宽度应该设置多少?我们用940/960 = 97.91666666666666%,所谓的上下文元素就是被参照的元素,我们也可以简单理解为具有特定宽度的父元素或者祖宗元素.
使用em替代像素
几年前,使用em替代px主要是为了实现文字缩放.em的实际大小是相对于上下文字体而言的.如果给body的font-size设置为100%,其他文字单位都使用相对单位em,那些文字都将受到body上初始声明的影响.现代浏览器中默认文字大小是16px,因此在body中声明以下的3条css等效:
1 2 3 4 5
| body{ font-size: 100%; font-size: 16px; font-size: 1em; }
|
弹性图片
在IE7+实现图片随流式布局自动缩放非常简单:
1 2 3
| img{ max-width: 100%; }
|
同理,该css属性还可以拓展到<object>
,<video>
,<embed>
等其他多媒体元素
CSS3实用技巧
- 类似报纸排版的多栏布局
column-count
- 文字换行
word-wrap:break-word
,需要给外层容器添加此属性,中间内容将自动换行(不会生成水平滚动条)
水平导航的最佳实践:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <nav> <ul> <li><a href="">link 1</a></li> <li><a href="">link 2</a></li> <li><a href="">link 3</a></li> <li><a href="">link 4</a></li> <li><a href="">link 5</a></li> </ul> </nav> <style> nav{ display: table; } nav ul{ display: table-row; } nav ul li{ display: table-cell; } nav ul li:first-child{ text-align: left; } nav ul li:last-child{ text-align: right; } </style>
|
- 首字下沉效果.得益于伪元素选择器.
::first-letter
,同理::first-line
用于选择首行.
元素的透明度
说道透明度我们一般会想到opacity
这个属性.但是给一个容器设置了透明度后,它的内容也就变得透明了,因此我们可以使用透明的背景色:rgba
或者hsla
使用CSS3创作绚丽的效果
模拟书籍页边距的光晕效果
使用多重内阴影:
1 2
| box-shadow:inset 0 0 30px hsl(0,0%,0%), inset 0 0 70px hsla(0,97%,53%,1);
|
文字浮雕
1 2
| text-shadow:0px 1px #fff, 4px 4px 0px #dad7d7;
|
过渡动画
除了常见的transition:all 1s ease 0s
外我们也可以为不同的属性指定不同的过渡(也就是说步调可以任意),例如:
1 2 3 4
| button{ transition-property: border,color,text-shadow; transition-duration: 2s,3s,8s; }
|
以上的效果是2s完成border,3s完成color,8s完成text-shadow.
CSS3针对表单的伪类选择器
input:required
,必填表单域
input:focus:invalid
,处于焦点并输入了非法值的表单域,同理,有input:focus:valid
使用上面的3个选择器可以制作响应式的表单:
1 2 3 4 5 6 7 8 9
| input:required{ border: 1px solid rgba(253, 8, 8, 0.3); } input:focus:invalid{ background: url('error.png') no-repeat right; } input:focus:valid{ background: url('ok.png') no-repeat right; }
|
html5新特性
自动联想词
1 2 3 4 5 6 7 8 9 10 11 12
| <div> <label for="username">用户名</label> <input type="text" id="username" list="usernames"> <datalist id="usernames"> <select> <option value="a"></option> <option value="aa"></option> <option value="abc"></option> <option value="bb"></option> </select> </datalist> </div>
|
以上的代码当我们输入字符的时候会自动从下面的datalist
标签中进行筛选.
不支持html的浏览器的渐进增强
1 2 3 4 5 6 7
| <script src="js/jquery-1.7.1.js"></script> <script src="js-webshim/minified/extras/modernizr-custom.js"></script> <script src="js-webshim/minified/polyfiller.js"></script> <script>
$.webshims.polyfill(); </script>
|
一些常见的DOM方法
- document.images: 页面上所有的图片元素
- document.links : 所有a标签元素
- document.forms : 所有表单
- document.forms[0].elements : 页面上第一个表单中的所有域
参考链接
响应式web设计
47个迷人的CSS3动画