CSS3媒体查询与页面自适应

2017年9月,W3C发布媒体查询(Media Query Level 4)候选推荐标准规范,它扩展了已经发布的媒体查询的功能。该规范用于CSS的@media规则,可以为文档设定特定条件的样式,也可以用于HTML、JavaScript等语言。

1、媒体查询基础

媒体查询可以根据设备特性,如屏幕宽度、高度、设备方向(横向或纵向),为设备定义独立的CSS样式表。一个媒体查询由一个可选的媒体类型和零个或多个限制范围的表达式组成,如宽度、高度和颜色。

1.1、媒体类型和媒体查询

CSS2提出媒体类型(Media Type)的概念,它允许为样式表设置限制范围的媒体类型。例如,仅供打印的样式表文件、仅供手机渲染的样式表文件、仅供电视渲染的样式表文件等,具体说明如下表所示:
在这里插入图片描述
通过HTML标签的media属性定义样式表的媒体类型,具体方法如下:

  • 定义外部样式表文件的媒体类型。 <link href="csss.css" rel="stylesheet" type="text/css" media="handheld" />
  • 定义内部样式表文件的媒体类型。 <style type="text/css" media="screen"> ... </style>CSS3在媒体类型的基础上,提出了Media Queries(媒体查询)的概念。媒体查询比CSS2的媒体类型功能更加强大、更加完善。两者的主要区别:媒体查询是一个值或一个范围的值,而媒体类型仅仅是设备的匹配。媒体类型可以帮助用户获取以下数据。
  • 浏览器窗口的宽和高。
  • 设备的宽和高。
  • 设备的手持方向,横向还是竖向。
  • 分辨率。

例如,下面这条导入外部样式表的语句:

    <link rel="stylesheet" media="screen and (max-width: 600px)" href="small.css" />

在media属性中设置媒体查询的条件(max-width: 600px):当屏幕宽度小于或等于600px时,则调用small.css样式表渲染页面。

1.2、使用@media

CSS3使用@media规则定义媒体查询,简化语法格式如下:

    @media [only | not]? <media_type> [and <expression>]* | <expression> [and <expression>]*{/* CSS样式列表 */}

参数简单说明如下:

  • <media_type>:指定媒体类型,具体说明参考上表所示。
  • <expression>:指定媒体特性。放在一对圆括号中,如(min-width:400px)。
  • 逻辑运算符,如and(逻辑与)、not(逻辑否)、only(兼容设备)等。

媒体特性包括13种,接收单个的逻辑表达式作为值,或者没有值。大部分特性接收min或max的前缀,用来表示大于等于或者小于等于的逻辑,以此避免使用大于号(>)和小于号(<)字符。

在CSS样式的开头必须定义@media关键字,然后指定媒体类型,再指定媒体特性。媒体特性的格式与样式的格式相似,分为两部分,由冒号分隔,冒号前指定媒体特性,冒号后指定该特性的值。

【示例1】下面语句指定了当设备显示屏幕宽度小于640px时所使用的样式:

    @media screen and (max-width: 639px) {/*样式代码*/}

【示例2】可以使用多个媒体查询将同一个样式应用于不同的媒体类型和媒体特性中,媒体查询之间通过逗号分隔,类似于选择器分组:

    @media handheld and (min-width:360px),screen and (min-width:480px) {/*样式代码*/}

【示例3】可以在表达式中加上not、only和and等逻辑运算符:

    //下面样式代码将被使用在除便携设备之外的其他设备或非彩色便携设备中@media not handheld and (color) {/*样式代码*/}//下面样式代码将被使用在所有非彩色设备中@media all and (not color) {/*样式代码*/}

【示例4】only运算符能够让不支持媒体查询,但是支持媒体类型的设备,将忽略表达式中的样式。例如:

    @media only screen and (color) {/*样式代码*/}

对于支持媒体查询的设备来说,能够正确地读取其中的样式,仿佛only运算符不存在一样;对于不支持媒体查询,但支持媒体类型的设备(如IE8)来说,可以识别@media screen关键字,但是由于先读取的是only运算符,而不是screen关键字,将忽略这个样式。

提示:媒体查询也可以用在@import规则和标签中。例如:

    @import url(example.css) screen and (width:800px);//下面代码定义了如果页面通过屏幕呈现,且屏幕宽度不超过480px,则加载shetland.css样式表<link rel="stylesheet" type="text/css" media="screen and (max-device-width: 480px)" href="shetland.css" />

1.3、应用@media

【示例1】and运算符用于符号两边规则均满足条件的匹配。

    @media screen and (max-width : 600px) {/*匹配宽度小于等于600px的屏幕设备*/}

【示例2】not运算符用于取非,即所有不满足该规则的均匹配。

    @media not print {/*匹配除了打印机以外的所有设备*/}

注意:not仅应用于整个媒体查询:

    @media not all and (max-width : 500px) {}/*等价于*/@media not (all and (max-width : 500px)) {}/*而不是*/@media (not all) and (max-width : 500px) {}

在逗号媒体查询列表中,not仅会否定它所在的媒体查询,而不影响其他的媒体查询。

如果在复杂的条件中使用not运算符,要显式添加小括号,避免歧义。

【示例3】,(逗号)相当于or运算符,用于两边有一条满足则匹配:

    @media screen , (min-width : 800px) {/*匹配屏幕或者宽度大于等于800px的设备*/}

【示例4】在媒体类型中,all是默认值,匹配所有设备:

    @media all {/*可以过滤不支持media的浏览器*/}

常用的媒体类型有screen匹配屏幕显示器、print匹配打印输出。

【示例5】使用媒体查询时,必须加括号,一个括号就是一个查询:

    @media (max-width : 600px) {/*匹配界面宽度小于等于600px的设备*/}@media (min-width : 400px) {/*匹配界面宽度大于等于400px的设备*/}@media (max-device-width : 800px) {/*匹配设备(不是界面)宽度小于等于800px的设备*/}@media (min-device-width : 600px) {/*匹配设备(不是界面)宽度大于等于600px的设备*/}

提示:在设计手机网页时,应该使用device-width/device-height,因为手机浏览器默认会对页面进行一些缩放,如果按照设备的宽、高进行匹配,会更接近预期的效果。

【示例6】媒体查询允许相互嵌套,这样可以优化代码,避免冗余:

    @media not print {/*通用样式*/@media (max-width:600px) {/*此条匹配宽度小于等于600px的非打印机设备 */}@media (min-width:600px) {/*此条匹配宽度大于等于600px的非打印机设备 */}}

【示例7】在设计响应式页面时,用户应该根据实际需要,先确定自适应分辨率的阀值,也就是页面响应的临界点:

    @media (min-width: 768px){/* >=768px的设备 */}@media (min-width: 992px){/* >=992px的设备 */}@media (min-width: 1200){/* >=1200px的设备 */}

注意:下面样式顺序是错误的,因为后面的查询范围将覆盖前面的查询范围,导致前面的媒体查询失效。

    @media (min-width: 1200){ }@media (min-width: 992px){ }@media (min-width: 768px){  }

因此,当我们使用min-width媒体特性时,应该按从小到大的顺序设计各个阀值。同理如果使用max-width时,就应该按从大到小的顺序设计各个阀值。

    @media (max-width: 1199){/* <=1199px的设备 */}@media (max-width: 991px){/* <=991px的设备 */}@media (max-width: 767px){/* <=768px的设备 */}

【示例8】用户可以创建多个样式表,以适应不同媒体类型的宽度范围。当然,更有效率的方法是将多个媒体查询整合在一个样式表文件中,这样可以减少请求的数量:

    @media only screen  and (min-device-width : 320px)  and (max-device-width : 480px) {/*样式列表 */}@media only screen  and (min-width : 321px) {/*样式列表 */}@media only screen  and (max-width : 320px) {/*样式列表 */}

【示例9】如果从资源的组织和维护的角度考虑,可以选择使用多个样式表的方式实现媒体查询,这样做更高效。

    <link rel="stylesheet" media="screen and (max-width: 600px)" href="small.css" /><link rel="stylesheet" media="screen and (min-width: 600px)" href="large.css" /><link rel="stylesheet" media="print" href="print.css" />

【示例10】使用orientation属性可以判断设备屏幕当前是横屏(值为landscape)还是竖屏(值为portrait)。

    @media screen and (orientation: landscape) {.iPadLandscape {width: 30%;float: right;}}@media screen and (orientation: portrait) {.iPadPortrait {clear: both;}}

不过,orientation属性只在iPad上有效,对于其他可以转屏的设备(如iPhone),可以使用min-device-width和max-device-width变通实现。

【扩展】媒体查询仅是一种纯CSS方式实现响应式Web设计的方法,也可以使用JavaScript库来实现同样的设计。例如,下载css3-mediaqueries.js(http://code.google.com/p/css3-mediaqueries-js/),然后在页面中调用。对于老式浏览器(如IE6、IE7、IE8)可以考虑使用css3-mediaqueries.js兼容。

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

【示例11】演示使用jQuery检测浏览器宽度,并为不同的视口调用不同的样式表。

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script><script type="text/javascript">$(document).ready(function(){$(window).bind("resize", resizeWindow);function resizeWindow(e){var newWindowWidth = $(window).width();if(newWindowWidth < 600){$("link[rel=stylesheet]").attr({href : "mobile.css"});}else if(newWindowWidth > 600){$("link[rel=stylesheet]").attr({href : "style.css"});}}});</script>

2、案例实战

2.1、判断显示屏幕宽度

下面示例演示如何正确使用@media规则,判断当前视口宽度位于什么范围。示例代码如下:

    <style type="text/css">.wrapper {                                 /* 定义测试条的样式 */padding: 5px 10px; margin: 40px;text-align:center; color:#999;border: solid 1px #999;}.viewing-area span {                       /* 默认情况下隐藏提示文本信息 */color: #666;display: none;}/* 应用于移动设备,且设备最大宽度为480px */@media screen and (max-device-width: 480px) {.a { background: #ccc;}}/* 显示屏幕宽度小于等于600px */@media screen and (max-width: 600px) {.b {background: red; color:#fff;border: solid 1px #000;}span.lt600 { display: inline-block; }}/* 显示屏幕宽度介于600~900px */@media screen and (min-width: 600px) and (max-width: 900px) {.c {background: red; color:#fff;border: solid 1px #000;}span.bt600-900 { display: inline-block; }}/* 显示屏幕宽度大于等于900px */@media screen and (min-width: 900px) {.d {background: red;  color:#fff;border: solid 1px #000;}span.gt900 { display: inline-block; }}</style><div class="wrapper a">设备最大宽度为480px。</div><div class="wrapper b">显示屏幕宽度小于等于600px </div><div class="wrapper c">显示屏幕宽度介于600~900px</div><div class="wrapper d">显示屏幕宽度大于等于900px </div><p class="viewing-area"><strong>当前显示屏幕宽度:</strong><span class="lt600">小于等于600px</span><span class="bt600-900">介于600~900px</span><span class="gt900">大于等于900px</span></p>

示例设计当显示屏幕宽度小于等于600px时,则高亮显示<div class="wrapper b">测试条,并在底部显示提示信息:小于等于600px;当显示屏幕宽度介于600~900px时,则高亮显示<div class="wrapper c">测试条,并在底部显示提示信息:介于600~900px;显示屏幕宽度大于等于900px时,则高亮显示<div class="wrapper d">测试条,并在底部显示提示信息:大于等于900px;当设备宽度小于等于480px时,则高亮显示<div class="wrapper a">测试条。
在这里插入图片描述

2.2、设计响应式版式

本案例在页面中设计3个栏目。

  • <div id="main">:主要内容栏目。
  • <div id="sub">:次要内容栏目。
  • <div id="sidebar">:侧边栏栏目。

构建的页面结构如下:

    <div id="container"><div id="wrapper"><div id="main"><h1>水调歌头·明月几时有</h1><h2>苏轼</h2><p>……</p></div><div id="sub"><h2>宋词精选</h2><ul><li>……</li></ul></div></div><div id="sidebar"><h2>词人列表</h2><ul><li>……</li></ul></div></div>

设计页面能够自适应屏幕宽度,呈现不同的版式布局。当显示屏幕宽度在999px以上时,让3个栏目并列显示;当显示屏幕宽度在639px以上、1000px以下时,设计两栏目显示;当显示屏幕宽度在640px以下时,让3个栏目堆叠显示。

    <style type="text/css">/* 默认样式 *//* 网页宽度固定,并居中显示 */#container { width: 960px; margin: auto;}/*主体宽度 */#wrapper {width: 740px; float: left;}/*设计3栏并列显示*/#main {width: 520px; float: right;}#sub { width: 200px; float: left;}#sidebar { width: 200px; float: right;}/* 窗口宽度在999px以上 */@media screen and (min-width: 1000px) {/* 3栏显示*/#container { width: 1000px; }#wrapper { width: 780px; float: left; }#main {width: 560px; float: right; }#sub { width: 200px; float: left; }#sidebar { width: 200px; float: right; }}/* 窗口宽度在639px以上、1000px以下 */@media screen and (min-width: 640px) and (max-width: 999px) {/* 2栏显示 */#container { width: 640px; }#wrapper { width: 640px; float: none; }.height { line-height: 300px; }#main { width: 420px; float: right; }#sub {width: 200px; float: left; }#sidebar {width: 100%; float: none; }}/* 窗口宽度在640px以下 */@media screen and (max-width: 639px) {/* 1栏显示  */#container { width: 100%; }#wrapper { width: 100%; float: none; }#main {width: 100%; float: none; }#sub { width: 100%; float: none; }#sidebar { width: 100%; float: none; }}</style>

当显示屏幕宽度在999px以上时,3栏并列显示,预览效果如下图:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/126838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

兴业银行养老金拉新项目上线啦,地推百搭项目

兴业银行养老金就在 ”聚量推客“ 申请开通 今年最火的银行拉新项目就是养老金的 单价高 数据好 目前开通养老金的银行有 兴业银行养老金拉新 交通银行养老金拉新 工商银行养老金拉新 招商银行养老金拉新 浦发银行养老金拉新 广发银行养老金拉新等。。还有很多都开通了…

Youtube DNN:Deep Neural Networks for YouTube Recommendations

1.介绍 本文主要解决的三个挑战&#xff1a; 大规模的推荐场景&#xff0c;能够支持分布式训练和提供有效率的服务。不断更新的新物料。稀疏的用户行为&#xff0c;包含大量的噪声。 2.推荐系统 文章包含推荐系统的两阶段模型&#xff1a;召回和排序。 召回网络根据用户的历…

三国杀中的概率学问题2——神郭嘉

前言 四年前&#xff0c;我写过一篇博客三国杀中的概率学问题。当时有一条评论&#xff0c;让我算一算神郭嘉慧识的摸牌数。这也是我写这篇博客的动力来源。相比起四年前&#xff0c;我的数学水平渐长&#xff0c;于是想做一些更深入的数学问题。这篇文章将从更加理论的角度来…

密码学基础

密码学总览 信息安全面临的危险与应对这些威胁的密码技术&#xff1a; 关于上图中的威胁&#xff0c;这里在简单的说明&#xff1a; 窃听&#xff1a;指的是需要保密的消息被第三方获取。篡改&#xff1a;指的是消息的内容被第三方修改&#xff0c;达到欺骗的效果。伪装&…

Window下SRS服务器的搭建

---2023.7.23 准备材料 srs下载&#xff1a;GitHub - ossrs/srs at 3.0release 目前srs release到5.0版本。 srs官方文档&#xff1a;Introduction | SRS (ossrs.net) Docker下载&#xff1a;Download Docker Desktop | Docker 进入docker官网选择window版本直接下载。由…

7.多线程之单例模式

单例模式 文章目录 单例模式1. 什么是单例模式2. 饿汉模式3. 懒汉模式3.1 单线程版&#xff1a;3.2 多线程版 1. 什么是单例模式 单例模式是一种设计模式&#xff0c;常见的设计模式还有工厂模式、建造者模式等。 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码…

Vue3前端100个必要的知识点

为什么是必要的&#xff0c;就是这100个知识点学完后&#xff0c;能独立完成一个小项目。最终能得到一个解决方案。也算是前端知识的积累。如果后面有需要的地方可以回来查。100个其实比较多&#xff0c;我会按新手老鸟&#xff0c;大神来分成3个等级&#xff0c;话不多说&…

SQLyog连接数据库报plugin caching_sha2_password could not be loaded......解决方案

问题描述 问题分析 因为MySQL新版默认使用caching_sha2_password作为身份验证的插件&#xff0c;而旧版本使用的是mysql_native_password。当出现plugin caching_sha2_password could not be loaded报错&#xff0c;我们更换为旧版本 如何解决 先使用cmd命令登录MySQL&a…

【IDEA】设置sql提示

第一步&#xff1a;注入SQL语言 1.首先选择任意一条sql语句&#xff0c;右击&#xff0c;选择 ‘显示上下文操作’ 2.选择 ‘注入语言或引用’ 3. 往下翻&#xff0c;找到MySQL 第二步&#xff1a;配置MySQL数据库连接 1.首先点击侧边的数据库&#xff0c;再点击上面的加号 2…

蓝桥杯刷题

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; &#x1f449;&#x1f3fb;最大降雨量 原题链接&#xff1…

前端移动高级web详细解析五

响应式布局方案 媒体查询 Bootstrap框架 01-媒体查询 基本写法 max-width&#xff1a;最大宽度&#xff08;小于等于&#xff09; min-width&#xff1a;最小宽度&#xff08;大于等于&#xff09; 书写顺序 min-width&#xff08;从小到大&#xff09; max-width&…

MySQL数据库入门到精通——运维篇(1)

MySQL数据库入门到精通——运维篇&#xff08;1&#xff09; 1. 日志1.1 错误日志1.2 二进制日志1.3 查询日志1.4 慢查询日志 2. 主从复制2.1 主从复制的概述2.2 主从复制的原理2.3 主从复制的搭建2.3.1 服务器准备2.3.2 主库配置2.3.3 从库配置2.3.4 测试 1. 日志 在任何一种…

python实现MC协议(SLMP 3E帧)的TCP服务端(篇一)

python实现MC协议&#xff08;SLMP 3E帧&#xff09;的TCP服务端是一件稍微麻烦点的事情。它不像modbusTCP那样&#xff0c;可以使用现成的pymodbus模块去实现。但是&#xff0c;我们可以根据协议帧进行组包&#xff0c;自己去实现帧的格式&#xff0c;而这一切可以基于socket模…

记录 vue + vuetify + electron 安装过程

NodeJs 版本&#xff1a; 20 内容来自&#xff1a; Electron Vue.js Vuetify 构建跨平台应用_思月行云的博客-CSDN博客文章浏览阅读61次。Go coding!https://blog.csdn.net/kenkao/article/details/132600542 npm config set registry https://registry.npm.taobao.org np…

【c++|opencv】二、灰度变换和空间滤波---2.直方图和均衡化

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 图像直方图、直方图均衡化 1. 图像直方图 #include <iostream> #include <opencv2/opencv.hpp>using namespace cv; using namespace std;…

Android NDK开发详解之调试和性能分析的系统跟踪概览

Android NDK开发详解之调试和性能分析的系统跟踪概览 系统跟踪指南 “系统跟踪”就是记录短时间内的设备活动。系统跟踪会生成跟踪文件&#xff0c;该文件可用于生成系统报告。此报告有助于您了解如何最有效地提升应用或游戏的性能。 有关进行跟踪和性能分析的全面介绍&#x…

groovy下载与安装

Groovy是一种基于JVM&#xff08;Java虚拟机&#xff09;的敏捷开发语言&#xff0c;它结合了Python、Ruby和Smalltalk的许多强大的特性&#xff0c;Groovy 代码能够与 Java 代码很好地结合&#xff0c;也能用于扩展现有代码。由于其运行在 JVM 上的特性&#xff0c;Groovy也可…

Servlet 初始化参数(web.xml和@WebServlet)

1、通过web.xml方式 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://xmlns.jcp.org/xm…

3-性能分析-android-基于Choreographer渲染机制详解

3-性能分析-android-基于Choreographer渲染机制详解 一:主线程运行机制的本质1> 引入 Vsync 之前2> 引入 Choreographer二: Choreographer 简介1> 从 Systrace 的角度来看 Choreogrepher 的工作流程2> Choreographer 的工作流程三:Choreographer 处理一帧的逻辑…

mysql---索引

概要 索引&#xff1a;排序的列表&#xff0c;列表当中存储的是索引的值和包含这个值的数据所在的行的物理地址 作用&#xff1a;加快查找速度 注&#xff1a;索引要在创建表时尽量创建完全&#xff0c;后期添加影响变动大。 索引也需要占用磁盘空间&#xff0c;innodb表数据…