什么是物理像素、虚拟像素、逻辑像素、设备像素,什么⼜是
PPI,DPI,DPR和DIP
什么是物理像素、虚拟像素、逻辑像素、设备像素,什么⼜是 PPI, DPI, DPR 和 DIP?有关 viewport 以及苹果安卓设备上的页⾯呈现为什么效果不⼀样,⼜有哪些⽅法去改变和统⼀呢?⽹络上有很多资源对这些知识点进⾏了介绍,但是查看之后我发现⼤都⽐较零散且阅读顺序容易让新⼈疑惑,在这⾥我尝试根据⼏篇⽂章糅合了⼀个循序渐进的知识点整理。在正式开始介绍之前,我们先集中看看⼏个基本概念。
设备像素(device pixel, dp): ⼜称为物理像素。指设备能控制显⽰的最⼩物理单位,意指显⽰器上⼀个个的点。从屏幕在⼯⼚⽣产出的那天起,它上⾯设备像素点就固定不变了,单位 pt。pt 在 css 单位中属于真正的绝对单位,1pt = 1/72(inch), inch及英⼨,⽽1英⼨等于2.54厘⽶。所以设备像素的特点就是⼤⼩固定,不可变。⽐如 iPhone 5 的分辨率为 640 x 1136px.
CSS像素(css pixel, px): ⼜称为虚拟像素,也可以理解为直觉像素。CSS 像素是 Web 编程的概念,指的是 CSS 样式代码中使⽤的逻辑像素。在 CSS 规范中,长度单位可以分为两类,绝对(absolute)单位以及相对(relative)单位。px 是⼀个相对单位,相对的是前⾯所说的设备像素(device pixel)。⽐如 iPhone 5 的 CSS 像素数为 320 x 568px.攀岩技巧
等风来
像素概念汇总
前⾯说到的 px 相对单位指的是图像显⽰的基本单元,它既不是⼀个确定的物理量,也不是⼀个点或者⼩⽅块,⽽是⼀个抽象概念。刚刚提到了图像显⽰的基本单元,这个东西在不同设备上⼜是不⼀样的,例如显⽰器上的物理像素指的是显⽰器的点距,⽽打印机的物理像素则指的是打印机的墨点。
作为⼀个抽象概念,CSS 像素⼜具有两个⽅⾯的相对性,即:
在同⼀个设备上,每1个 CSS 像素所代表的设备像素是可以变化的(即CSS像素的第⼀⽅⾯的相对性);
在不同的设备之间,每1个 CSS 像素所代表的设备像素是可以变化的(即CSS像素的第⼆⽅⾯的相对性);
所以,CSS中的1px(CSS像素可变)!== 设备的1px(设备像素不可变)。
CSS 像素的真正含义
按照 CSS 规范的定义,CSS 中的 px 是⼀个相对长度,它相对的,是 viewing device 的分辨率。这个 viewing device,通常就是电脑显⽰器。典型的电脑显⽰器的分辨率是96DPI,也就是1像素为1/96
英⼨(实际上,假设我们的显⽰器分辨率都与物理分辨率⼀致,⽽液晶点距其实是0.25mm到0.29mm之间,所以不太可能是正好1/96英⼨,⽽只是接近)。
⼀般来说,px 就是对应设备的物理像素,然⽽如果输出设备的解析度与电脑显⽰器⼤不相同,输出效果就会有问题。例如打印机输出到纸张上,其解析度⽐电脑屏幕要⾼许多,如果不缩放,直接使⽤设备的物理像素,那电脑上的照⽚由 600DPI 的打印机打出来就⽐⽤显⽰器看⼩了约6倍。
由于不同的物理设备的物理像素的⼤⼩是不⼀样的,所以 CSS 认为浏览器应该对 CSS 中的像素进⾏调节,使得浏览器中 1个 CSS 像素的⼤⼩在不同物理设备上看上去⼤⼩总是差不多,⽬的是为了保证阅读体验的⼀致。为了达到这⼀点,浏览器可以直接按照设备的物理像素⼤⼩进⾏换算,⽽ CSS 规范中使⽤参考像素来进⾏换算。
⼀个参考像素即为从⼀臂之遥看解析度为 96DPI 的设备输出(即1英⼨96点)时,1点(即1/96英⼨)的视⾓。它并不是1/96英⼨长度,⽽是从⼀臂之遥的距离处看解析度为 96DPI 的设备输出⼀单位(即1/96英⼨)时视线与⽔平线的夹⾓。通常认为常⼈臂长为28英⼨,所以它的视⾓是: (1/96)in / (28in * 2 * PI / 360deg) = 0.0213度。如下图是⼀个⽰意图:
对于⼈来说,眼睛看到的⼤⼩取决于可视⾓度。⽽可视⾓度取决于物体的实际⼤⼩以及物体与眼睛的距离。10⽶远处⼀个1⽶见⽅的东西,与1⽶远处的10厘⽶见⽅的东西,看上去的⼤⼩差不多是⼀样的,
超悲伤网名
所谓⼀叶障⽬不见泰⼭,讲的就是这个常识。
左边的屏幕(可以认为是电脑屏幕)的典型视觉距离是71厘⽶即28英⼨,其1px对应了0.28mm;⽽右边的屏幕(可以认为是你的42⼨⾼清电视)的典型视觉距离是3.5⽶即120英⼨,其1px对应1.3mm。42⼨的1080p电视,分辨率是1920*1080,则其物理像素只有0.5mm左右。
综上,px 是⼀个相对单位,⽽且在特定设备上总是⼀个近似值(原则是尽量接近参考像素)。
然⽽,如果你把绝对单位理解为对输出效果的绝对掌控,事情却⼤相径庭。就⽹页输出的最主要对象——电脑屏幕来说,px 可被视为⼀个基准单位——与桌⾯分辨率⼀致,如果是液晶屏,则⼏乎总是与液晶屏物理分辨率⼀致——也就是说⽹页设计者设定的1px,就是“最终打开这个⽹页的⽤户在显⽰器上看到的1个点距”!反倒是那些绝对单位,其实⼀点也不绝对。
那么 px 都会受哪些因素的影响⽽变化?
每英⼨像素(pixel per inch, ppi/PPI): 它表⽰的是每英⼨所拥有的像素(pixel)数⽬,更确切的说法应该是像素密度,放到显⽰器上说的是每英⼨多少物理像素及显⽰器设备的点距。数值越⾼,代表显⽰屏能够以越⾼的密度显⽰图像。
设备像素⽐(device pixel ratio, dpr/DPR): 它描述的是未缩放状态下,设备像素和 CSS 像素的初始⽐
例关系,也可以解释为默认缩放⽐例。如何理解这个概念呢?通俗来说,它是指在开发中1个 CSS 像素占⽤多少设备像素,如dpr=2代表1个 CSS 像素⽤2x2个设备像素来绘制,所以,可以理解为 1px由多少个设备像素组成
DPI: 每英⼨多少点。
当⽤于描述显⽰器时,我们可以吧 ppi 和 dpi 认为是同⼀个概念。那么 ppi 和 dpr 到底是什么关系呢? ppi ⽤作显⽰设备的⼯业标准,业界⼈⼠⽤ ppi 的值来衡量⼀个屏幕是否为⾼清屏,然后根据得到的密度分界来获得此时对应的 dpr 值,也即默认缩放⽐例。 dpr 和 ppi 相关,⼀般 dpr 为 ppi/160 的整数倍,如下所⽰:
| 项名 | ldpi | mdpi | hdpi | xhdpi | |---| ----- | -------- | ---------- | |密度分界(密度值)|120|160|240|320| |屏幕尺⼨(分辨
折纸龙爪
率)|240×320|320×480|480×800|640×960| |默认缩放⽐例|0.75|1.0|1.5|2.0|
了解了这两个概念后,我们可以来说说导致 CSS 中 px 变化的因素了。
像素密度:从 iPhone4 开始,苹果推出了 Retina 屏,分辨率提⾼了⼀倍(640*960),⽽屏幕尺⼨却没变。这时⼀个css像素=2个设备像素(换算公式为1px = (dpr)^2 * 1dp, 必须让css中的1px代表更多
的设备像素,才能让1px的东西在屏幕上的⼤⼩与那些低分辨率的设备差不多,否则会因太⼩⽽看不清),即 DPR=2,⽰意图如下:
缩放操作:缩放也会引起 css 中 px 的变化。放⼤页⾯到200%,字体⼤⼩与元素宽度的像素值不变,只是css的1px代表设备像素中的4px,宽⾼都是200%,DPR增加了。此时,获取screen.width值不变,⽽window.innerWidth/Height值(visual viewport)变成原来的⼀半。缩放值越⼤,当前 viewport 宽度会越⼩。
如何理解上⾯说到的缩放呢?放⼤1倍,原来 1px 的东西变成 2px,但 1px 变为 2px 并不是把原来的 320px 变为 640px,⽽是在实际宽度不变的情况下,1px 变得跟原来的 2px 的长度(长宽)⼀样了(元素会占据更多的设备像素),所以放⼤1倍后原来需要 320px 才能填满的宽度现在只需要 160px,也即原来 320px 的⾯积⾥现在只能填⼊ 160px 的东西了。
举个例⼦说明 CSS 像素的相对性,如下⽰意图:
最好的去斑产品
作为Web开发者,我们接触的更多的是⽤于控制元素样式的样式单位像素。这⾥的像素我们称之为CSS像素。假设我们⽤PC浏览器打开⼀个页⾯,浏览器此时的效果如左图所⽰,但如果我们把页⾯放⼤(通过“Ctrl键”加上“+号键”),此时块状容器则横向扩张,如右图所⽰(⿊⾊为实际效果,灰⾊为原来效果)。吊诡的是此时我们既没有调整浏览器窗⼝⼤⼩,也没有改变块状元素的css宽度,但是它看
上去却变⼤了⼀倍——这是因为我们把CSS像素放⼤为了原来的两倍。
也就是说默认情况下⼀个CSS像素应该是等于⼀个物理像素的宽度的,但是浏览器的放⼤操作让⼀个CSS像素等于了多个设备像素宽度。
设备独⽴像素(Device independent Pixel, DIP): 也称为逻辑像素,简称 DIP.
像素换算与倍率
DPR = 设备像素 / CSS像素 = 屏幕横向设备像素 / 理想视⼝的宽
CSS像素 = 设备独⽴像素 = 逻辑像素
有关倍率,我们⽤ iPhone 3gs 和 4s 来举例。假设有个邮件列表界⾯,我们不妨按照PC端⽹页设计的思维来想象。3gs上⼤概只能显⽰4-5⾏,4s就能显⽰9-10⾏,⽽且每⾏会变得特别宽。但两款⼿机其实是⼀样⼤的。如果照这种⽅式显⽰,3gs上刚刚好的效果,在4s上就会⼩到根本看不清字。排卵期几天
在现实中,这两者效果却是⼀样的。这是因为Retina屏幕把2x2个像素当1个像素使⽤。⽐如原本44像素⾼的顶部导航栏,在Retina屏上⽤了88个像素的⾼度来显⽰。导致界⾯元素都变成2倍⼤⼩,反⽽和3gs效果⼀样了。画质却更清晰。
在以前,iOS应⽤的资源图⽚中,同⼀张图通常有两个尺⼨。你会看到⽂件名有的带@2x字样,有的不带。其中不带@2x的⽤在普通屏上,带@2x的⽤在Retina屏上。只要图⽚准备好,iOS会⾃⼰判断⽤哪张,Android道理也⼀样。
由此可以看出,苹果以普通屏为基准,给Retina屏定义了⼀个2倍的倍率(iPhone 6plus除外,它达到了3倍)。实际像素除以倍率,就得到逻辑像素尺⼨。只要两个屏幕逻辑像素相同,它们的显⽰效果就是相同的。
Viewport
什么是 viewport?通俗的讲,移动设备上的viewport就是设备的屏幕上能⽤来显⽰我们的⽹页的那⼀块区域,在具体⼀点,就是浏览器上(也可能是⼀个app中的webview)⽤来显⽰⽹页的那部分区域,但viewport⼜不局限于浏览器可视区域的⼤⼩,它可能⽐浏览器的可视区域要⼤,也可能⽐浏览器的可视区域要⼩。在默认情况下,⼀般来讲,移动设备上的viewport都是要⼤于浏览器可视区域的,这是因为考虑到移动设备的分辨率相对于桌⾯电脑来说都⽐较⼩,所以为了能在移动设备上正常显⽰那些传统的为桌⾯浏览器设计的⽹站,移动设备上的浏览器都会把⾃⼰默认的viewport设为980px或1024px(也可能是其它值,这个是由设备⾃⼰决定的),但带来的后果就是浏览器会出现横向滚动条,因为浏览器可视区域的宽度是⽐这个默认的viewport的宽度要⼩的。
⾸先,移动设备上的浏览器认为⾃⼰必须能让所有的⽹站都正常显⽰,即使是那些不是为移动设备设计的⽹站。但如果以浏览器的可视区域作为viewport的话,因为移动设备的屏幕都不是很宽,所以那些为桌⾯浏览器设计的⽹站放到移动设备上显⽰时,必然会因为移动设备的viewport太窄,⽽挤作⼀团,甚⾄布局什么的都会乱掉。也许有⼈会问,现在不是有很多⼿机分辨率都⾮常⼤吗,⽐如768x1024,或者1080x1920这样,那这样的⼿机⽤来显⽰为桌⾯浏览器设计的⽹站是没问题的吧?前⾯我们已经说了,css中的1px并不是代表屏幕上的
1px,你分辨率越⼤,css中1px代表的物理像素就会越多,DPR 的值也越⼤,这很好理解,因为你分辨率增⼤了,但屏幕尺⼨并没有变⼤多少,必须让css中的1px代表更多的物理像素,才能让1px的东西在屏幕上的⼤⼩与那些低分辨率的设备差不多,不然就会因为太⼩⽽看不清。所以在1080x1920这样的设备上,在默认情况下,也许你只要把⼀个div的宽度设为300多px(视 DPR 的值⽽定),就是满屏的宽度了。为了防⽌某些⽹站因为viewport太窄⽽显⽰错乱,所以这些浏览器就决定默认情况下把viewport设为⼀个较宽的值,⽐如980px,这样的话即使是那些为桌⾯设计的⽹站也能在移动浏览器上正常显⽰了。把这个浏览器默认的viewport叫做 layout viewport。这个 layout viewport 的宽度可以通过 document.documentElement.clientWidth 来获取。
然⽽,layout viewport 的宽度是⼤于浏览器可视区域的宽度的,所以我们还需要⼀个viewport来代表浏览器可视区域的⼤⼩,我们叫
他 visual viewport。visual viewport 的宽度可以通过 window.innerWidth 来获取,但在 Android 2, Oprea mini 和 UC 8 中⽆法正确获取。下图为两个 viewport 的⽰意图:
现在我们已经有两个viewport了 - layout viewport 和 visual viewport。但浏览器觉得还不够,因为现在越来越多的⽹站都会为移动设备进⾏
单独的设计,所以必须还要有⼀个能完美适配移动设备的 viewport。所谓的完美适配指的是,⾸先不需要⽤户缩放和横向滚动条就能正常的查看⽹站的所有内容;第⼆,显⽰的⽂字的⼤⼩是合适,⽐如⼀段14px⼤⼩的⽂字,不会因为在⼀个⾼密度像素的屏幕⾥显⽰得太⼩⽽⽆法看清,理想的情况是这段14px的⽂字⽆论是在何种密度屏幕,何种分辨率下,显⽰出来的⼤⼩都是差不多的。当然,不只是⽂字,其他元素像图⽚什么的也是这个道理,这就是第三个 viewport ——移动设备的理想 viewport (ideal viewport)。
ideal viewport 并没有⼀个固定的尺⼨,不同的设备拥有有不同的 ideal viewport。所有 iPhone 的 ideal viewport 宽度都是320px,⽆论它的屏幕宽度是320还是640,也就是说,在 iPhone 中,css 中的 320px 就代表 iPhone 屏幕的宽度。
但是安卓设备就⽐较复杂了,有320px的,有360px的,有384px的等等,关于不同的设备ideal viewport的宽度都为多少,可以到去查看⼀下,⾥⾯收集了众多设备的理想宽度。
总结⼀下,ppk把移动设备上的viewport分为layout viewport, visual viewport 和 ideal viewport 三类:
ideal viewport是最适合移动设备的viewport,ideal viewport的宽度等于移动设备的屏幕宽度,只要在css中把某⼀元素的宽度设为ideal viewport的宽度(单位⽤px),那么这个元素的宽度就是设备屏幕的宽度了,也就是宽度为100%的效果。ideal viewport 的意义在于,⽆论在何种分辨率的屏幕下,那些针对ideal viewport ⽽设计的⽹站,不需要⽤户⼿动缩放,也不需要出现横向滚动条,都可以完美的呈现给⽤户;
layout viewport 表⽰的是浏览器默认的viewport,⼀般情况下这个宽度要⼤于浏览器可视区域宽度;
visual viewport 表⽰浏览器可视区域的⼤⼩。
利⽤ meta 标签对 viewport 进⾏控制
viewport是专为⼿机浏览器设计的⼀个meta标签,⼀个简单的⽰例如下所⽰:
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
其中,width=device-width表⽰此宽度不依赖于原始象素(px),⽽依赖于屏幕的宽度。移动设备默认的
viewport是layout viewport,也就是那个⽐屏幕要宽的viewport,但在进⾏移动设备⽹站的开发时,我们需要的是ideal viewport。我们在开发移动设备的⽹站时,最常见的的⼀个动作就是把上⾯这个东西复制到我们的head标签中,它的作⽤是让当前的 viewport 宽度等于设备宽度,同事不允许⽤户⼿动缩放。也许允不允许⽤户缩放不同的⽹站有不同的要求,但让viewport的宽度等于设备的宽度,这个应该是⼤家都想要的效果,如果你不这样的设定的话,那就会使⽤那个⽐屏幕宽的默认viewport,也就是说会出现横向滚动条。
这个name为viewport的meta标签到底有哪些东西呢,⼜都有什么作⽤呢?meta viewport 标签⾸先是由苹果公司在其safari浏览器中引⼊的,⽬的就是解决移动设备的viewport问题。后来安卓以及各⼤浏览器⼚商也都纷纷效仿,引⼊对meta viewport的⽀持,事实也证明这个东西还是⾮常有⽤的。在苹果的规范中,meta viewport 有6个可以设置的内容:
内容含义
width设置layout viewport 的宽度,为⼀个正整数,或字符串"device-width"
initial-scale设置页⾯的初始缩放值,为⼀个数字,可以带⼩数
minimum-scale允许⽤户的最⼩缩放值,为⼀个数字,可以带⼩数
maximum-scale允许⽤户的最⼤缩放值,为⼀个数字,可以带⼩数
height设置layout viewport 的⾼度,这个属性对我们并不重要,很少使⽤
user-scalable是否允许⽤户进⾏缩放,值为"no"或"yes", no 代表不允许,yes代表允许
这些属性可以同时使⽤,也可以单独使⽤或混合使⽤,多个属性同时使⽤时⽤逗号隔开就⾏了。此外,在安卓中还⽀持target-densitydpi这个私有属性,它表⽰⽬标设备的密度等级,作⽤是决定css中的1px代表多少物理像素,但作为将要废弃的属性,所以使⽤中需要避免该⽤法。我们接下来看看具体的⼏个⽤法:
width=device-width: 所有浏览器都能把当前的viewport宽度变成ideal viewport的宽度,但要注意的是,在iPhone和iPad上,⽆论是竖屏还是横屏,宽度都是竖屏时ideal viewport的宽度。
initial-scale=1: 这句代码也能达到和前⼀句代码⼀样的效果,也可以把当前的的viewport变为 ideal viewport。
要想清楚这件事情,⾸先你得弄明⽩这个缩放是相对于什么来缩放的,因为这⾥的缩放值是1,也就是没缩放,但却达到了 ideal viewport 的效果,所以,那答案就只有⼀个了,缩放是相对于 ideal viewport来进⾏缩放的。
但如果width 和 initial-scale=1同时出现,并且还出现了冲突呢?
<meta name="viewport" content="width=400, initial-scale=1">
width=400表⽰把当前viewport的宽度设为400px,initial-scale=1则表⽰把当前viewport的宽度设为ideal viewport的宽度,那么浏览器到底该服从哪个命令呢?是书写顺序在后⾯的那个吗?不是。当遇到这种情况时,浏览器会取它们两个中较⼤的那个值。例如,当
width=400,ideal viewport的宽度为320时,取的是400;当width=400, ideal viewport的宽度为480时,取的是ideal viewport的宽度。(ps:在uc9浏览器中,当initial-scale=1时,⽆论width属性的值为多少,此时viewport的宽度永远都是ideal viewport的宽度)
最后,总结⼀下,要把当前的viewport宽度设为ideal viewport的宽度,既可以设置 width=device-width,也可以设置 initial-scale=1,但这两者各有⼀个⼩缺陷,就是iphone、ipad以及IE 会横竖屏不分,通通以竖屏的ideal viewport宽度为准。所以,最完美的写法应该是,两者都写上去,这样就 initial-scale=1 解决了 iphone、ipad的⽑病,width=device-width则解决了IE的⽑病。关于缩放,我们可以得出以下⼀个式⼦:
当前缩放值 = ideal viewport宽度  / visual viewport宽度
⼤多数浏览器都符合这个理论,但是安卓上的原⽣浏览器以及IE有些问题。安卓⾃带的webkit浏览器只有在 initial-scale = 1 以及没有设置width属性时才是表现正常的,也就相当于这理论在它⾝上基本没⽤;⽽IE则根本不甩initial-scale这个属性,⽆论你给他设置什么,initial-scale表现出来的效果永远是1。
好了,现在再来说下initial-scale的默认值问题,就是不写这个属性的时候,它的默认值会是多少呢?很显然不会是1,因为当 initial-scale = 1 时,当前的layout viewport宽度会被设为 ideal viewport的宽度,但前⾯说了,各浏览器默认的 layout viewport宽度⼀般都是980啊,1024啊,800啊等等这些个值,没有⼀开始就是 ideal viewport的宽度的,所以 initial-scale的默认值肯定不是1。安卓设备上的initial-scale默认值好像没有⽅法能够得到,或者就是⼲脆它就没有默认值,⼀定要你显⽰的写出来这个东西才会起作⽤,我们不管它了,这⾥我们重点说⼀下iphone和ipad上的initial-scale默认值。
根据测试,我们可以在iphone和ipad上得到⼀个结论,就是⽆论你给layout viewpor设置的宽度是多少,⽽⼜没有指定初始的缩放值的话,那么iphone和ipad会⾃动计算initial-scale这个值,以保证当前layout viewport的宽度在缩放后就是浏览器可视区域的宽度,也就是说不会出现横向滚动条。⽐如说,在iphone上,我们不设置任何的viewport meta标签,此时layout viewport的宽度为980px,但我们可以看到浏览器并没有出现横向滚动条,浏览器默认的把页⾯缩⼩了,此时值应为 0.33 左右。
所以总结⼀下:在iphone和ipad上,⽆论你给viewport设的宽的是多少,如果没有指定默认的缩放值,则iphone和ipad会⾃动计算这个缩放值,以达到当前页⾯不会出现横向滚动条(或者说viewport的宽度就是屏幕的宽度)的⽬的。
JavaScript 动态更改 meta viewport 标签
⽅法⼀:可以使⽤document.write来动态输出meta viewport标签
document.write('<meta name="viewport" content="width=device-width,initial-scale=1">');
⽅法⼆:通过setAttribute⽅法改变
<meta id="testViewport" name="viewport" content="width = 380">
<script>
let mvp = ElementById('testViewport');
mvp.setAttribute('content','width=480');
</script>
但是要注意,在安卓2.3(或许是所有2.x版本中)的⾃带浏览器中,对meta viewport标签进⾏覆盖或更改,会出现让⼈⾮常迷糊的结果。
总结⼀下,每个移动设备浏览器中都有⼀个理想的宽度,这个理想的宽度是指css中的宽度,跟设备的物理宽度没有关系,在css中,这个宽度就相当于100%的所代表的那个宽度。我们可以⽤meta标签把viewport的宽度设为那个理想的宽度,如果不知道这个设备的理想宽度是多少,那么⽤device-width这个特殊值就⾏了,同时initial-scale=1也有把viewport的宽度设为理想宽度的作⽤。
为什么需要有理想的viewport呢?⽐如⼀个分辨率为320x480的⼿机理想viewport的宽度是320px,⽽另⼀个屏幕尺⼨相同但分辨率为
640x960的⼿机的理想viewport宽度也是为320px,那为什么分辨率⼤的这个⼿机的理想宽度要跟分辨率⼩的那个⼿机的理想宽度⼀样呢?这是因为,只有这样才能保证同样的⽹站在不同分辨率的设备上看起来都是⼀样或差不多的。