rem + vw 【CSS 知识汇点5】

265 阅读3分钟

css 布局方式有很多中,并且实现方法很多。

布局方式

静态布局

使用 px 作为单位

流式布局

宽度使用 % 作为单位,高度使用 px 作为单位

自适应布局

创建多个静态布局,每个静态布局对应一个屏幕分辨率范围,使用 @media 媒体查询来切换多个布局

弹性布局

通常是指 rem 或 em 布局,rem 是相对于 html 元素的 font-size 大小而言的,而 em 是相对于其父元素(非 fint-size 的是相对于自身的 font-size)

基本概念

物理像素

物理像素被称为设备像素,是显示设备中一个最微小的物理部件,每个像素可以根据操作系统设置自己的颜色和亮度。

设备独立像素

设备独立像素也称为密度无关像素,可以认为是计算机坐标系统中的一个点,这个点代表一个可以有程序使用的虚拟像素,然后由相关系统转换成物理像素

css 像素

css 像素是一个抽象的单位,主要用在浏览器上,用来精确度量web页面上的内容。在一般情况下,css 像素称为与设备无关的像素,简称 DIPs

屏幕密度

屏幕密度是指一个设备表面上存在的像素数量,通常以每英寸有多少个像素来计算。

设备像素比

设备像素比 = 物理像素 / 设备独立像素,简称 dpr

rem 单位

rem 就是相对于根元素 html 的 font-size 来做计算

视窗单位

  • vw: 1vw 等于视窗宽度的 1%
  • vh: 1vh 等于视窗高度的 1%
  • vmin:选取 vm 和 vh 中最小的那个
  • vmax:选取 vw 和 vh 中最大的那个

使用 rem 布局的方法

div {
	font-size: 1.2rem; // 只跟跟元素有关
}

事实上,rem 是 px 和 em 间的相对单位折中方案,而且更易于使用。在一般情况下,我们对 font-size 使用 rem,对border 使用px,对padding、margin、border-radius 使用 em,在必要时,申明容器宽度时,使用百分比。

有时候我们还需要内嵌一段脚本去动态计算根元素大小

(function (doc, win) {
	let docEl = doc.documentElement;
    let resizeEvt = 'orientatiomchange' in window ? 'orientationchange' : 'resize';
    let recalc = function() {
    	var clientWidth = docEl.clientWidth;
        if (!clientWidth) return;
        docEl.style.fontSize = 14 * (clientWidth / 320) + 'px'
    }
    if (!doc.addEventListener) return
    win.addEventListener(resizeEvt, recalc, false)
    doc.addEventListener('DOMContentLoaded', recalc, false)
})(document, window)

但是可能会有抖动,并且需要 js 的支持

使用 vw/vh

首先,视窗是指浏览器内部的可视区域大小,也就是 window.innerWidth/window.innerHeight 大小。 一般做法是:根据设计稿的尺寸,转化成 vw 单位。无论文本还是布局高宽、间距都使用 vw

但是没有最小最大的限制,还有些浏览器不支持。

最优做法

最优做法是:搭配 vw 和 rem 1.给根元素大小设置 vw --- 动态改变大小 2. 限制跟元素 font-size 的最大最小值,配合 body 加上最大最小宽度