媒体查询是一种提供给开发者针对不同设备
需求进行定制化开发的一个接口
。
你可以根据设备的类型(比如屏幕设备、打印机设备)或者特定的特性(比如屏幕的宽度)来修改你的页面。
媒体查询的使用方式主要有三种:
比较常用的是通过 @media
来使用不同的CSS规则,目前掌握这个即可;
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<style>
/* 媒体查询方式一 使用@import */
/* @import url(./css/body.css) (max-width: 500px); */
style>
<script>
// 媒体查询方式三:使用matchMedia函数
var mediaQueryList = window.matchMedia("(max-width: 600px)");
mediaQueryList.addEventListener("change", function(a, b){
if (a.matches) {
document.body.style.backgroundColor = '#ccc';
} else {
document.body.style.backgroundColor = 'transparent';
}
})
script>
head>
<body>
body>
html>
在使用媒体查询时,你必须指定要使用的媒体类型。
常见的媒体类型值如下:
all
:适用于所有设备。print
:适用于在打印预览模式下在屏幕上查看的分页材料和文档。screen
(掌握):主要用于屏幕。speech
:主要用于语音合成器。被废弃的媒体类型:
媒体特性(Media features)描述了 浏览器
、输出设备
,或是预览环境
的具体特征;
表达式
;必须用括号括起来
;媒体查询的表达式最终会获得一个Boolean值,也就是真(true)或者假(false)。
如果有多个条件,我们可以通过逻辑操作符联合复杂的媒体查询:
and
:and 操作符用于将多个媒体查询规则组合成单条媒体查询not
:not运算符用于否定媒体查询,如果不满足这个条件则返回true,否则返回false。only
:only运算符仅在整个查询匹配时才用于应用样式。比如下面的媒体查询,表示:屏幕宽度大于500,小于700的时候,body背景颜色为红色;
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<style>
/*
320~375之间 font-size: 15px;
375~414之间 font-size: 18px;
414~480之间 font-size: 21px;
大于480px font-size: 24px
*/
/* @media (min-width: 320px) and (max-width: 375px) {
.box { font-size: 15px; }
}
@media (min-width: 375px) and (max-width: 414px) {
.box { font-size: 18px; }
}
@media (min-width: 414px) and (max-width: 480px) {
.box { font-size: 21px; }
}
@media (min-width: 480px) {
.box { font-size: 24px; }
} */
/* CSS层叠性 */
@media (min-width: 320px) {
.box { font-size: 15px; }
}
@media (min-width: 375px) {
.box { font-size: 18px; }
}
@media (min-width: 414px) {
.box { font-size: 21px; }
}
@media (min-width: 480px) {
.box { font-size: 24px; }
}
style>
head>
<body>
<div class="box">
我是box
div>
body>
html>
前面编写的CSS中,我们经常会使用px来表示一个长度(大小),比如font-size设置为18px,width设置为100px。
px 是一个长度(length)单位,事实上CSS中还有非常多的长度单位。
整体可以分成两类:
绝对长度
单位(Absolute length units);
相对长度
单位(Relative length units);
绝对单位:
相对长度单位
仔细的规划
,您可以使文本或其他元素的大小与页面上的其他内容相对应;前面我们已经一直在使用px单位了,px是pixel单词的缩写,翻译为像素。
那么像素到底是什么呢?
100个pixel到底是多少呢?
这里我们要深入到不同的像素概念中,来理解CSS中的pixel到底代表什么含义。
像素单位常见的有三种像素名称:
设备像素,也叫物理像素。
设备独立像素,也叫逻辑像素。
CSS像素
我们可以通过 JavaScript 中的screen.width
和screen.height
获取到电脑的逻辑分辨率:
DPR:device pixel ratio
window.devicePixelRatio
获取到当前屏幕上的DPR值;PPI(了解):每英寸像素(英语:Pixels Per Inch,缩写:PPI)
移动互联网的快速发展,让人们已经越来越习惯于使用手机来完成大部分日常的事务。
移动端开发目前主要包括三类:
因为目前移动端设备较多,所以我们需要对其进行一些适配。
这里有两个概念:
在前面我们已经简单了解过视口的概念了:
可以看到的区域
就是视口(viewport);fixed
就是相对于视口来进行定位的;布局视口
和视觉视口
是同一个;但是在移动端,不太一样,你布局的视口和你可见的视口是不太一样的。
所以在移动端,我们可以将视口划分为三种情况:
这些概念的区分,事实上来自ppk,他也是对前端贡献比较大的一个人(特别是在移动端浏览器)
默认情况下,一个在PC端的网页在移动端会如何显示呢?
我们相对于980px布局的这个视口,称之为布局视口(layout viewport);
在Chrome上按shift+鼠标左键可以进行缩放。
如果所有的网页都按照980px在移动端布局,那么最终页面都会被缩放显示。
理想视口(ideal viewport):
移动端的屏幕尺寸通常是非常繁多的,很多时候我们希望在不同的屏幕尺寸上显示不同的大小;
padding、margin、border、left,甚至是font-size
等等;这个时候,我们可能可以想到一些方案来处理尺寸:
rem单位是相对于html元素的font-size
来设置的,那么如果我们需要在不同的屏幕下有不同的尺寸,可以动态的修改html的 font-size 尺寸。
比如如下案例:
这样在开发中,我们只需要考虑两个问题:
方案一:媒体查询
方案二:编写js代码
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<style>
body {
margin: 0;
padding: 0;
}
.box {
width: 6.25rem;
height: 6.25rem;
background-color: #ccc;
}
style>
head>
<body>
<div class="box">吃饭睡觉阿斗都div>
<script>
var htmlEl = document.documentElement;
function setRemUnit() {
var htmlFontSize = htmlEl.clientWidth / 46.875;
htmlEl.style.fontSize = htmlFontSize + "px";
console.log(htmlFontSize);
}
setRemUnit();
window.addEventListener("resize", function () {
setRemUnit();
})
script>
body>
html>
方案三:lib-flexible 库
方案一:手动换算
方案二:less/scss函数
方案三:postcss-pxtorem(后续学习)
方案四:VSCode插件
在flexible GitHub上已经有写过这样的一句话:
由于viewport单位得到众多浏览器的兼容,lib-flexible这个过渡方案已经可以放弃使用,不管是现在的版本还是以前的版本,都存有一定的问题。建议大家开始使用viewport来替代此方。
所以它更推荐使用viewport的两个单位vw、vh 。
vw的兼容性如何呢?
rem事实上是作为一种过渡的方案,它利用的也是vw的思想。
vw相比于rem的优势:
vw 我们只面临一个问题,将尺寸换算成vw的单位即可;
所以,目前相比于rem,更加推荐大家使用 vw(但是理解rem依然很重要)
方案一:手动换算
比如有一个在375px屏幕上,100px宽度和高度的盒子;
我们需要将100px转成对应的vw值;
100/3.75=26.667,其他也是相同的方法计算即可;
方案二:less/scss函数
方案三:postcss-px-to-viewport-8-plugin(后续学习)
方案四:VSCode插件