[CSS] 详细解释 @media 属性与 (max-width:) and (min-width) 之间的关系及用法
详细解释 max-width and min-width 之间的关系及用法
- 前言
- @media 是什么怎么用?
- Question 1: So @media only screen and (max-width: 1068px) 是什么鬼?
- @media 如何使用?
- CSS3 多媒体查询
- 自适应视窗
- 多媒体查询语法
- @media 细致深入理解
- @media 注意事项
- Bootstrap 的 @media 属性写法:
前言
现在 HTML5/CSS3 很流行罢,也是未来时代的趋势。在 HTML5 带来的许多实用功能之后,CSS3也同带来了一些牛逼哄哄的功能呢。
- 动画 animation
- 转化 transform
- 过渡 translation
尽快这已足够让我们兴奋,许多之前必须用 JS 或 JQ 写的效果用 CSS 就能实现,现在几行 CSS3 代码就够了。
@media 是什么怎么用?
苹果官网对 CSS3 @media 的使用:
我第一次看到这个是在 苹果官网 ,大概这样:
DOM 结构代码:
结构大家都懂,但我们能够很明显注意到 class 的区别,只有 promo-title-0/1/2/3 不同。那么,为什么?
我们看到了 promos li 的 css 代码。
max-height: 200px;
overflow: hidden;
以及 .large-3 的代码
width: 25%;
以及 column
position: relative;
z-index: 1;
min-height: 2px;
margin: 0;
padding: 0;
float: left;
CSS 很简单,大家一目了然其作用。将 section 下面的 4个块写成4个 li 同时给个相对定位和左浮动最小高度和Z轴,Yes so easy.
但是按住 Ctrl 同时移动鼠标滚轮放大网页,we will find everthing has changed.
这里的 section 变成了两格占一排,再看样式 large-3 被划上了删除线.
取而代之的是 medium-6 。
width: 50%;
Question 1: So @media only screen and (max-width: 1068px) 是什么鬼?
为什么这时候 @media 下定义的样式让 CSS 发生了变化,从 large-3 变成了 medium-6 那么small-12 会发生什么?
我们再缩小来看一看;
这里 section 变成了一格占一排,之前的 @media only screen and (max-width: 1068px) 变成了 @media only screen and (max-width: 735px) ;再看 class 又由 medium-6 变成了 small-12 。
width: 100%;
于是,我们可以得出以下结论:
- @media only screen and (max-width) 的值改变,则对应 class 改变。
- large-3 是四个 li 的共同样式,值为 width: 25% 。所以 float: left 在一起就是其父元素section#promos.promos.row 的 width: 100% 。
- medium-6 { width: 50% } 则相应的是 每2个 li 左浮动在一起为一行( width: 100% )。
- small-12 { width: 100% } 则一个 li 便左浮动占据一行。
- 所以它的响应式设计思路与 bootstrap 的 Gird System 同样原理。
- 所有的一切都由 @media 控制,针对不同媒体类型(或者说屏幕宽度)自适应采用不同的样式规则。当你重置浏览器大小的过程中,页面会根据浏览器的宽度和高度重新渲染页面。(不明觉厉咯)
@media 如何使用?
通常这种类型的文档在 w3cschool 类型的网站代码属性收集最全最权威,当然还有国内山寨但更强大版 w3cschool.cc 即 菜鸟教程 。
以下内容 据此摘录 与修改,当然为了更便于各位理解。
CSS3 多媒体查询
CSS3 的多媒体查询继承了 CSS2 多媒体类型的所有思想: 取代了查找设备的类型,CSS3 根据设置自适应显示。媒体查询可用于检测很多事情,例如:
- viewport(视窗) 的宽度与高度
- 设备的宽度与高度
- 朝向 (智能手机横屏,竖屏)
- 分辨率
目前很多针对苹果手机,Android 手机,平板等设备都会使用到多媒体查询。
自适应视窗
必须在 中添加一个 标签:
<meta name="viewport" content="width=device-width, initial-scale=1">
代码原意翻译过来既是: 视窗的宽度等于设备宽度,原始比例始终为 1:1 。这样在改变 device-width 的时候任意变化修改都能自适应了。
Bootstrap自适应视窗简介
多媒体查询语法
- 多媒体查询由多种媒体组成,可以包含一个或多个表达式,表达式根据条件是否成立返回 true 或 false 。
- 如果指定的多媒体类型匹配设备类型则查询结果返回 true,文档会在匹配的设备上显示指定样式效果。
- 除非你使用了 not 或 only 操作符,否则所有的样式会适应在所有设备上显示效果。
方法一: 直接写在 CSS 样式中让其根据设备判断:
@mediamediatypeand|not|only (mediafeature) {CSS-Code;
}
方法二: 针对不同的媒体设备外部链入不同的 stylesheets:
<link rel="stylesheet" media="mediatype and|not|only (media feature)" href="mystylesheet.css">
not / only / all
not: not是用来排除掉某些特定的设备的,比如 @media not print(非打印设备)。
only: 用来定某种特别的媒体类型。
对于支持 Media Queries 的移动设备来说,如果存在 only 关键字,移动设备的 Web 浏览器会忽略 only关键字并直接根据后面的表达式应用样式文件。对于不支持 Media Queries 的设备但能够读取 Media Type 类型的 Web浏览器,遇到 only 关键字时会忽略这个样式文件。
all: 所有设备,这个应该经常看到。
多媒体类型 mediatype
值 | 描述 |
---|---|
all | 用于所有多媒体类型设备 |
用于打印机 | |
screen | 用于电脑屏幕,平板,智能手机等。 |
speech | 用于屏幕阅读器 |
多媒体特性 media feature
值 | 描述 |
---|---|
aspect-ratio | 定义输出设备中的页面可见区域宽度与高度的比率 |
color | 定义输出设备每一组彩色原件的个数。如果不是彩色设备,则值等于0 |
color-index | 定义在输出设备的彩色查询表中的条目数。如果没有使用彩色查询表,则值等于0 |
device-aspect-ratio | 定义输出设备的屏幕可见宽度与高度的比率。 |
device-height | 定义输出设备的屏幕可见高度。 |
device-width | 定义输出设备的屏幕可见宽度。 |
grid | 用来查询输出设备是否使用栅格或点阵。 |
height | 定义输出设备中的页面可见区域高度。 |
max-aspect-ratio | 定义输出设备的屏幕可见宽度与高度的最大比率。 |
max-color | 定义输出设备每一组彩色原件的最大个数。 |
max-color-index | 定义在输出设备的彩色查询表中的最大条目数。 |
max-device-aspect-ratio | 定义输出设备的屏幕可见宽度与高度的最大比率。 |
max-device-height | 定义输出设备的屏幕可见的最大高度。 |
max-device-width | 定义输出设备的屏幕最大可见宽度。 |
max-height | 定义输出设备中的页面最大可见区域高度。 |
max-monochrome | 定义在一个单色框架缓冲区中每像素包含的最大单色原件个数。 |
max-resolution | 定义设备的最大分辨率。 |
max-width | 定义输出设备中的页面最大可见区域宽度。 |
min-aspect-ratio | 定义输出设备中的页面可见区域宽度与高度的最小比率。 |
min-color | 定义输出设备每一组彩色原件的最小个数。 |
min-color-index | 定义在输出设备的彩色查询表中的最小条目数。 |
min-device-aspect-ratio | 定义输出设备的屏幕可见宽度与高度的最小比率。 |
min-device-width | 定义输出设备的屏幕最小可见宽度。 |
min-device-height | 定义输出设备的屏幕的最小可见高度。 |
min-height | 定义输出设备中的页面最小可见区域高度。 |
min-monochrome | 定义在一个单色框架缓冲区中每像素包含的最小单色原件个数 |
min-resolution | 定义设备的最小分辨率。 |
min-width | 定义输出设备中的页面最小可见区域宽度。 |
monochrome | 定义在一个单色框架缓冲区中每像素包含的单色原件个数。如果不是单色设备,则值等于0 |
orientation | 定义输出设备中的页面可见区域高度是否大于或等于宽度。 |
resolution | 定义设备的分辨率。如:96dpi, 300dpi, 118dpcm |
scan | 定义电视类设备的扫描工序。 |
width | 定义输出设备中的页面可见区域宽度。 |
至此,我们解释之前 apple 官网 的 Question1 :
@media only screen and (max-width: 1068px)
仅电脑设备中的页面最大可见区域宽度为 1068px 时显示其定义的样式。所以当设备宽度小于 1068px 采用 medium-6 。
@media only screen and (max-width: 735px)
仅电脑设备中的页面最大可见区域宽度为 735px 时显示其定义的样式。所以当设备宽度小于 735px 采用 small-12 。
这个时候小伙伴你也一定机智的想到了如果我想做一个 平板 和 手机之间的 @media 属性怎么办?当然有办法了。 办法就是:
@mediascreen ( max-width: 1068px ) and (min-width: 765px) {CSScode}@mediascreenand (max-width: 640px) and (min-width: 481px){CSScode}
那么屏幕 retina 分辨率怎么办?看看 apple 怎么做:
这是完整代码:
@mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 735px), onlyscreenand (max-width: 735px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 735px) and (min-resolution: 144dpi){}@mediaonlyscreenand (max-width: 735px){}@mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 1068px), onlyscreenand (max-width: 1068px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 1068px) and (min-resolution: 144dpi){}@mediaonlyscreenand (max-width: 1068px){}@mediaonlyscreenand (max-width: 1068px) and (max-width: 735px){}@mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 735px), onlyscreenand (max-width: 735px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 735px) and (min-resolution: 144dpi){}@mediaonlyscreenand (max-width: 735px){}@mediaonlyscreenand (max-width: 1068px) and (max-width: 735px){}@mediaonlyscreenand (max-width: 1068px){}@mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 1068px), onlyscreenand (max-width: 1068px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 1068px) and (min-resolution: 144dpi){}@mediaonlyscreenand (max-width: 1068px){}@mediaonlyscreenand (max-width: 1441px) and (max-width: 735px){}@mediaonlyscreenand (max-width: 1068px) and (max-width: 1441px){}@mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 1441px), onlyscreenand (max-width: 1441px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 1441px) and (min-resolution: 144dpi){}@mediaonlyscreenand (max-width: 1441px){}
是不是很有趣? apple 将设计化简为繁,但这背后的代价却更大。但为了给用户最直观明了和完美的呈现,这些都不足为惧。
但如果你以为 copy 上面代码就够了? Too young too naive! 我们需要学习的还很多,你会发现有时候写入 CSS3 @media 属性没卵用。
比如: Quesition2: -webkit-min-device-pixel-ratio 是个什么鬼?
@media 细致深入理解
不同设备有不同的宽高,不同分辨率,不同的DPI,不同的长宽比,如何区分?如何针对?它们对应的 @media 属性功能怎么写入呢?
上面表格中其实全部有标明方法 但你真的理解了吗?这样更简单一些!
不同的宽高:
width/height 定义输出设备中的页面可见区域宽度/高度。
max/min-width/height 定义输出设备中的页面最大/小可见区域宽度/高度。
device-width/height 定义输出设备的屏幕可见宽/高度。
max/min-device-width/height 定义输出设备的屏幕最大/小可见宽/高度。
不同的分辨率:
resolution 定义设备的分辨率。如:96dpi, 300dpi, 118dpcm
max/min-resolution 定义设备的最大/小分辨率。
不同的长宽比:
aspect-ratio 定义输出设备中的页面可见区域宽度与高度的比率。
device-aspect-ratio 定义输出设备的屏幕可见宽度与高度的比率。
max/min-aspect-ratio 定义输出设备的屏幕可见宽度与高度的最大/小比率。
max/min-device-aspect-ratio 定义输出设备的屏幕可见宽度与高度的最大/小比率。
那么 Question2 -webkit-min-device-pixel-ratio 是个什么鬼?
它得意思是:Gives the number of device pixels per CSS pixel. css px 和物理 px(device px) 之间的比率即设备像素比率。
iphone 的物理分辨率是 320X480,但是呈现的内容却是 640×960,但其实我们设置的 css px 是相对于物理分辨率的,即 320×480,但是因为我们设置的 css px 要显示在更宽阔的 640×960 的内容区域里头,所以10个 css px 在 640×960 的呈现效果就相当于5个 device px 在 320×480 的呈现效果。
所以如果图片得大小是100×100,那么到iphone里头就会被放大2倍,于是图像会变得比以前模糊,通常得解决办法是,用 background-size 设置为50%,以前的一半,然后再在 iphone 放大2倍,等于没变化,恢复到正常效果,不模糊了。
@mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 1441px), onlyscreenand (max-width: 1441px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 1441px) and (min-resolution: 144dpi) {}
则是一种兼容写法, -webkit-min-device-pixel-ratio 跟 min-resolution 意思一致, 我们发现每个逗号间除了 -webkit-min-device-pixel-ratio 唯一的不同是什么?
dppx dpi 单位,所以这里的兼容这是兼容不同的浏览器的计算单位。
设备像素比devicePixelRatio简单介绍
单位 pixel-ratio/dpi/dppx 区别
不同设备 pixel-ratio/dpi/dppx 值的区别
设备兼容 及 浏览器 支持情况区别及简明易懂案例
@media 注意事项
写作顺序问题
这简直是个小技巧,一开始我也十分纳闷。为什么写的有些 @media 没有起作用。原来有这么回事:
我们知道 min-width 表示最小即大于等于, max-width 表示最大即小于等于; 但我们也很清楚 CSS 样式 跟 DOM 结构 跟 JS 一样 从前往后加载,后面重复代码会覆盖之前代码。
那么这样的顺序有问题吗?
/*样式1*/
@media (min-width: 320px) {.container{ width: 92%; margin: 4%; }
}/*样式2*/
@media (min-width:320px) and (max-width: 640px){.container{ width: 86%; margin: 7%; }
}/*样式3*/
@media (max-width: 640px) {.container{ width: 80%; margin: 10%; }
}
会发生什么?
当 device-width <= 640 时 样式3 起作用
当 640 <= device-width <= 321 时 样式2 起作用但无效
当 device-width >= 640 时 样式1 起作用
Question3: 为什么上面代码不起起作用但无效?
min-width:320px 即 width >= 320px
max-width: 640px and min-width: 32px 即 640 <= width <= 320px
max-width: 640px 即 width <= 640px
Answer3:根据 CSS 从上至下执行的规律以及我们的分析:
当视窗宽度大于等于 320px 时候执行样式1,(有效)
当视窗宽度小于等于 640px 大于等于 320px 时执行样式2,有效但无法使用,因为被 样式3 覆盖。( CSS 解析器跟 JS 一样在相同方法上覆盖之前定义的方法 )
当视窗宽度小于等于 640px 时执行样式3。(有效)
解决办法:
调整顺序并适当修改,
当 width <= 320px 时,执行 样式1;
当 640px <= width <= 321px 时,执行 样式2;(给 min-wdith 的值 +1px 以让 devic-width 值等于320时 样式2 不会覆盖 样式1)
当 width >= 641px 时,执行 样式3;
代码如下:
/*样式1*/
@media (max-width: 320px) {.container{ width: 92%; margin: 4%; }
}/*样式2*/
@media (min-width:321px) and (max-width: 639px){.container{ width: 86%; margin: 7%; }
}/*样式3*/
@media (min-width: 640px) {.container{ width: 80%; margin: 10%; }
}
所以是不是很简单?万能了也。任意分辨率混搭啊。
注意事项总结:
1, 适配顺序
max-wdith: number0 小于等于 分辨率从大写到小 如果同一选择器样式在更小分辨率下没有重写则会沿用 CSS中定义的基本样式
mW <= 320; mW <= 480; mW <= 768; mW <= 960; mW <= 1080; mW <= 1280; mW <= 1440; /*@media 则会根据 `` max-width `` 的大小变化从小到小取值 */
(min-width: number1) and (max-width: number2) 大于等于number1 同时满足 小于等于 number2
写完 max-wdith 则开始写其中间值;
number1 必须在 number0 的基础上 +1px 以避免覆盖之前 width <= number0时的样式,
number2 则不要求必须在 number3 的基础上 -1px (因为后面定义的 width >= number3 就算 width 的 number 相等也会根据先后原则覆盖这个样式) 。
min-wdith: number3 大于等于 分辨率从小写到大 如果同一选择器样式在更大分辨率下没有重写则会沿用之前 @media 定义的样式 其次再是 CSS中定义的基本样式
mW >= 1440; mW >= 1280; mW >= 1080; mW >= 960; mW >= 768; mW >= 480; mW >= 320; /*@media 则会根据 `` min-width `` 的大小变化从大到小取值 */
Bootstrap 的 @media 属性写法:
@media (max-width: 767px) {// col-xs
}@media (min-width: 768px) and (max-width: 991px) {// col-sm
}@media (min-width: 992px) and (max-width: 1199px) {// col-md
}@media (min-width: 1200px) {// col-lg
}
apple 的 @media 属性写法 ( 含 Retina ) PS:前文顺序不同 因为其定义的选择器不是同一组 下列代码笔者已经修改
@mediaonlyscreenand (max-width: 1441px){.container::after{ content: "1441"; }
}@mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 1441px), onlyscreenand (max-width: 1441px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 1441px) and (min-resolution: 144dpi){.container::after{ content: "1441 Retina"; }
}@mediaonlyscreenand (min-width: 1068px) and (max-width: 1441px){.container::after{ content: "1068 - 1441"; }
}@mediaonlyscreenand (max-width: 1068px){.container::after{ content: "1068"; }
}@mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 1068px), onlyscreenand (max-width: 1068px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 1068px) and (min-resolution: 144dpi){.container::after{ content: "1068 Retina"; }
}@mediaonlyscreenand (max-width: 1068px) and (min-width: 735px){.container::after{ content: "735 - 1068"; }
}@mediaonlyscreenand (max-width: 735px){.container::after{ content: "735"; }
}@mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 735px), onlyscreenand (max-width: 735px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 735px) and (min-resolution: 144dpi){.container::after{ content: "735 Retina"; }
}@mediaonlyscreenand (max-width: 340px){.container::after{ content: "340"; }
}@mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 340px), onlyscreenand (max-width: 340px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 340px) and (min-resolution: 144dpi){.container::after{ content: "340 Retina"; }
}@mediaonlyscreenand (min-width: 1441px) {.container::after{ content: "1441"; }
}
[CSS] 详细解释 @media 属性与 (max-width:) and (min-width) 之间的关系及用法相关推荐
- CSS中属性个属性值怎么区分,[CSS] 详细解释 @media 属性与 (max
前言 现在 HTML5/CSS3 很流行罢,也是未来时代的趋势.在 HTML5 带来的许多实用功能之后,CSS3也同带来了一些牛逼哄哄的功能呢. 动画 animation 转化 transform 过 ...
- CSS 详细解读定位属性 position 以及参数
Css 详细解读定位属性 position 以及参数 position 定位属性,是CSS中非常重要的属性.除了文档流布局,就是定位布局了.本来我对这个问题没有放在心上,毕竟写了这么多年的css,对p ...
- 引入css的时候 media属性是什么意思?
media 属性规定被链接文档将显示在什么设备上. media 属性用于为不同的媒介类型规定不同的样式. 值 描述 screen 计算机屏幕(默认). tty 电传打字机以及类似的使用等宽字符网格的媒 ...
- python类属性描述_如何描述Python对象,以及属性、标识、类型和值之间的关系?...
虽然可以通过属性访问对象的类型,但它的类型不仅仅是一个属性--该类型定义了对象在拥有任何属性之前是如何创建的.仅凭这个事实,这些语句都不足以描述Python对象. 我这么说:In Python, ev ...
- dedecms切换模板css,DEDECMS的模板的css的详细解释 -电脑资料
有的比较菜鸟的站长们,常常看到模板文件的CSS的代码密密麻麻的,就有点头晕!我在网上找到一位热心的站长给出了一份织梦模板的CSS详解,以下就是代码和代码的解释! /*---------- import ...
- android中 menu的属性详细解释
android中 menu的属性详细解释 <?xml version="1.0" encoding="utf-8"?> <menu xmlns ...
- css 设置段落样式 各种设置方式详细解释
我本来打算告诉你 当你不在我身边的这段日子里 我遇到的所有糟糕事 但最后我只想告诉你 我很想你 设置段落样式 今天我们详细讲讲设置段落样式的方式: 网页的排版离不开对文字段落的设置,这里主要讲述常用的 ...
- 【 CSS 尺寸/宽高 属性 heightwidth 】
CSS 尺寸/宽高 属性 height&width CSS 尺寸/宽高 属性 1. height 属性: 设置 元素的高度 (auto/长度值/ 百分比值) 1.1 max-height 属性 ...
- CSS学习笔记 display属性
CSS学习笔记05 display属性 HTML标记一般分为块标记和行内标记两种类型,它们也称块元素和行内元素. 块元素 每个块元素通常都会独自占据一整行或多整行,可以对其设置宽度.高度.对齐等属性, ...
- 用css的animation动画属性来实现一个H5场景动态电子邀请函
接触css的animation 也有一段时间,经常在朋友圈会看到一些很漂亮的电子邀请函,刚开始以为是视频,后来发现原来是用css的animation来实现的.经过分析,其实是利用css的animati ...
最新文章
- SQL语句中不同的连接JOIN
- 如何在JavaScript中验证电子邮件地址
- linux配置caffe环境,最全caffe安装踩坑记录(Anaconda,nvidia-docker,linux编译)
- Oracle ORA-04031 错误 说明
- html请求接口_通用网关接口-FastCGI介绍
- 08_JS工厂方法和构造函数
- html 12306页面实现,jQuery模拟12306城市选择框功能简单实现方法示例
- spring-cloud-starter-openfeign使用详解
- yum安装软件提示Another app is currently holding the yum lock
- mouseover显示层mouseout隐藏层,并且在鼠标放上层时显示层【原】
- 易进难出,“Vim 退出” 难住百万程序员
- 数模电路基础知识 —— 4. 常见电路符号说明(二极管)
- Pandas和Matplotlib用excel数据画双y轴折线图
- 1024程序员节节日快乐
- 大一C语言总结贴(持更) Part 10 随机步法
- KT148A语音芯片SOP8封装直驱扬声器内置420秒语音空间,一线控制,可重复烧录。用户可以自己更换声音
- 3D云打印系统OctoPrint,中文化详细图文教程
- 记一次生产上线的问题
- 在线公开课 | 教你如何自行搭建一个威胁感知大脑?
- 英伟达发布ChatGPT专用GPU,性能提升10倍,还推出云服务,普通企业也能训练LLM...
热门文章
- 关于vs2017如何配置和运行龙书DX9案例
- cache log:minzip: zlib inflate call failed (zerr=-3)
- java numberformat 方法_java.text.NumberFormat使用方法
- Virtualbox安装Debian 安装VBoxGuestAdditions增强工具
- 概率论与数理统计浙大第五版 第四章 部分习题
- python爬虫微博24小时热搜_GitHub - Writeup007/weibo_Hot_Search: 微博爬虫:每天定时爬取微博热搜榜的内容,留下互联网人的记忆。...
- 《HBase权威指南》读书笔记6:第六章 可用客户端
- 17 张程序员壁纸推荐
- 哈理工OJ 1391 Orz odd(规律【没证出来】)
- 计算机科技想象作文600字,科技想象作文600字四篇