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.rhkb.cn/news/179336.html

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

相关文章

windows docker desktop 更换镜像 加速

最近 docker hub 访问不了; 经过研究 可以通过添加 代理镜像网址 添加代理服务器的方式 实现完美访问 1添加镜像网站 修改成国内镜像地址就能享受到飞一般的速度&#xff0c;但有一个问题&#xff0c;部分站点镜像不全或者镜像比较老&#xff0c;建议使用多个镜像站。 https…

供应商等级:一级、二级和三级供应商之间有什么区别

作为一名专业采购人员&#xff0c;你知道拥有一个可靠且具有成本效益的供应链有多么重要。确保供应链顺利运行的方法之一就是利用供应商分级。 什么是供应商分级&#xff1f; 供应商分级是根据供应商的绩效和对企业的重要性&#xff0c;对其进行分类的做法。 因此&#xff0c…

计算机毕业设计选题推荐-超市售货微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

有方N58 HTTP POST 请求连接 TDengine

串口调试软件&#xff1a;格西调试精灵 第一步先注册网络获取IP地址 建立PPP连接 ATXIIC1\r PPP链路建立成功&#xff0c;查询IP地址 ATXIIC?\r 设置网络APN ATCREG?\r 运行结果&#xff0c;红线处是获…

深度学习数据集大合集—疾病、植物、汽车等

最近又收集了一大批深度学习数据集&#xff0c;今天分享给大家&#xff01;废话不多说&#xff0c;直接上数据&#xff01; 1、招聘欺诈数据集 招聘欺诈数据集&#xff1a;共收集了 200,000 条数据&#xff0c;来自三个网站。 该数据集共收集了 200.000 条数据&#xff0c;分别…

智慧渔业养殖远程监控解决方案

智慧渔业养殖远程监控解决方案 项目背景 影响水产养殖环境的关键参数就是水温、光照、溶氧&#xff0c;氨氮&#xff0c;硫化物、亚硝酸盐等&#xff0c;但这些关键因素即看不见又摸不着很难准确把握。现有的水产管理是以养殖经验为指导&#xff0c;也就是一种普遍的养殖经验…

MySQL 分组后统计 TopN 思路优化

一、表信息 表结构如下&#xff1a; CREATE TABLE score (id int(11) NOT NULL AUTO_INCREMENT,name varchar(255) DEFAULT NULL,score int(11) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT1746687 DEFAULT CHARSETutf8;使用存储过程生成十万条测试数据&am…

【深度学习】pytorch——Tensor(张量)详解

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ pytorch——Tensor 简介创建Tensortorch.Tensor( )和torch.tensor( )的区别torch.Tensor( )torch.tensor( ) tensor可以是一个数&#xff08;标量&#xff09;、一维数组&#xff08;向量&#xff09;、二维数组&…

2023-macOS下安装anaconda,终端自动会出现(base)字样,如何取消

2023-macOS下安装anaconda&#xff0c;终端自动会出现(base)字样&#xff0c;如何取消 安装后&#xff0c;我们再打开终端&#xff0c;就会自动出现了&#xff08;base&#xff09; 就会出现这样子的&#xff0c;让人头大&#xff0c; 所以我们要解决它 具体原因是 安装了anac…

DDoS类型攻击对企业造成的危害

超级科技实验室的一项研究发现&#xff0c;每十家企业中&#xff0c;有四家(39%)企业没有做好准备应对DDoS攻击&#xff0c;保护自身安全。且不了解应对这类攻击最有效的保护手段是什么。 由于缺乏相关安全知识和保护&#xff0c;使得企业面临巨大的风险。 当黑客发动DDoS攻击…

Spring Boot:构建下一代Java应用的利器

文章目录 什么是Spring Boot&#xff1f;Spring Boot的主要特性1. 自动配置2. 独立性3. 微服务支持4. 生态系统5. Spring生态系统集成 Spring Boot的优势1. 提高开发效率2. 减少样板代码3. 更好的部署和管理4. 多种部署选项5. 微服务支持 如何开始使用Spring Boot1. 安装Spring…

飞致云及其旗下1Panel项目进入2023年第三季度最具成长性开源初创榜单

2023年10月26日&#xff0c;知名风险投资机构Runa Capital发布2023年第三季度ROSS指数&#xff08;Runa Open Source Startup Index&#xff09;。ROSS指数按季度汇总并公布在代码托管平台GitHub上年化增长率&#xff08;AGR&#xff09;排名前二十位的开源初创公司和开源项目。…

Spring Boot Actuator 漏洞利用

文章目录 前言敏感信息泄露env 泄露配置信息trace 泄露用户请求信息mappings 泄露路由信息heapdump泄露堆栈信息 前言 spring对应两个版本&#xff0c;分别是Spring Boot 2.x和Spring Boot 1.x&#xff0c;因此后面漏洞利用的payload也会有所不同 敏感信息泄露 env 泄露配置信…

开发小程序需要多少钱?

随着移动互联网的快速发展&#xff0c;小程序已经成为了企业、个人创业者获取用户、提升品牌影响力的重要工具。然而&#xff0c;对于许多初次接触小程序的人来说&#xff0c;开发小程序需要多少钱&#xff0c;是他们最关心的问题。 首先我们需要明确的是&#xff0c;开发小程…

图论08-图的建模-状态的表达与理解 - 倒水问题为例

文章目录 状态的表达例题1题解1 终止条件&#xff1a;有一个数位为42 状态的改变&#xff1a;a表示十位数&#xff0c;b表示个位数3 其他设置 例题2 力扣773 滑动谜题JavaC 状态的表达 例题1 从初始的(x&#xff0c;y)状态&#xff0c;到最后变成&#xff08;4&#xff0c;&am…

SOLIDWORKS 2024新功能--SOLIDWORKS Electrical篇

SOLIDWORKS Electrical 对齐零部件 在设计 3D 机柜布局时使用对齐零部件时&#xff0c;可以在图形区域中预览更改。这大大减少了在 3D 机柜布局中对齐 SOLIDWORKS 零部件所需的工作量。对齐零部件 PropertyManager 简化并改进了工作流程。 SOLIDWORKS Electrical 更改多个导…

跨境电商须知| 独立站的特点与痛点有哪些?

独立站的特点与痛点有哪些&#xff1f; 无论是做独立站&#xff0c;还是做亚马逊&#xff0c;都有各自的难点。自己做独立站若要在跨境行业长足发展&#xff0c;既要知道独立站有什么特点&#xff0c;要清楚独立站的痛点并一一克服。了解独立站搭建更多 一、独立站的特点 1、…

全球最杰出的大神程序员们(14位)

一、全球杰出的程序员介绍 一起来认识一下全球最杰出的大神程序员们。可惜没看到国人的面孔&#xff01;&#xff08;排名不分先后&#xff09; 1、Jon Skeet 个人名望&#xff1a;程序技术问答网站 Stack Overflow 总排名第一的大神&#xff0c;每月的问答量保持在 425 个左…

uniapp 编译到模拟器(mumu)

一开始我是用逍遥模拟器&#xff0c;但这个玩意突然不好使了&#xff0c;一直加载卡在这页面 1、下载 官网下载&#xff1a;mumu模拟器12 2、打开mumu多开器&#xff0c;在右上角adb查看端口号 3、打开mumu模拟器 4、打开HBuiderX 工具—设置—运行配置 5、配置电脑的系统…