基于CSS3 Media Queries的响应式设计

在网上看见的不错,虽然自己菜鸟一个,但还是转过来做篇文章记录下,以作备份。(原文地址见:http://webdesignerwall.com/tutorials/responsive-design-with-css3-media-queries
现在屏幕分辨率的变化范围很大,从 320px (iPhone) 到 2560px (大型显示器),甚至更大。用户也不只是使用台式电脑访问web站点了,也使用手机、笔记本电脑、平板电脑。传统的网站宽度为固定值,已经不能满足需求了。web设计需要适应这种新需求,页面布局需要能够根据访问设备的不同分辨率自动进行调整。本教程将会向你介绍,如何使用html5和CSS3 Media Queries完成跨浏览器的响应式设计。
demo预览地址:http://webdesignerwall.com/demo/adaptive-design/final.html
demo下载地址:http://www.webdesignerwall.com/file/adaptive-design-demo.zip
第一次运行
在开始之前,我们可以查看 最终demo 来查看最终效果。调整你浏览器的大小,我们可以看到页面会根据视窗的大小自动调整布局。
概述
默认情况下,页面容器的宽度是980px,这个尺寸优化了大于1024px的分辨率。Media query用来检查 viewport 宽度,如果小于980px他会变为窄屏显示模式,页面布局将会以流动的宽度代替固定宽度。如果 viewport 小于650px,他会变为mobile显示模式,内容、侧边栏等内容会变为单独列布局方式,他们的宽度占满屏幕宽度。
2012112217253149
HTML代码
在这里,我不会介绍下面html代码中的细节。下面是布局页面的主框架,我们有一个“pagewrap”的容器包装了"header", "content", "sidebar", 和 "footer"。

<div id="pagewrap">
	<header id="header">
		<hgroup>
			<h1 id="site-logo">Demo</h1>
			<h2 id="site-description">Site Description</h2>
		</hgroup>
		<nav>
			<ul id="main-nav">
				<li><a href="#">Home</a></li>
			</ul>
		</nav>
		<form id="searchform">
			<input type="search">
		</form>
	</header>
	<div id="content">
		<article class="post">
			blog post
		</article>
	</div>	
	<aside id="sidebar">
		<section class="widget">
			 widget
		</section>						
	</aside>
	<footer id="footer">
		footer
	</footer>	
</div>

HTML5.js
请注意,我在demo中使用了html5标签,不过IE9之前IE浏览器不支持header,article,footer,figure等html5新标签。可以在html文档中添加 html5.js 文件将解决这一问题。

<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->

css主体结构   
在这里我也不会解释css文件的细节。页面主容器“pagewrap”的宽度被设置为980px。header被设置为固定高度160px。“content”的宽度为600px,靠左浮动。“sidebar”宽度设置为280px,靠右浮动。

#pagewrap {
    width: 980px;
    margin: 0 auto;
}
#header {
    height: 160px;
}
#content {
    width: 600px;
    float: left;
}
#sidebar {
    width: 280px;
    float: right;
}
#footer {
    clear: both;
}

Step 1 Demo  
 我们可以通过demo查看当前效果。这时我们还没有使用 media queries,调整浏览器宽度,页面布局也不会发生变化。

CSS3 Media Query  
 你可以通过《HTML5实践 -- CSS3 Media Queries》了解更多信息。
包含 Media Queries Javascript文件   
IE8和之前的浏览器不支持CSS3 media queries,你可以在页面中添加css3-mediaqueries.js来解决这个问题。

<!--[if lt IE 9]>
    <script src="http://css3-mediaqueries-js.googlecode.com/svn/trunk/css3-mediaqueries.js"></script>
<![endif]-->

包含 Media Queries CSS
创建media query所需的css,然后在页面中添加引用。

	<link href="media-queries.css" rel="stylesheet" type="text/css" />

Viewport小于 980px(流动布局)
当viewport小于980px的时候,将会采用下面的规则:
pagewrap = 宽度设置为 95%
content = 宽度设置为 60%
sidebar = 宽度设置为 30%
tips:使用百分比(%)可以使容器变为不固定的。

@media screen and (max-width: 650px) {
    #header {
        height: auto;
    }
    #searchform {
        position: absolute;
        top: 5px;
        right: 0;
    }
    #main-nav {
        position: static;
    }
    #site-logo {
        margin: 15px 100px 5px 0;
        position: static;
    }
    #site-description {
        margin: 0 0 15px;
        position: static;
    }
    #content {
        width: auto;
        float: none;
        margin: 20px 0;
    }
    #sidebar {
        width: 100%;
        float: none;
        margin: 0;
    }
}

Viewport小于 480px
下面得css是为了应对小于480px屏幕的情况,iphone横屏的时候就是这个宽度。
html = 禁用文字大小调整。 默认情况,iphone增大了字体大小,这样更便于阅读。你可以使用 -webkit-text-size-adjust: none; 来取消这种设置。
main-nav = 字体大小设置为 90%

@media screen and (max-width: 480px) {
    html {
        -webkit-text-size-adjust: none;
    }
    #main-nav a {
        font-size: 90%;
        padding: 10px 8px;
    }
}

弹性的图片
为了让图片尺寸变得更为弹性,可以简单的添加 max-width:100% 和 height:auto。这种方式在IE7中正常工作,不能在IE8中工作,需要使用 width:auto\9 来解决这个问题。

img {
    max-width: 100%;
    height: auto;
    width: auto\9; /* ie8 */
}

弹性的嵌入视频
为了使嵌入视频也变得更加弹性,也可以使用上面的方法。但是不知道什么原因,max-width:100% 在safari浏览器中不能正常的在嵌入资源中工作。我们需要使用width:100% 来代替他。

.video embed,
.video object,
.video iframe {
    width: 100%;
    height: auto;
}

initial-scale Meta 标签 (iPhone)
默认情况下,iphone的safari浏览器会收缩页面,以适应他的屏幕。下面的语句告诉iphone的safari浏览器,使用设备宽度作为viewport的宽度,并且禁用initial-scale.

<meta name="viewport" content="width=device-width; initial-scale=1.0" />

最终效果
查看最终的demo,调整浏览器的大小,查看media query 的行为。你也可以使用iPhone, iPad, 新版Blackberry, 和 Android 来查看modile版的效果。
------------------分割线-----------------------
总结
可靠的Media Queries Javascript
可以使用css3-mediaqueries.js来解决浏览器不支持media queries的问题。

<!--[if lt IE 9]>
    <script src="http://css3-mediaqueries-js.googlecode.com/svn/trunk/css3-mediaqueries.js"></script>
<![endif]-->

CSS Media Queries
这一技巧可以创建自适应的设计,可以根据 viewport 的宽度重写布局的css。

@media screen and (max-width: 560px) {
    #content {
        width: auto;
        float: none;
    }
    #sidebar {
        width: 100%;
        float: none;
    }
}

弹性的图片
为了让图片尺寸变得更为弹性,可以简单的添加 max-width:100% 和 height:auto。

img {
    max-width: 100%;
    height: auto;
    width: auto\9; /* ie8 */
}

弹性的内嵌视频
使用width:100% 和 height:auto,可以让内嵌视频变得更加弹性

.video embed,
.video object,
.video iframe {
    width: 100%;
    height: auto;
}

Webkit字体大小调整
使用-webkit-text-size-adjust:none,在iphone上禁用字体大小调整。

html {
    -webkit-text-size-adjust: none;
}

设置iPhone Viewport 和 Initial Scale
下面的语句实现了在iphone中,使用meta标签设置viewport 和 inital scale。

<meta name="viewport" content="width=device-width; initial-scale=1.0" />

原文地址:http://webdesignerwall.com/tutorials/responsive-design-with-css3-media-queries

评论 ( 15)
  1. 沙发
    微乐 2015-04-12 13:24

    我来了

  2. 板凳
    好广告联盟 2015-04-11 04:24

    会不会对百度这些不友好呢

  3. 地板
    有点蓝 2013-12-06 08:55

    一直也想改造自己的主题来着,不过目前还没研究明白media query到底咋回事。

    • 回复
      andy 2013-12-06 09:07
      @有点蓝 找一个别人的研究下就可以了;基本是content宽度auto,sidebar隐藏,菜单就比较麻烦一点
      • 回复
        有点蓝 2013-12-06 09:21
        @andy 之前我从别人的style.css里扒过一次,放到我主题样式里就不起作用,然后也就没再折腾,代码盲搞这些太辛苦了……
  4. 4 楼
    子痕 2013-10-22 14:36

    响应式的话,不建议使用px来固定尺寸,最好使用百分比,或者em来设定宽度。

  5. 5 楼
    旅行者 2013-08-26 01:40

    正好可用的上

  6. 6 楼
    vfhky 2013-08-18 09:12

    为啥总是国外的css设计做为模板呢……

  7. 7 楼
    Leniy 2013-08-12 01:34

    我的主题就是这种结构

  8. 8 楼
    贝贝卡西 2013-08-09 09:17

    代码还算简洁 测试下

  9. 9 楼
    麦田一根葱 2013-08-09 03:49

    这个不错,赞一个先~ 上午11:49:36

  10. 10 楼
    厦门网站建设 2013-08-08 09:12

    这好东西收了,谢谢博主