`
axl234
  • 浏览: 260038 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

通过CSS3 Media Query实现响应式Web设计

    博客分类:
  • css
 
阅读更多

如今的屏幕分辨率,小至320px(iPhone),大到2560px甚至更高(大显示器),变化范围极大。除了使用传统的台式机,用户会越来越多的通过手机、上网本、iPad一类的平板设备来浏览页面。这种情况下,固定宽度的设计方案将会显得越发不合理。页面需要有更好的适应性,其布局结构要做到根据不同的设备及屏幕分辨率进行响应调整。接下来,我们将了解一下怎样通过HTML5和CSS3 Media Queries(媒介查询)相关技术来实现跨设备跨浏览器的响应式Web设计方案。

范例效果预览

首先,我们来看看本篇范例的最终效果演示。打开该页面,拖拽浏览器边框,将窗口慢慢缩小,同时观察页面结构及元素布局是怎样基于宽度变化而自动响应调整的。

html5-css3-responsive-web-design-final-demo

更多范例

我(原文作者)使用media query的方式设计了一些WordPress模板,比如TisaEleminSucoiTheme2FunkiMinblrWumblr等。

概述

我们将范例页面的父级容器宽度设置为固定的980px,对于桌面浏览环境,该宽度适用于任何宽于1024像素的分辨率。我们通过media query来监测那些宽度小于980px的设备分辨率,并将页面的宽度设置由"固定"方式改为"液态",布局元素的宽度随着浏览器窗口的尺寸变化进行调整。当可视部分的宽度进一步减小到650px以下时,主要内容部分的容器宽度会增大至全屏,而侧边栏将被置于主内容部分的下方,整个页面变为单栏布局。

html5-css3-responsive-web-design-design-overview

HTML代码

我们将把注意力集中在页面的主要布局方面,并使用HTML5标签来更加语义化的实现这些结构,包括页头、主要内容部分、侧边栏和页脚:

<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

IE是永恒的话题;对于我们使用的HTML5标签,IE9之前的版本无法提供支持。目前的最佳解决方案仍是通过html5.js来帮助这些旧版本的IE浏览器创建HTML5元素节点。在我们的页面HTML代码中调用该JS文件:

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

CSS

HTML5块级元素样式

首先仍是浏览器兼容问题。虽然我们已经可以在低版本的IE中创建HTML5元素节点,但还是需要在样式方面做些工作,将这些"新"元素声明为块级:

article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {     display: block; }

主要结构的CSS

忽略细节,我们仍是将注意力集中在大问题上。正如在前文"概述"中提到的,默认情况下页面容器的固定宽度为980像素,页头部分(header)的固定高度为160像素;主要内容部分(content)的宽度为600像素,左浮动;侧边栏(sidebar)右浮动,宽度为280像素。

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

截至目前的效果演示

目前我们只是初步完成了页面结构的HTML和默认结构样式,当然,并不包括那些与话题无关的细节实现问题。正如可以在目前的演示中看到的,由于还没有做任何media query方面的工作,页面还不能随着浏览器尺寸的变化而改变布局。

CSS3 Media Query

终于开始说正事儿了。首先我们需要在页面中调用css3-mediaqueries.js文件,来帮助IE8或是之前的版本支持CSS3 media queries:

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

接下来,我们要创建CSS样式表,并在页面中调用:

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

当浏览器可视部分宽度大于650px小于980px时(液态布局)

将pagewrap的宽度设置为95%

将content的宽度设置为60%

将sidebar的宽度设置为30%

@media screen and (max-width: 980px) {
 
    #pagewrap {
        width: 95%;
    }
 
    #content {
        width: 60%;
        padding: 3% 4%;
    }
 
    #sidebar {
        width: 30%;
    }
    #sidebar .widget {
        padding: 8% 7%;
        margin-bottom: 10px;
    }
 
}

当浏览器可视部分宽度小于650px时(单栏布局)

将header的高度设置为auto

将searchform绝对定位在top 5px的位置

将main-nav、site-logo、site-description的定位设置为static

将content的宽度设置为auto(主要内容部分的宽度将扩展至满屏),并取消float设置

将sidebar的宽度设置为100%,并取消float设置

@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;
    }
 
}

当浏览器可视部分宽度小于480px时

480px也就是iPhone横屏时的宽度。当可视部分的宽度小于该数值时,我们需要做以下调整:

禁用html节点的字号自动调整。默认情况下,iPhone会将过小的字号放大,我们可以通过-webkit-text-size-adjust属性进行调整。

将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,来实现其弹性化。对于IE,仍然需要一点额外的工作:

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

弹性内嵌视频

同样的,对于视频,我们也需要做max-width: 100%的设置;但是Safari对embed的该属性支持不是很给力,所以我们以width: 100%来代替:

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

iPhone中的初始化缩放

默认情况下,iPhone中的Safari浏览器会对页面进行自动缩放,以适应屏幕尺寸。我们可以使用以下的meta设置,将设备的默认宽度作为页面在Safari的可视部分宽度,并禁止初始化缩放。

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

最终效果演示

该范例的最终演示正像我们在本文开始时看到的那样;另外记得,在条件允许的情况下,使用各种典型移动设备(iPhone、iPad、Android、Blackberry等)来检验页面的移动版本。

html5-css3-responsive-web-design-final-demo

要点总结

Media Query JavaScript

对于那些尚不支持media query的浏览器,我们要在页面中调用css3-mediaqueries.js

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

CSS Media Queries

实现自适应页面设计的关键之一,就是使用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-text-size-adjust:none禁用iPhone中Safari的字号自动调整

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

页面宽度缩放的问题

<meta name="viewport" content="width=device-width; initial-scale=1.0">
分享到:
评论

相关推荐

    让IE支持CSS3 Media Query实现响应式Web设计,html5.js让IE(包括IE6)支持HTML5元素方法

    微软的最新浏览器IE8及以下IE版本对HTML5标签的支持是有限的,我们可以通过在网页中添加脚本的方式来解决目前IE浏览器对HTML5支持的问题。 让IE(包括IE6)支持HTML5元素,我们需要在HTML头部添加以下JavaScript,...

    让IE支持CSS3 Media Query实现响应式Web设计

    主要是我们将了解一下怎样通过html5和css3 Media Queries(媒介查询)相关技术来实现跨设备跨浏览器的响应式web设计方案

    CSS3MediaQuery实现响应式Web设计(针对不同移动设备宽度)

    接下来,我们将了解一下怎样通过HTML5和CSS3MediaQueries(媒介查询)相关技术来实现跨设备跨浏览器的响应式Web设计方案首先,我们来看看本篇范例的最终效果演示。打开该页面,拖拽浏览器边框,将窗口慢慢缩小,同时...

    响应式web设计

    响应式Web设计(Responsive Web design)的理念是,页面的设计与开发应当根据用户行为以及设备环境(系统平台、屏幕尺寸、屏幕定向等)进行相应的响应和调整。具体的实践方式由多方面组成,包括弹性网格和布局、图片、...

    简要总结CSS编程中的响应式设计

    我保证你通过三步就可以学会响应式设计的基本逻辑和媒体查询(media query)(假设你有基本的CSS知识)。 第一步:Meta标签(看demo)  大部分移动浏览器会把HTML页面缩放成较宽的viewport的宽度,这样内容就可以屏幕上...

    《Sass和Compass设计师指南》_60页抢鲜试读

    一本非常好的SASS入门书籍,是《响应式Web设计:HTML5和CSS3实战》作者Ben Frain的又一力作。作者通过丰富、完整的案例,循序渐进地展示了Sass和Compass的使用方法。既使不懂编程的设计师读完本书也能轻松生成跨...

    疯狂HTML 5+CSS 3+JavaScript讲义(第2版)+源代码

    11.4 media query和响应式布局 317 11.5 本章小结 323 第12章 变形与动画相关属性 324 12.1 CSS 3提供的变形支持 325 12.2 CSS 3新增的3D变换 337 12.3 CSS 3提供的Transition动画 341 12.4 CSS 3提供的...

    响应式布局入门

    CSS3有了个更为实用的 media query。而移动终端的浏览器基本已经完全支持了css3.他可以为你获取各种终端的数据。

    Bootstrap前端框架笔记 +css+html

    Bootstrap 是最受欢迎的 HTML、CSS 和 JS 框架,用于开发响应式布局、移动设备优先的 WEB 项目。Bootstrap 让前端开发更快速、简单。所有开发者都能快速上手、所有设备都可以适配、所有项目都适用。 一个框架、多种...

    200602-ResponsiveWeb:using使用网格系统进行响应式网站实施实践

    项目介绍使用网格系统实现响应式网页技术栈HTML5 CSS3 Media Query00-gitHub 使用gird系统生成的响应页面(12列)gitHub简介页面链接: : 01-皮克斯(20200626) 响应页面使用gird系统制作(12列)Pixar的工作介绍...

    Web前端基础全家桶教程(含HTML、CSS、 HTML5、CSS3)

    本套Web前端基础全家桶教程是全新录制,将前端学习的基础内容融汇为148节课,涵盖了...除此之外,课程涵盖 大量的CSS技巧、动画、交互效果,对传统浮动和定位的布局方式,以及CSS3中的弹性盒和响应式布局都有深入讲解。

    wc-responsive-grid:Web组件,可使用CSS Grid简化响应式内容区域的布局

    wc响应网格Web组件,可使用CSS Grid简化响应式内容区域的布局。 由提供的行为。安装npm i wc - responsive - grid例子&lt; style &gt; : root { --wc-responsive-grid-gap : 2 rem ; } article { width : 85 % ; ...

    基于NodeJS的前后端分离的思考与实践(五)多终端适配

    有如基于浏览器原生 CSS3 Media Query 的响应式设计、基于云端智能重排的「云适配」方案等。本文则主要探讨在前后端分离基础下的多终端适配方案。 关于前后端分离 关于前后端分离的方案,在《基于NodeJS的前后端分离...

    wc-responsive-container:Web组件,允许作者根据包含元素的大小而不是用户视口的大小来控制样式

    wc响应式容器Web组件,允许作者根据包含元素的大小而不是用户视口的大小来控制样式。 基于Philip Walton的使用自定义元素和调整大小观察器。为什么? 如果容器位于会影响容器大小的动态应用程序布局内,例如布局具有...

    instalura

    Módulo01:JAMStack e布局和React... 服务对象渲染器,客户端渲染器和响应式Web打包响应服务器。 Alémda partelógica,vamos estudar bastante sobreestilizaçãoe Responsividade,passando por media-query,CSS

Global site tag (gtag.js) - Google Analytics