Pix单元在移动响应式布局中的缺点及方案比较(媒体查询、百分比、rem和vw/vh)
在前端开发中,静态网站通常要适应不同分辨率的设备,常用的自适应方案包括媒体查询、百分比、rem 和 vw/vh 等。本文从 px 单位开始,分析 px 在移动布局中的缺点,然后提出几种不同的自适应解决方案。
1. px 和图像端口
在静态网站上,我们经常使用像素(px)作为单位来描述元素的宽度、高度和位置信息。在PC端,普遍认为CSS中1px代表的实际长度是固定的。
px 真的与设备无关并且具有固定的大小(如长度单位米和分米)吗?
答案是否定的。 PC端和移动端的屏幕结果分别如图1.1和图1.2所示。我们在网站上设置的字体大小一致为16px。 ?是 16 像素。显然,在PC端汉字显示正常,但在移动端文字很小,几乎看不见。这说明1px在CSS中并不是一个固定的大小。直观上,我们注意到移动端1px代表的长度更小。结果,文本显示不清晰。
那么CSS中1px的实际长度是由什么决定的呢?
为了澄清这个概念,我们首先介绍像素和图像端口的概念
1。像素
像素是网站布局的基础。一个像素代表计算机屏幕上可以显示的最小区域。像素分为两种:CSS像素和物理像素。
我们在js或者css代码中使用的px单位指的是css像素。物理像素也称为设备像素。它们仅与设备或硬件相关。在屏幕尺寸相同的情况下,设备的密度越高,物理像素就越高。越多。下表显示了 css 像素和物理像素之间的具体区别:
| css 像素 | 是为 Web 开发人员提供的,CSS 中使用的抽象单位,用于表示 |
|---|---|
| 物理像素 | |
| 任何物体上的物理像素的密度设备是固定的 |
那么CSS像素和物理像素的转换比例是多少呢?要弄清楚CSS像素和物理像素之间的转换关系,首先需要了解什么是视口。
2。 Viewport
从广义上讲,视口是指浏览器显示内容的屏幕区域。狭义上的视口包括布局视口、视觉视口和理想视口。由于计算机分辨率通常较高,因此布局视图默认为 980 像素。也就是说,如果没有网页视图设置,PC端的网页将根据布局视图默认显示在移动端。因此,我们可以清楚地看到,当使用默认布局视图时,PC端的root网页在移动端是非常不清楚的。
(2)Visual View(视觉视图)
Visual View 表示浏览器中可见的网站的屏幕区域。用户可以放大和缩小来查看网页的显示内容,从而改变视觉视图。视觉观察口的定义就像拿着放大镜从不同的距离看同一个物体。视觉视图仅与放大镜显示的内容类似,因此视觉视图不会影响布局视图的宽度和高度。
(3) Ideal viewport(理想视图)
理想视图或者应该完整称为“理想布局视图”,在移动设备中指的是设备的分辨率。换句话说,理想的视图或分辨率是基于设备物理像素的最佳“布局视口”。
上面的视口中最重要的是阐明理想视图的概念。移动终端的理想视角或分辨率与物理像素的比例是多少?
为了理清目的和物理像素之间的联系,我们引入设备像素比,用DPR(Device Pixel Ratio)表示,可以写成如下:
1 DPR = 物理像素/分辨率
复制代码在没有缩放的情况下,CSS像素对应于dpr ,即不缩放
1 CSS像素 = 物理像素/分辨率
复制代码另外,移动端在布局中,我们可以通过viewport元标签来控制布局。例如,一般情况下,我们可以使用以下标签来使移动终端处于理想的图像端口。接下来的布局:
<meta id="viewport" name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1; user-scalable=no;">
复制代码上面元描述字段的每个属性的信息如下:
| 属性名称 | 值 | 描述 | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 宽度 | 正整数 | 定义宽度布局视图,单位为像素 高度 定义布局视图的高度,单位为像素,很少使用 | ||||||||||||||||||
| 初始缩放 | [0,10] | 初始缩放,1表示不缩放 | ||||||||||||||||||
最小缩放比例
让我们看一下宽度属性。在移动端设置时,我们将元描述字段中的宽度设置称为device-width,device-width通常表示分辨率的宽度。通过设置宽度=设备宽度,我们将布局视图设置为理想的图像端口。 ?视图通常为 980 像素。在移动端,以iPhone 6为例,分辨率为375*667,这意味着布局的视图理想情况下为375像素。例如,现在我们有一个 750px * 1134px 的视觉草图,那么在 PC 端 CSS 像素可以计算如下: 而在 iPhone 6 上: 也就是说,在 PC 端 CSS 像素可以使用 0.76 个物理像素,而 iPhone 6 上的一个 CSS 像素代表两个物理像素。另外,不同的移动设备具有不同的分辨率,即1个CSS像素可以表示的物理像素是不同的。因此,如果在CSS中只使用px作为长宽单位,结果是无法用样式来实现。两端适配。 2.媒体查询前面我们提到过,css文件中1px所代表的物理像素大小在不同的设备上是不同的。因此,不可能实现每个头多种款式的定制。整合。我们是这样想的: 如果一种风格不够,我们是否可以给每个设备不同的风格,以达到自适应的效果? 答案是肯定的。 @media 媒体查询可用于为不同的媒体类型定义不同的样式。特别是,可以为响应式页面编写多种样式,以达到适应不同屏幕尺寸的效果。示例: 上面的代码通过媒体查询定义了多种样式,并通过最大宽度设置样式生效时的最大分辨率。上面的代码定义了0-320px、320px-550px和550px之间的分辨率~768px和768px-960px显示器设置了不同的背景颜色。 媒体查询可用于通过为不同分辨率的设备编写不同的样式来实现响应式布局。例如,我们可以在不同分辨率的屏幕上设置不同的壁纸。例如,为小屏幕手机设置@2x图像,为大屏幕手机设置@3x图像,可以通过媒体查询轻松完成。 但媒体民意调查的弊端也很明显。如果随着浏览器尺寸的变化需要改变的样式太多,多个样式代码集就非常麻烦。 3。百分比除了使用px函数结合媒体查询来实现响应式布局之外,我们还可以使用百分比单位“%”来实现响应式效果。 例如,当浏览器的宽度或高度发生变化时,可以使用百分比单位,使浏览器组件的宽度和高度随着浏览器的变化而变化,从而产生响应式的效果。 要理解百分比布局,首先要明白一个问题: css子元素的百分比(%)属于谁? 直观的理解,我们可以认为子元素的百分比与主元素成正比,高度百分比与高度成正比,宽度百分比与宽度成正比。这个理解当然是正确的,但是根据CSS盒子模板,除了height和width属性之外,它还有padding、border、margin等属性。那么当这些属性设置为百分比时,它们是基于父元素的属性吗?此外,边框半径和翻译等属性也有百分比。它们有什么关系?下面我们来详细分析一下。 1。百分比的特殊分析(1) 子元素的高度和宽度的百分比 子元素的高度或宽度中使用的百分比是相对于子元素的直接上层元素而言的,宽度是相对的。到主元素的宽度和高度是相对于主元素的高度。示例: 如果设置:.father{ width:200px;高度:100px; } .child{ 宽度:50%;高度:50%;显示的效果为: (2) top and Bottom, left 如果右 子元素的top和bottom设置为百分比,则它们相对于父元素的高度具有直非-静态定位(默认定位)。同样,如果 子元素的左侧和右侧设置为百分比,则它们与放置的主元素(默认位置)的高度成正比。非静态定位(默认定位)父元素的宽度。 显示的效果为:
如果子元素的padding设置为百分比,无论是垂直还是水平,都与直接父元素的宽度成正比。 ,主元素的高度为 None 。 例如: 显示的效果为:
(4) margin 与 padding 类似,margin 也是如此。如果子元素的边距设置为百分比,无论是垂直还是水平,它都是相对于直接父元素的宽度。这里就不具体举例了。 (5) 边界半径 边缘半径不同。如果将边缘半径设置为百分比,则它是相对于其自身宽度的。例如: 设置边框半径为百分比: 显示效果为:
2。百分比单位布局应用百分比单位在布局中应用广泛。这是应用程序。 比如我们要实现一个固定长宽比的矩形,如果我们要实现一个长宽比为4:3的矩形,我们可以基于fill属性来实现,因为padding是垂直的或横向,百分比相同。相对于顶部元素的宽度,我们可以将padding-top设置为百分比,得到一个长宽自适应的矩形: 将样式设置为自适应: 通过设置padding-top:75% ,比例为宽度的75%,所以这就形成了一个长宽高比恒定的矩形。具体效果如下: 3。百分比单位的缺点从上面对百分比单位的介绍,我们不难看出,如果一切都用百分比单位来实现响应式布局,有以下两个明显的缺点: (1)计算困难。如果我们要根据设计草图定义元素的宽度和高度,就必须将其转换为百分比单位。 (2)从1可以看出,如果每个属性都使用百分比,则与父元素关联的属性不是唯一的。例如,width和height是相对于父元素的宽度和高度,而margin和padding是相对于父元素的宽度,无论是垂直还是水平,border-radius是相对于元素本身的等等。可以让我们轻松地使用百分比来使布局问题变得复杂。 4. 自适应场景下的Rem解决方案1.远程单元首先我们来看看什么是远程单元。 rem 是一个灵活的、可扩展的单位,可以转换为像素并显示在浏览器中。与 em 单位不同,rem 单位仅相对于浏览器根元素(HTML 元素)的字体大小,而与嵌套级别无关。默认情况下,html元素的字体大小为16px,因此: 为了使计算更加方便,通常可以将html字体大小设置为: 本例为: 2。通过 rem 实现 响应式布局rem 单位是相对于根元素的 html 字体大小定义的。根元素的字体大小对应于给出一个基准。当页面大小改变时,只需要改变字体大小。 size 值,那么固定单位为 rem 的元素的大小也会随之改变。因此,如果使用 rem 命令实现响应式布局,只需根据视口的大小动态改变字体大小即可。 上面的代码将视图容器分为10份,字体大小用宽度的十分之一来表示。最后,通过在 header 标签中运行这段代码,可以用 1rem 动态确定字体大小的大小,在不同的视觉容器中代表不同的大小,并且使用 rem 固定单位可以实现在不同容器中的自适应布局。 3。 rem2px 和 px2rem如果在响应式布局中使用 rem 单位,则存在单位转换问题。 rem2px 表示从 rem 转换为 px。我不会再谈论这个了。只需用相应的字体说出 rem 即可。大小可以转换为px。更多的应用是px2rem,即从px转换为rem格式。 作为示例给出的视觉草图为 750 像素(物理像素)。如果我们想用rem来表示所有布局单位,一个愚蠢的方法是将所有元素(例如高度和宽度)乘以相应的For比率,现在将视觉草图转换为rem单位,然后以rem单位单独表示。另一个更方便的解决方案是我们在css中仍然使用px元素来描述大小。当你最终编写完css代码后,将css文件中的所有px单位转换为rem单位。 Px2rem 原理也很简单。目标是以 px 为单位预处理 css 文件,并在处理后将所有 px 转换为 rem 单位。可以通过两种方式实现: 1)Webpack加载器格式: 在webpack配置文件中: } 2)使用webpack插件 webpack插件。 ,具体是引入了相应的postcss插件,从设计稿中省去了px到rem的计算。国外一些网站也使用rem单位。这里,使用rem来实现布局的缺陷或者小缺陷是: 在响应式布局中,必须使用js动态控制根元素的font-size。 也就是说,css样式和js代码之间存在一定的联系。并且改变字体大小的代码必须放在css样式之前。 5。通过 vw/vh1 实现适应性。 vw/vh 是什么?CSS3 引入了与视口相关的新单位 vw/vh。 vw表示相对于窗口的宽度,vh表示相对于窗口的高度。除了 vw 和 vh 之外,还有两个相关单位:Vmin 和 vmax。各个单位的特殊含义如下:
|
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网