前言
说到媒体查询(Media queries),你是不是还停留在:
根据设备宽度提供不同的css,进行自适应布局
顾名思义,媒体查询指的是检测不同的设备媒体,所以它能查询的可不止是设备宽高,还包括更多的设备特性。下面列一些个人觉得比较有用,在项目中可能用得上的特性查询。
width(设备宽度)
这个是我们熟知的和最常用的一个查询条件。通过查询设备的宽度(准确的说是页面的可视化宽度,即window.innerWidth),来调整页面样式,适配不同分辨率的设备。
现在主要的用途就是拿来适配不同分辨率下的PC端页面,因为PC端的分辨率差异比较大,并且通过缩放浏览器窗口大小可以创造各种浏览器比例,所以为了更好的用户体验,可以用这个特性来设置不同的页面布局。
如掘金写的:
@media (max-width: 960px) {
.sidebar[data-v-453a8097] {
display:none
}
.main-area[data-v-453a8097] {
width: 100%
}
.article-area[data-v-453a8097] {
margin-bottom: 0
}
.open-in-app[data-v-453a8097] {
bottom: 6rem
}
}
当浏览器宽度小于960px
的时候,他的侧边栏就会隐藏,内容主题占满浏览器。
可以设置多个断点来处理各种尺寸下任意元素的表现。
掘金:
@media (max-width: 375px) {
.nav-item .search-form .search-input[data-v-1a3f6ed6] {
width:10rem
}
}
@media (max-width: 330px) {
.nav-item.search[data-v-1a3f6ed6] {
display:none
}
.nav-item.search .search-form .search-input[data-v-1a3f6ed6] {
width: 5rem
}
}
除了max-width
之外,还有width
min-width
height(设备高度)
同width,宽度变成高度而已。
orientation (设备旋转方向)
查询设备旋转方向。可以识别设备是处于横屏landscape
还是竖屏portrait
模式。
@media (orientation: landscape) {
body {
flex-direction: row;
}
}
@media (orientation: portrait) {
body {
flex-direction: column;
}
}
如果某些页面对设备的旋转模式有要求,就可以根据这个来判断,比如,当手机竖屏的时候,就显示一个提示信息“请旋转手机已获得更好的体验”,而不需要通过JS来设置。
resolution (设备像素比)
查询设备的设备像素比dpi。dpi越高,屏幕越清晰。
/* 指定的dpi */
@media (resolution: 150dpi) {
p {
color: red;
}
}
/* 最小dpi */
@media (min-resolution: 72dpi) {
p {
text-decoration: underline;
}
}
/* 最大dpi */
@media (max-resolution: 300dpi) {
p {
background: yellow;
}
}
同一张背景图,你可以在不同DPI下设置不同的background-image
,显示不同的清晰度图片,也就是设计稿里面的2x,3x图。
aspect-ratio (宽高比)
检测viewport的宽高比。以前手机的比列多数是4:3,现在多数是21:9,21:10,后面还有会折叠屏,可能接近1:1。
/* 最小宽高比 */
@media (min-aspect-ratio: 8/5) {
div {
background: #9af; /* blue */
}
}
/* 最大宽高比 */
@media (max-aspect-ratio: 3/2) {
div {
background: #9ff; /* cyan */
}
}
/* 明确的宽高比 */
@media (aspect-ratio: 1/1) {
div {
background: #f9a; /* red */
}
}
根据不同的设备比例以及设备尺寸,调整页面布局,以展示更好的视觉效果。可能更适合用在webapp类的产品上。
prefers-color-scheme (配色模式)
探测用户设备的配色方案:(亮色/暗色)。即是否开启系统的暗黑模式,在移动端这个属性非常有用,很多移动端都已经支持暗黑模式,如果我们的页面能适配一个暗黑风格,那会给用户一个非常好的使用体验。
@media (prefers-color-scheme: dark) {
.day.dark-scheme { background: #333; color: white; }
.night.dark-scheme { background: black; color: #ddd; }
}
@media (prefers-color-scheme: light) {
.day.light-scheme { background: white; color: #555; }
.night.light-scheme { background: #eee; color: black; }
}
正常有不同主题的项目都是管理后台类的,操作方式也是用户手动选择,不是很灵活。通过媒体查询,可以直接跟随系统的颜色模式来进行切换,非常人性化。
虽然用户是被动切换的,但是一个开启了暗黑模式的用户怎么会嫌弃暗黑模式的应用呢?当然最好我们同时提供手动切换的功能。
prefers-reduced-motion (动画减弱)
检测用户的系统是否被开启了动画减弱功能。用户为了更好的性能,可能会在系统设置开启类似“关闭不必要动画”的功能,我们可以检测该配置,来去掉页面一些不必要的动画效果。
.animation {
animation: vibrate 0.3s linear infinite both;
}
@media (prefers-reduced-motion: reduce) {
.animation {
animation: none;
}
}
可能很多人都不知道还有这个选项,它是这样设置的:
- 在 GTK/Gnome 中,可以通过 GNOME Tweaks (在“通用”或“外观”菜单中,取决于具体版本) 的配置,设置 gtk-enable-animations 的值为 false。
- 可以在 GTK 3 的配置文件中的 [Settings] 模块下设置 gtk-enable-animations = false。
- 在 Windows 10 中:设置 > 轻松获取 > 显示 > 在 Windows 中显示动画。
- 在 Windows 7 中:控制面板 > 轻松获取 > ?是计算机更易于查看 > 关闭不必要动画。
- 在 MacOS 中:系统偏好 > 辅助使用 > 显示 > 减少运动。
- 在 iOS 上:设置 > 通用 > 辅助性 > 减少运动。
- 在 Android 9+ 上:设置 > 辅助性 > 移除动画。
如果你已经开启了这个功能,上面的代码,你将看不到动画。
这也是一个用户体验的提升。
总结
以上是一些比较实用和常用的媒体查询特性,更多的可以查看文档。
媒体查询如果配合JS
其实能发现更多的可能性。
潜水很久,终于决定开始写东西,会持续把自己的一些经验写出来分享给大家,欢迎一起讨论研究。掘金新人,希望看完文章有启发的同学点赞一波。