篇章 | 知识点 |
---|---|
CSS进阶之形变与动画 (一) | transform、垂直居中总结、transition动画、animation动画、vertical-align |
CSS进阶之预处理语言之less (二) | Easy less插件、认识less、注释、计算方式、嵌套、变量的定义导入less文件、从less导出css样式的路径 |
CSS进阶之grid网格布局 (三) | 关于grid布局、grid-container属性、grid-items属性 |
CSS进阶之移动端适配 (四) | 媒体查询、CSS常见单位、深入理解pixel、DPR、PPI、浏览器视口Viewport、移动端适配rem方案、移动端适配vw方案 |
CSS进阶之额外内容补充 (五) | HTML5新增、CSS函数补充、BFC详解 |
媒体查询: 是一种提供给开发者
针对不同设备需求
进行定制化开发
的一个接口。可以让我们根据设备的类型
(比如:屏幕设备、打印机设备)或者特定的特性
(比如屏幕的宽度)来修改页面
媒体查询的使用方式:
@media
或@import
使用不同的CSS规则/* @import是可以和媒体查询结合来使用 */
@import url(./css/body_bgc.css) (max-width: 800px);
/* @media 设置媒体特性来使用 */
@media (max-width: 800px) {
body {
background-color: orange;
}
}
/* @media 设置多个媒体特性需要加逻辑运算符来使用 */
@media (min-width: 500px) and (max-width: 800px) {
body {
background-color: orange;
}
}
/* @media 设置媒体类型来使用 */
@media screen {
}
media属性
给
前面编写的CSS中,我们经常会使用px来表示一个长度(大小),比如font-size设置为18px,width设置为100px。
绝对长度单位
(Absolute length units)相对长度单位
(Relative length units)下图举例了一些常用的相对长度单位,特别是红框的单位是需要牢记于心的。
.container {
font-size: 15px;
}
.box {
/* font-size: 20px; */
/* 如果自己没有设置, 那么会继承父元素的font-size */
/*
如果font-size中有写em单位, 可以理解成相对于父元素
但是更准确的理解依然是相对于自己的
*/
font-size: 1em;
/* 1.em: 相对自己的font-size */
width: 10em;
height: 5em;
background-color: orange;
}
html {
font-size: 1.5px;
}
.box {
width: 100rem;
height: 100rem;
font-size: 20rem;
background-color: orange;
}
/* body {
margin: 0;
padding: 0;
} */
.box {
width: 10vw;
height: 10vh;
background-color: orange;
}
px是pixel单词的缩写
,翻译为像素
。其中,pixel的pix为picture图片的常用简写
,el表示element元素
,像素即画像元素之意有时亦被称为pel(picture element)
像素是影响显示的基本单位。(比如屏幕上看到的画面、一幅图片)
这里我们要深入到不同的像素概念中,来理解CSS中的pixel到底代表什么含义。
物理像素
(也称之为设备像素)逻辑像素
(也称之为设备独立像素)CSS像素
物理像素 即设备像素
显示器上的真实像素
,每个像素的大小是屏幕固有的属性,屏幕出厂以后就不会改变
了显示器或者手机的时候
,提到的设备分辨率就是设备像素的大小
iPhone X的分辨率 1125x2436,指的就是设备像素
;设备独立像素,也叫逻辑像素
面向开发者
我们使用设备像素显示一个100px的宽度
,那么在不同屏幕上显示效果会是不同的
;针对不同的屏幕
很难进行较好的适配,编写程序必须了解用户的分辨率
来进行开发操作系统为开发者进行抽象,提供了逻辑像素的概念
;操作系统上是以1920x1080设置的显示分辨率
,那么无论你购买的是2k、4k的显示器
,对于开发者来说,都是CSS像素:CSS中我们经常使用的单位也是pixel,它在默认情况下等同于设备独立像素(也就是逻辑像素)
;毕竟逻辑像素才是面向我们开发者的;
我们可以通过JavaScript中的screen.width和screen.height获取到电脑的逻辑分辨率
DPR:Device Pixel Ratio 设备像素比
PPI(了解):Pixels Per Inch 每英寸像素
视口的概念:在一个浏览器中,我们可以看到的区域就是视口(viewport
),我们说过fixed就是相对于视口来进行定位的.
不需要对视口进行区分
,因为我们的布局视口和视觉视口是同一个
移动端的网页窗口往往比较小
,我们可能会希望一个大的网页在移动端可以完整的显示
,所以在默认情况下,移动端的布局视口是大于视觉视口的
;在移动端,我们可以将视口划分为三种情况:
布局视口
(layout viewport)视觉视口
(visual layout)理想视口
(ideal layout)显示在可见区域的这个视口,就是视觉视口(visual viewport)
。理想视口
通过meta设置布局视口的宽度:
"viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
同样适用于移动端开发
;因为目前移动端设备较多,如果想让一个页面真正适配于移动端,我们最好多了解一些移动端的知识并对其进行一些适配
。原生App开发
(iOS、Android、RN、uniapp、Flutter等)小程序开发
(原生小程序、uniapp、Taro等)Web页面
(移动端的Web页面,可以使用浏览器或者webview浏览)自适应
:根据不同的设备屏幕大小来自动调整尺寸、大小;响应式
:会随着屏幕的实时变动
而自动调整,是一种更强的自适应;.pxToRem(@px) {
result: 1rem * (@px / 37.5);
}
.box {
width: .pxToRem(100)[result];
height: .pxToRem(100)[result];
background-color: orange;
}
p {
font-size: .pxToRem(14)[result];
}
媒体查询来设置不同尺寸范围内的屏幕html的font-size尺寸
需要针对不同的屏幕编写大量的媒体查询
动态改变尺寸,不会实时的进行更新
,只是一个个区间 @media screen and (min-width: 320px) {
html {
font-size: 20px;
}
}
@media screen and (min-width: 375px) {
html {
font-size: 24px;
}
}
@media screen and (min-width: 414px) {
html {
font-size: 28px;
}
}
@media screen and (min-width: 480px) {
html {
font-size: 32px;
}
}
.box {
width: 5rem;
height: 5rem;
background-color: orange;
}
font-size的大小
,并且设置到html
上页面的实时改变
,并且重新设置font-size的大小到html
上; // 获取所有html元素
const htmlEl = document.documentElement
// 375px -> 16px
// 320px -> 12px
// 我们需要动态的改变字体大小,因此需要获取网页的宽度
// 给window添加监听事件
window.addEventListener("resize", function () {
// 拿到客户端的宽度
const htmlWidth = htmlEl.clientWidth
// 将宽度分成10份
const htmlFontSize = htmlWidth / 10
console.log(htmlFontSize)
// 将值给到html的font-size
htmlEl.style.fontSize = htmlFontSize + "px"
})
(function flexible (window, document) {
var docEl = document.documentElement
var dpr = window.devicePixelRatio || 1
// adjust body font size
function setBodyFontSize () {
if (document.body) {
document.body.style.fontSize = (12 * dpr) + 'px'
}
else {
document.addEventListener('DOMContentLoaded', setBodyFontSize)
}
}
setBodyFontSize();
// set 1rem = viewWidth / 10
function setRemUnit () {
var rem = docEl.clientWidth / 10
docEl.style.fontSize = rem + 'px'
}
setRemUnit()
// reset rem unit on page resize
window.addEventListener('resize', setRemUnit)
window.addEventListener('pageshow', function (e) {
if (e.persisted) {
setRemUnit()
}
})
// detect 0.5px supports
if (dpr >= 2) {
var fakeBody = document.createElement('body')
var testElement = document.createElement('div')
testElement.style.border = '.5px solid transparent'
fakeBody.appendChild(testElement)
docEl.appendChild(fakeBody)
if (testElement.offsetHeight === 1) {
docEl.classList.add('hairlines')
}
docEl.removeChild(fakeBody)
}
}(window, document))
/*
rem:
1> 动态的设置html的font-size
font-size: 视口的宽度 / 10
2> 换算成rem的单位
*/
/* html {
font-size: 10vw;
} */
/*
1> 动态的设置html的font-size
font-size: 视口的宽度 / 100 -> 1vw
*/
.box {
width: 26.667vw;
height: 26.666vw;
background-color: orange;
}