viewport、布局视口、视觉视口、理想视口 深入理解

在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的viewport了,只有明白了viewport的概念以及弄清楚了跟viewport有关的meta标签的使用,才能更好地让我们的网页适配或响应各种不同分辨率的移动设备。

通俗的讲,移动设备上的viewport就是设备的屏幕上能用来显示我们的网页的那一块区域,在具体一点,就是浏览器上(也可能是一个app中的webview)用来显示网页的那部分区域,但viewport又不局限于浏览器可视区域的大小,它可能比浏览器的可视区域要大,也可能比浏览器的可视区域要小。在默认情况下,一般来讲,移动设备上的viewport都是要大于浏览器可视区域的,这是因为考虑到移动设备的分辨率相对于桌面电脑来说都比较小,所以为了能在移动设备上正常显示那些传统的为桌面浏览器设计的网站,移动设备上的浏览器都会把自己默认的viewport设为980px或1024px(也可能是其它值,这个是由设备自己决定的),但带来的后果就是浏览器会出现横向滚动条,因为浏览器可视区域的宽度是比这个默认的viewport的宽度要小的。下图列出了一些设备上浏览器的默认viewport的宽度。

image.png

在css中我们一般使用px作为单位,在桌面浏览器中css的1个像素往往都是对应着电脑屏幕的1个物理像素,这可能会造成我们的一个错觉,那就是css中的像素就是设备的物理像素。但实际情况却并非如此,css中的像素只是一个抽象的单位,在不同的设备或不同的环境中,css中的1px所代表的设备物理像素是不同的。在为桌面浏览器设计的网页中,我们无需对这个津津计较,但在移动设备上,必须弄明白这点。在早先的移动设备中,屏幕像素密度都比较低,如iphone3,它的分辨率为320x480,在iphone3上,一个css像素确实是等于一个屏幕物理像素的。后来随着技术的发展,移动设备的屏幕像素密度越来越高,从iphone4开始,苹果公司便推出了所谓的Retina屏,分辨率提高了一倍,变成640x960,但屏幕尺寸却没变化,这就意味着同样大小的屏幕上,像素却多了一倍,这时,一个css像素是等于两个物理像素的。其他品牌的移动设备也是这个道理。例如安卓设备根据屏幕像素密度可分为ldpi、mdpi、hdpi、xhdpi等不同的等级,分辨率也是五花八门,安卓设备上的一个css像素相当于多少个屏幕物理像素,也因设备的不同而不同,没有一个定论。

还有一个因素也会引起css中px的变化,那就是用户缩放。例如,当用户把页面放大一倍,那么css中1px所代表的物理像素也会增加一倍;反之把页面缩小一倍,css中1px所代表的物理像素也会减少一倍。关于这点,在文章后面的部分还会讲到。

在移动端浏览器中以及某些桌面浏览器中,window对象有一个devicePixelRatio(设备像素比)属性,它的官方的定义为:设备物理像素和设备独立像素的比例,也就是 dpr = dp/ dips。 dp(device pixels): 设备物理像素; dips(device-independent pixels): 设备独立像素,dips = css像素/scale(缩放比例),所以dpr=(dp/css像素)*scale

css中的px就可以看做是设备的独立像素,所以通过devicePixelRatio,我们可以知道该设备上一个css像素代表多少个物理像素。例如,在Retina屏的iphone上,devicePixelRatio的值为2,也就是说1个css像素相当于2个物理像素。但是要注意的是,devicePixelRatio在不同的浏览器中还存在些许的兼容性问题,所以我们现在还并不能完全信赖这个东西,具体的情况可以看下这篇文章。 devicePixelRatio的测试结果:

image.png

ppk大神对于移动设备上的viewport有着非常多的研究(第一篇,第二篇,第三篇),有兴趣的同学可以去看一下,本文中有很多数据和观点也是出自那里。ppk认为,移动设备上有三个viewport。

首先,移动设备上的浏览器认为自己必须能让所有的网站都正常显示,即使是那些不是为移动设备设计的网站。但如果以浏览器的可视区域作为viewport的话,因为移动设备的屏幕都不是很宽,所以那些为桌面浏览器设计的网站放到移动设备上显示时,必然会因为移动设备的viewport太窄,而挤作一团,甚至布局什么的都会乱掉。也许有人会问,现在不是有很多手机分辨率都非常大吗,比如768x1024,或者1080x1920这样,那这样的手机用来显示为桌面浏览器设计的网站是没问题的吧?前面我们已经说了,css中的1px并不是代表屏幕上的1px,你分辨率越大,css中1px代表的物理像素就会越多,devicePixelRatio的值也越大,这很好理解,因为你分辨率增大了,但屏幕尺寸并没有变大多少,必须让css中的1px代表更多的物理像素,才能让1px的东西在屏幕上的大小与那些低分辨率的设备差不多,不然就会因为太小而看不清。所以在1080x1920这样的设备上,在默认情况下,也许你只要把一个div的宽度设为300多px(视devicePixelRatio的值而定),就是满屏的宽度了。回到正题上来,如果把移动设备上浏览器的可视区域设为viewport的话,某些网站就会因为viewport太窄而显示错乱,所以这些浏览器就决定默认情况下把viewport设为一个较宽的值,比如980px,这样的话即使是那些为桌面设计的网站也能在移动浏览器上正常显示了。ppk把这个浏览器默认的viewport叫做layout viewport(布局视口)。这个layout viewport的宽度可以通过 document.documentElement.clientWidth 来获取。

然而,layout viewport 的宽度是大于浏览器可视区域的宽度的,所以我们还需要一个viewport来代表 浏览器可视区域的大小,ppk把这个viewport叫做 visual viewport(视觉视口)。visual viewport的宽度可以通过window.innerWidth 来获取,但在Android 2, Oprea mini 和 UC 8中无法正确获取。 ps: visual viewport的宽度指的是浏览器可视区域的宽度。

image.png

image.png

现在我们已经有两个viewport了:layout viewport 和 visual viewport。但浏览器觉得还不够,因为现在越来越多的网站都会为移动设备进行单独的设计,所以必须还要有一个能完美适配移动设备的viewport。所谓的完美适配指的是,首先不需要用户缩放和横向滚动条就能正常的查看网站的所有内容;第二,显示的文字的大小是合适,比如一段14px大小的文字,不会因为在一个高密度像素的屏幕里显示得太小而无法看清,理想的情况是这段14px的文字无论是在何种密度屏幕,何种分辨率下,显示出来的大小都是差不多的。当然,不只是文字,其他元素像图片什么的也是这个道理。ppk把这个viewport叫做 ideal viewport(理想视口),也就是第三个viewport——移动设备的理想viewport,ideal viewport 可通过window.screen.width获取。

ideal viewport 并没有一个固定的尺寸,不同的设备拥有有不同的 ideal viewport。所有的 iphone 的 ideal viewport 宽度都是 320px,无论它的屏幕宽度是 320 还是 640,也就是说,在 iphone 中,css 中的 320px 就代表 iphone 屏幕的宽度。

image.png

但是安卓设备就比较复杂了,有320px的,有360px的,有384px的等等,关于不同的设备ideal viewport的宽度都为多少,可以到 http://viewportsizes.com 去查看一下,里面收集了众多设备的理想宽度。

ppk把移动设备上的viewport分为layout viewport 、 visual viewport 和 ideal viewport 三类,其中的 ideal viewport 是最适合移动设备的viewport,ideal viewport的宽度等于移动设备的屏幕宽度,只要在css中把某一元素的宽度设为ideal viewport的宽度(单位用px),那么这个元素的宽度就是设备屏幕的宽度了,也就是宽度为100%的效果。ideal viewport 的意义在于,无论在何种分辨率的屏幕下,那些针对ideal viewport 而设计的网站,不需要用户手动缩放,也不需要出现横向滚动条,都可以完美的呈现给用户。

三个视口总结如下:

  • layout viewport(布局视口): 在PC端上,布局视口等于浏览器窗口的宽度。而在移动端上,由于要使为PC端浏览器设计的网站能够完全显示在移动端的小屏幕里,此时的布局视口会远大于移动设备的屏幕,就会出现滚动条。js获取布局视口:document.documentElement.clientWidth | document.body.clientWidth;

  • visual viewport(视觉视口): 用户正在看到的网页的区域。用户可以通过缩放来查看网站的内容。如果用户缩小网站,我们看到的网站区域将变大,此时视觉视口也变大了,同理,用户放大网站,我们能看到的网站区域将缩小,此时视觉视口也变小了。不管用户如何缩放,都不会影响到布局视口的宽度。js获取视觉视口:window.innerWidth;

  • ideal viewport(理想视口): 布局视口的一个理想尺寸,只有当布局视口的尺寸等于设备屏幕的尺寸时,才是理想视口。js获取理想视口:window.screen.width;

1、在桌面浏览器上,浏览器窗口与视口的宽度一致,而视口(CSS标准文档中称为“初始包含块”)是CSS百分比宽度推算的根源,因此,浏览器窗口是约束CSS布局的视口; 2、在手机上,有两个视口,布局视口会限制CSS布局;视觉视口决定用户看到的网站内容; 3、移动端浏览器还有个理想视口,它是对特定设备上的特定浏览器的布局视口的一个理想尺寸; 4、可以把布局视口尺寸定义为理想视口。这也是响应式设计的基础。

移动设备默认的viewport是layout viewport,也就是那个比屏幕要宽的viewport,但在进行移动设备网站的开发时,我们需要的是ideal viewport。那么怎么才能得到ideal viewport呢?这就该轮到meta标签出场了。

我们在开发移动设备的网站时,最常见的的一个动作就是把下面这个东西复制到我们的head标签中:

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"> 

该meta标签的作用是让当前viewport的宽度等于设备的宽度,同时不允许用户手动缩放。也许允不允许用户缩放不同的网站有不同的要求,但让viewport的宽度等于设备的宽度,这个应该是大家都想要的效果,如果你不这样的设定的话,那就会使用那个比屏幕宽的默认viewport,也就是说会出现横向滚动条。

这个name为viewport的meta标签到底有哪些东西呢,又都有什么作用呢?

meta viewport 标签首先是由苹果公司在其safari浏览器中引入的,目的就是解决移动设备的viewport问题。后来安卓以及各大浏览器厂商也都纷纷效仿,引入对meta viewport的支持,事实也证明这个东西还是非常有用的。

在苹果的规范中,meta viewport 有6个属性(暂且把content中的那些东西称为一个个属性和值),如下:

image.png

这些属性可以同时使用,也可以单独使用或混合使用,多个属性同时使用时用逗号隔开就行了。

_此外,在安卓中还支持 target-densitydpi 这个私有属性,它表示目标设备的密度等级,作用是决定css中的1px代表多少物理像素 _

image.png

_ 特别说明的是,当 target-densitydpi=device-dpi 时, css中的1px会等于物理像素中的1px。 因为这个属性只有安卓支持,并且安卓已经决定要废弃 target-densitydpi 这个属性了,所以这个属性我们要避免进行使用 。_

要得到ideal viewport就必须把默认的layout viewport的宽度设为移动设备的屏幕宽度。因为meta viewport中的width能控制layout viewport的宽度,所以我们只需要把width设为width-device这个特殊的值就行了。

<meta name="viewport" content="width=device-width"> 

下图是这句代码在各大移动端浏览器上的测试结果:

image.png

可以看到通过width=device-width,所有浏览器都能把当前的viewport宽度变成ideal viewport的宽度,但要注意的是,在iphone和ipad上,无论是竖屏还是横屏,宽度都是竖屏时ideal viewport的宽度。

这样的写法看起来谁都会做,没吃过猪肉,谁还没见过猪跑啊~,确实,我们在开发移动设备上的网页时,不管你明不明白什么是viewport,可能你只需要这么一句代码就够了。

可是你肯定不知道

<meta name="viewport" content="initial-scale=1"> 

这句代码也能达到和前一句代码一样的效果,也可以把当前的的viewport变为 ideal viewport。

呵呵,傻眼了吧,因为从理论上来讲,这句代码的作用只是不对当前的页面进行缩放,也就是页面本该是多大就是多大。那为什么会有 width=device-width 的效果呢?

要想清楚这件事情,首先你得弄明白这个缩放是相对于什么来缩放的,因为这里的缩放值是1,也就是没缩放,但却达到了 ideal viewport 的效果,所以,那答案就只有一个了,缩放是相对于 ideal viewport来进行缩放的,当对ideal viewport进行100%的缩放,也就是缩放值为1的时候,不就得到了 ideal viewport吗?事实证明,的确是这样的。下图是各大移动端的浏览器当设置了<meta name="viewport" content="initial-scale=1"> 后是否能把当前的viewport宽度变成 ideal viewport 的宽度的测试结果。

image.png

测试结果表明 initial-scale=1 也能把当前的viewport宽度变成 ideal viewport 的宽度,但这次轮到了windows phone 上的IE 无论是竖屏还是横屏都把宽度设为竖屏时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的毛病:

<meta name="viewport" content="width=device-width, initial-scale=1"> 

6.1 关于缩放以及initial-scale的默认值

首先我们先来讨论一下缩放的问题,前面已经提到过,缩放是相对于ideal viewport来缩放的,缩放值越大,当前viewport的宽度就会越小,反之亦然。例如在iphone中,ideal viewport的宽度是320px,如果我们设置 initial-scale=2 ,此时viewport的宽度会变为只有160px了,这也好理解,放大了一倍嘛,就是原来1px的东西变成2px了,但是1px变为2px并不是把原来的320px变为640px了,而是在实际宽度不变的情况下,1px变得跟原来的2px的长度一样了,所以放大2倍后原来需要320px才能填满的宽度现在只需要160px就做到了。因此,我们可以得出一个公式:

visual viewport宽度 = ideal viewport宽度 / 当前缩放值

当前缩放值 = 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,但我们可以看到浏览器并没有出现横向滚动条,浏览器默认的把页面缩小了。根据上面的公式,当前缩放值 = ideal viewport宽度 / visual viewport宽度,我们可以得出:当前缩放值 = 320 / 980 也就是当前的initial-scale默认值应该是 0.33这样子。当你指定了initial-scale的值后,这个默认值就不起作用了。

总之记住这个结论就行了:在iphone和ipad上,无论你给viewport设的宽的是多少,如果没有指定默认的缩放值,则iphone和ipad会自动计算这个缩放值,以达到当前页面不会出现横向滚动条(或者说viewport的宽度就是屏幕的宽度)的目的。

image.png

image.png

image.png

6.2 动态改变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>
var mvp = document.getElementById('testViewport');
mvp.setAttribute('content','width=480');
</script> 

安卓2.3自带浏览器上的一个bug

<meta name="viewport" content="width=device-width">
​
<script type="text/javascript">
alert(document.documentElement.clientWidth); //弹出600,正常情况应该弹出320
</script>
​
<meta name="viewport" content="width=600">
​
<script type="text/javascript">
alert(document.documentElement.clientWidth); //弹出320,正常情况应该弹出600
</script> 

测试的手机ideal viewport 宽度为320px,第一次弹出的值是600,但这个值应该是第行meta标签的结果啊,然后第二次弹出的值是320,这才是第一行meta标签所达到的效果啊,所以在安卓2.3(或许是所有2.x版本中)的自带浏览器中,对meta viewport标签进行覆盖或更改,会出现让人非常迷糊的结果。

说了那么多废话,最后还是有必要总结一点有用的出来。

首先如果不设置meta viewport标签,那么移动设备上浏览器默认的宽度值为800px,980px,1024px等这些,总之是大于屏幕宽度的。这里的宽度所用的单位px都是指css中的px,它跟代表实际屏幕物理像素的px不是一回事。

第二、每个移动设备浏览器中都有一个理想的宽度,这个理想的宽度是指css中的宽度,跟设备的物理宽度没有关系,在css中,这个宽度就相当于100%的所代表的那个宽度。我们可以用meta标签把viewport的宽度设为那个理想的宽度,如果不知道这个设备的理想宽度是多少,那么用device-width这个特殊值就行了,同时initial-scale=1也有把viewport的宽度设为理想宽度的作用。所以,我们可以使用

<meta name="viewport" content="width=device-width, initial-scale=1"> 

来得到一个理想的viewport(也就是前面说的ideal viewport)。

为什么需要有理想的viewport呢?比如一个分辨率为320x480的手机理想viewport的宽度是320px,而另一个屏幕尺寸相同但分辨率为640x960的手机的理想viewport宽度也是为320px,那为什么分辨率大的这个手机的理想宽度要跟分辨率小的那个手机的理想宽度一样呢?这是因为,只有这样才能保证同样的网站在不同分辨率的设备上看起来都是一样或差不多的。实际上,现在市面上虽然有那么多不同种类不同品牌不同分辨率的手机,但它们的理想viewport宽度归纳起来无非也就 320、360、384、400等几种,都是非常接近的,理想宽度的相近也就意味着我们针对某个设备的理想viewport而做出的网站,在其他设备上的表现也不会相差非常多甚至是表现一样的。

相关推荐

Lambda表达式

codest的专栏 224

inux下C编程(10)---字符及字符串处理

字符编码ASCII: 7位 128个元素。大小写相差20hunicode: 2个 4个或更多的存储空间。utf-8: 每个字符2个字节字符处理库通过转换函数,可以实现和其他类型的转换。字符串转换函数字符串处理函数字符串比较函数字符串查找函数字符串内存函数字符串其他函数...

codest的专栏 233

linux下C编程(09)---函数

函数的一般形式:类型说明可以是任何数据类型,包括vOid.返回语句。return两个作用:结束当前函数,调用者获取程序的控制权。将计算结果传递给调用者。程序结束两种情况:代码结束return作用域规则范围划分局部变量作用函数体内。全局变量。作用域是整个源程序文件,文件中的所有函数和程序块都可以引用。生命周期划分动态存储变量。默认或者AUTO。静态存储变量sttic修饰符函数退出后,变量被保留在内存,再次执行同一函数会得到与上次退出时候相同的数值。函数的.

codest的专栏 231

linux下C编程(08)---数组和指针

一维数组一般形式数据类型 + 名称 +【长度】初始化 3种形式根据下标声明时候加入等号声明时候不指定长度,根据初始化的个数来确定。字符串使用的一维数组字符串数据和一般的字符数据区别是,前者还包含了字符串结束符:“\0”.C没有专门的字符串类型,但是允许使用字符串常量和字符串数组,并提供字符串操作函数。二维数组格式声明:数据类型 + 名称 +【长度1】【长度2】数组长度是 长度1* 长度2二维字符串数组可以看做多个一维字符串数组,第一组是字符串的个数多维数组

codest的专栏 287

linux下C编程(07)---程序控制结构

数据的输入和输出scanf 输入没有专门的语句,通过标准的库函数的调用实现,stdio.hscanf: 键盘上获取,按照指定的输入格式赋给相应的输入项目输入格式格式字符说明d输入一个十进制o输入一个八进制x输入一个16进制f输入一个小数点形式的浮点数e输入一个指数形式的浮点数c输入一个字符s输入一个字符串屏蔽某个数据时候,可以使用修饰符*空格或道和可以表示多个数之间的间隔。printf()输出修饰符是可

codest的专栏 211

linux下C编程(06)---C语言的数据类型

六、C语言的数据类型基本数据类型基本类型字长char 字符型1个字节int 整型2字节 AMD64 下 是4字节float整型4字节double整型8字节void 整型0字节聚合类型数组指针结构体共同体修饰符signedunsignedlongshort修改字符和整数两种基本类型。long还可以用于double.有符号将1位用于存储符号。常量#define定义的常量字符、字符串、数值常量。常量变量枚

codest的专栏 227

2021-09-12

什么是插槽? 插槽(Slot)是Vue提出来的一个概念,正如名字一样,插槽用于决定将所携带的内容,插入到指定的某个位置,从而使模板分块,具有模块化的特质和更大的重用性。插槽显不显示、怎样显示是由父组件来控制的,而插槽在哪里显示就由子组件来进行控制 slot官方介绍 Props: name - string,用于命名插槽。 U...

codest的专栏 216

Vue 快速上手

1、前端核心分析2、前端发展史3、第一个Vue程序4、Vue基本语法5、Vue绑定事件6、Vue双向绑定7、Vue组件讲解8、Axios异步通信9、计算属性10、插槽slot11、自定义事件内容分发12、第一个vue-cli程序13、webpack学习使用14、vue-router路由15、vue+elementUl16、路由嵌套17、参数传递及重定向18、404和路由钩子...

codest的专栏 256

若依Vue(若依前后端分离版)--01

介绍RuoYi-Vue 是一个 Java EE 企业级快速开发平台,基于经典技术组合(Spring Boot、Spring Security、MyBatis、Jwt、Vue),内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、代码生成等。在线定时任务配置;支持集群,支持多数据源,支持分布式事务。快速了解环境部署部署Java部署Vue项目介绍bbbub{},“aaa”====》debug讲解模拟登陆若依 获取验证码,得到UUID ..

codest的专栏 3996

int与Integer区别及应用场景

一、int与Integer区别:1、int属于基本数据类型,Integer属于int对应的包装类。2、既然是类,就需要实例化才可以使用,而基本数据变量不需要。3、Integer的默认值是null,而int的默认值是0二、int与Integer的应用场景1、为什么java会保留基本数据类型?对于java来说,常说“一切皆对象”,那为啥java还有基本数据类型,对此需要明白,基本数据类型和对象类型的区别1、基本数据类型基本数据类型存在的是:值,基本数据类型在内存中存放的位置是栈。(声明在方法中的

codest的专栏 1548

Java中的List、Set和Map的各自特征及使用场景

Java中的集合分为单列集合Collection和双列集合Map。 先通过这张图看看Collection和Map的各自体系。 首先看单列集合Collection中的List及Set的各自特征。 List(有序,可重复)             ArrayList   &nb...

codest的专栏 551

IDEA 中 Project 和 Module 详解与实战

IDEA 相关文章 标题文章连接大厂通用最全IDEA使用手册https://blog.youkuaiyun.com/chenlixiao007/article/details/106952976阿里巴巴Java开发编码规约与IDEA集成https://blog.youkuaiyun.com/chenlix...

codest的专栏 4777

阿里巴巴Java开发编码规约与IDEA集成

文章目录 IDEA 相关文章Ⅰ 阿里巴巴代码规约插件安装Ⅱ 插件使用Ⅲ 开发规范手册下载 IDEA 相关文章 标题文章连接大厂通用最全IDEA使用手册https://blog.youkuaiyun.com/chenlixiao007/article/details/1069529...

codest的专栏 254

大厂通用最全IDEA使用手册

IDEA 相关文章 标题文章连接阿里巴巴Java开发编码规约与IDEA集成https://blog.youkuaiyun.com/chenlixiao007/article/details/108287646IDEA 创建不同类型 Project 和 Module 详解https://blog.youkuaiyun.com/chenlixiao007/ar...

codest的专栏 543

idea工程和模块的区别

1、工程是独立的,具有自己的内部资源(jar包等)。 模块不是独立的,属于某一个工程,并可以使用该工程的所有资源。2、同一个工程中的模块对于该工程是继承关系,子模块之间初始状态下没有关系。 父工程和子模块之间不用单独手动建立关系,子模块之间需要手动建立关系,各模块之间的关系称为依赖。...

codest的专栏 901

五、SpringBoot(5)-SpringBoot与整合其他技术

SpringBoot整合Mybatis1.1 添加Mybatis的起步依赖<!--mybatis起步依赖--><dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.1.1</version>&

codest的专栏 220

四、SpringBoot(4)-SpringBoot的配置文件

SpringBoot配置文件类型1 SpringBoot配置文件类型和作用SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用application.properties或者application.yml(application.yaml)进行配置。SpringBoot默认会从Resources目录下加载application.properties或application.yml(application.yaml)文件其中,applic

codest的专栏 229

三、SpringBoot(3)-原理分析

起步依赖原理分析1. 分析spring-boot-starter-parent按住Ctrl点击pom.xml中的spring-boot-starter-parent,跳转到了spring-boot-starter-parent的pom.xml,xml配置如下(只摘抄了部分重点配置):<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-de

codest的专栏 219

二、SpringBoot(2)--快速入门

代码实现 创建Maven工程 使用idea工具创建一个maven工程,该工程为普通的java工程即可。 添加SpringBoot的起步依赖 编写SpringBoot引导类 编写Controller 测试 快速入门解析 SpringBoot代码解析 SpringBoot工程热部署 使用idea快速创建SpringBoot项目 ...

codest的专栏 222

一、SpringBoot(1)-简介

1.原有Spring优缺点分析1.1 Spring的优点分析Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品。无需开发重量级的Enterprise JavaBean(EJB),Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的Java对象(Plain Old Java Object,POJO)实现了EJB的功能。1.2 Spring的缺点分析虽然Spring的组件代码是轻量级的...

codest的专栏 232

Vue的组件为什么要export default

Vue 的模块机制  Vue 是通过 webpack 实现的模块化,因此可以使用 import 来引入模块,例如:  此外,你还可以在 bulid/webpack.base.conf.js 文件中修改相关配置:

codest的专栏 478

vue初学习笔记--01

(该文章仅用于学习记录,如有侵权,请联系删除)

codest的专栏 429

tp( thinkphp)数据更新和查询

一、数据更新1、使用find方法获取数据,然后通过save方法保存修改,返回布尔值$user = UserModel::find(11); $user->username = '李黑'; $user->save()2、通过where方法解和find方法的查询条件获取的数据进行修改$user=Students::where('id',1)->find();$user->uname ='admin';$user->email ='66461682@qq.

codest的专栏 1092

javascript基础(12)--定时器

333

codest的专栏 116

javascript基础(11)--BOM介绍

BOM:浏览器对象模型,BOM可以使我们通过JS来操作浏览器,在BOM中为我们提供了一组对象,用来完成对浏览器的操作.BOM对象:Window代表的是整个浏览器的窗口,同时window也是网页中的全局对象Navigator代表的当前浏览器的信息,通过该对象可以来识别不同的浏览器代表的当前浏览器的信息,通过该对象可以来识别不同的浏览器由于历史原因,Navigator对象中的大部分属性都已经不能帮助我们识别浏览器了一般我们只会使用userAgent来判断浏览器的信息,u.

codest的专栏 116

javascript基础(11)--事件对象

事件对象当事件的响应函数被触发时,浏览器每次都会将一个事件对象作为实参传递进响应函数,在事件对象中封装了当前事件相关的一切信息,比如:鼠标的坐标键盘哪个按键被按下鼠标滚轮滚动的方向。window.onload = function(){ /* * 当鼠标在areaDiv中移动时,在showMsg中来显示鼠标的坐标 */ //获取两个div var areaDiv = document.getElementById("areaDiv"); var showMsg ...

codest的专栏 221

javascript基础(10)--DOM和事件

DOM:文档对象模型文档:文档表示的就是整个的HTML网页文档 对象:对象表示将网页中的每一个部分都转换为了一个对象,将页面每个元素转换为对象 模型:倒树,体现节点对象之间的关系。 通过js操作html中的元素,如:h1, head等。节点:节点:Node——构成HTML文档最基本的单元 ,常用节点分为四类。文档节点:整个HTML文档 元素节点:HTML文档中的HTML标签 属性节点:元素的属性 文本节点:HTML标签中的文本内容浏览器已经为我们提供文档节点对象..

codest的专栏 302

javascript基础(11)--json

JSON: JavaScriptObjectNotationJS对象表示法JS中的对象只有JS自己认识,其他的语言都不认识,JSON就是一个特殊格式的字符串,这个字符串可以被任意的语言所识别,并且可以转换为任意语言中的对象,JSON在开发中主要用来数据的交互.Json基本语法:JSON和JS对象的格式一样,只不过JSON字符串中的属性名必须加双引号,其他的和JS语法一致。对象中的属性名,(注意:单引号、双引号、不加都是可以的)JSON分类:1.对象{} --jso...

codest的专栏 217

javascript基础(9)--正则表达式

正则表达式用于定义一些字符串的规则,计算机可以根据正则表达式,来检查一个字符串是否符合规则,获取将字符串中符合规则的内容提取出来.使用步骤:创建正则表达式的对象 varreg=newRegExp("a"); //对象方式使用字面量:语法:var变量=/正则表达式/匹配模式 这个正则表达式可以来检查一个字符串中是否含有a,在构造函数中可以传递一个匹配模式作为第二个参数,i忽略大小写,g全局匹配模式. 使用TEST() 方法. 使用这个方法可以用来检查一个字符串是...

codest的专栏 150

javascript基础(8)--date /math/包装类/String

1 Date对象在JS中使用Date对象来表示一个时间vard=newDate();vard2=newDate("2/18/201111:10:30");getDate()获取当前日期对象是几日getDay()获取当前日期对象时周几getMonth获取当前时间对象的月份getFullYear * getTime() * - 获取当前日期对象的时间戳 * - 时间戳,指的是从格林威治标准时间的1970年1月1日,0时0...

codest的专栏 101
上一篇: tp( thinkphp)数据更新和查询
下一篇: vue初学习笔记--01
codest
codest 企业官方账号 企业官方账号
博客等级 码龄17年 7粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值