5588葡京线路iOS开发新家入门 | 第八回:地图和职位

在当时无异章节中,你拿会学到以您的app中哪运用iPhone中之GPS。你用会见学会怎么获取用户的职,同时以地形图上标注有位置。本章内容涵盖了
地图套件(Map
Kit)和苹果商店供的地形图、方向框架。通过学习本章节的情节,你及时就是可搞定基于位置一定的运用。

看目录

供用户的岗位信息是开iOS应用最冲动的特色,在地形图及显得用户之号需要少独步骤。

  • DNS 解析成 IP 地址
  • 发送 http 请求
  • TCP 传输报文
  • IP 寻址
  • 封装成帧
  • 物理传输
  • 页面渲染主流程
  • dom树和render树的涉及
  • 布局render树(layout)
  • 绘制(paint)

首先步用Core Location来搜集用户之岗位。Core
Location是一模一样文山会海类的集结,通过设备的GPS和蜂窝获取位置信息,还能够凭借WIFI获取用户信息。Core
Location
是由苹果公司提供的无数frameworks中之一个。Frameworks是一样组类的集合,为具体的某个任务要规划之同等学工具。我们今天所以Core
Location举一个例,Core
Location是为处理用户位置信息要设计之一个framework。Core
Data是为了处理数据如果计划之一个framework。这些framework是可选的,因此用事先拿这些框架导入到工程中后,才会运用这些框架。

事先面试时时不时为问及这个题材,支支吾吾回答没有底气,仔细研究了转,发现其间学问还真的不丢。

第二步是以地形图中标注出用户之位置。苹果公司供了Map
Kit框架,帮助我们绘制和治本地图。在Xcode
6中导入框架非常容易。首先Project
Navigator中点击项目名称,点击名为Capabilities的tab选项按钮,向下滚动找到Maps。将地图的起来要处On的状态,这时MapKit框架已经补给加至工程中了。现在则会在工程中找到MapKit,但是导入流程还没有完结。MapKit还得导入controller
file中。我们下列一行代码完成导入工作:

打输入 cnblogs.com 到博客园首页完全展现这个进程得大致分为 网通信
页面渲染 两个步骤。

import MapKit

网通信走的五层因特网协议栈(OSI标准是七层模型,但事实上贯彻普通是五层)。画了同布置图:

这般,MapKit类和商事就导入到controller文件中了。MapKit中的切近及协商都是为MK开头的。

Page 213

五层因特网协议栈

Core Location

刚好而之前所说之,Core Location是如出一辙密密麻麻查找用户位置的好像的会师。Core
Location中生出三个检测用户位置的方式。第一单章程是Significant-Change
Location。这个措施能节约电池电量,它只有以用户之职明显改变时才见面更新位置。第二只方法是Location
Services,可以自主确定稳定更新的平整。最后一栽办法是Regional
Monitoring方法,使用附近的地理区域边界或Bluetooth
beacons来定位。本书要介绍第二种植艺术:Location
Services,它是最常用到的方式。

再多信息请参考苹果店之Location and Maps Programming
Guide。

获取用户位置要利用Core Location框架,当您管Maps
capabilities开关切换成On(开)状态时,Xcode并不曾活动导入Core
Location框架,需要我们手动导入,请看以下四个步骤:

  1. 点击Project Navigator上的蓝色工程图标;
  2. Editor显示工程的详细信息,滑倒最下方;
  3. 于Link Binary with Libraries下方点击Add;
  4. 分选Core Location,然后点击Add。

Core Location框架就会见加加至Project
Navigator中,我们尚欲在controller中形容一行代码才能够得之框架:

import CoreLocation

手机用户的位置异常耗电量,它比另外的天职要还多之电池电量和天线频率,所以保证您的App只有当得位置时才取得位置,一旦得到岗位,就把这力量关闭,如果前尚待地理位置,可以动用时限更新功能

在收获用户位置之前,很要紧之平等项事是预先检查一定服务是否可用。定位服务无法使可能是由于以下几种状况:

  • 用户以安中关闭了Location Services(定位服务)。
  • 用户禁止你的App使用Location Services(定位服务)。
  • 设施处飞行模式或者连续不了网络。

Page 214 | Chapter 8 : Maps and Location

Core
Location提供了名叫吧locationServicesEnabled的主意来检查设备的恒服务是否可用,locationServicesEnabled计通过布尔档次返回值来规定定位服务是否可用,true可用,false不可用。

DNS 解析成 IP 地址

DNS属于应用层协议。客户端会先反省本地是否出照应的 ip
地址,如果产生就是赶回,否则便会见要上级 DNS
服务器,知道找到或到干净节点。这无异经过或者会见大耗时,使用 dns-prefetch
可要浏览器在悠闲时提前将这些域名转化为 ip
地址,真正要资源时便避免了之历程的时空。例如京东首页的拍卖:

京东首页dns-prefetch处理

Requesting User Location

透过CLLocationManager类来请求用户位置。首字母CL代表Core Location。The
location
manager用于收集参数与开定位服务。创建CLLocationManager对象与创办其他的靶子类似。举例说明:

var locationManager: CLLocationManager = CLLocationManager()

CLLocationManager有一部分性质是必须要装的。

desiredAccuracy属性是枚举类型,枚举,就是用一个最主要词代表一个数字。枚举有点像是大抵选题,你得于选择中挑选有一个价来。desiredAccuracy属性有脚有值:

kCLLocationAccuracyBest
尽精准的稳,也是不过消耗电量的选项
kCLLocationAccuracyNearestTenMeters
精准度在十米范围外
kCLLocationAccuracyHundredMeters
准确度在一百米范围外
kCLLocationAccuracyKilometer
精确度在一千米范围外
kCLLocationAccuracyThreeKilometers
精确度在三千米范围外

精准度越强,电量消耗越怪。我们要挑能够满足低要求的精准度级别。如果是如Google地图之类的App来追踪用户之职,那么kCLLocationAccuracyNearestTenMeters或者kCLLocationAccuracyHundredMeters纵使可满足我们的需。如果App只待提供用户所在城市,像是Twitter中的永恒,kCLLocationAccuracyKilometer或者kCLLocationAccuracyThreeKilometers虽可满足我们的求。大多数情下,一般不需要kCLLocationAccuracyBest

设置desiredAccuracy属性的点子及安任何对象的习性一样:

locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters

Core Location | Page 215

CLLocationManager也需delegate属性。CLLocationManage
delegate遵循CLLocationManagerDelegate协议。无论何时出现了位置更新或者出现谬误,delegate都见面吸收及警示。为了接收这些警告,delegate必须通过CLLocationManagerDelegate协议以及警报保持联络。controller必须声明遵循协议,将CLLocationManagerDelegate添加到类的顶部:

class ViewController: UIViewController, CLLocationManagerDelegate

想念如果接受定位警高,要动locationManager(_:,didUpdateLocations:)道。每当定位信息变更之经常,这个措施就是会见叫调用:

func locationManger(manager: CLLocationManager!,didUpdateLocations locations: [AnyObject]!) {
    println("Location found")
}

相思使以另外时刻都能接收Core
Location的错误警告,需要用locationManager(_: didFailWithError:)方法:

func locationManager(manager: CLLocationManager!, didFailWithError error:NSError!) {
    println("Error!")
}

如果以协议并运用中的方式后,就务须使安装delegate的性能:

locationManager.delegate = self

在激活定位服务前,
用户必须允许app使用用户的岗位信息。定位服务产生有限种植特许项目。第一种是requestWhenInUseAuthorization;授权App仅限前台运行的常常采取位置信息。
第二种是requestAlwaysAuthorization.
授权App在前台要后台运行都得以博得用户之位置信息,第二独授权都见面为app提供追踪用户位置的力。调用授权的章程是:

locationManager.requestWhenInUseAuthorization()

locationManager.requestAlwaysAuthorization()

得授权后,调用startUpdatingLocation()计被定位服务:

locationManager.startUpdatingLocation()

如此这般,locationManager会根据相关要求开追踪并返用户位置信息。

Page 216 | Chapter 8 : Maps and Location

locationManager (_:, didUpdateLocations:)方法会提供CLLocation数组,按照出现前后顺序排列。数组中足足会有一个目标。数组中之各一个靶还是是一个CLLocation。CLLocation这个类似为切实的岗位整理组织CLLocationManager的岗位数据。CLLocation跟踪地理坐标,海拔,速度,方向,甚至连定位准确度。CLLocation拥有广大灵光之属性:

coordinate
CLLocationCoordinate2D, 纬度坐标和经度坐标
altitude
海拔高度,单位:米
timestamp
取到多少常常之时日跟日期
description
就此字符串的格式返回CLLocation,可以为此print()打印出来

告牢记,一旦而取了而得之信息,必须休定位服务作用。为了停息这些劳务,在CLLocationManager中调用stopUpdatingLocation()
:

manager.stopUpdatingLocation()

选个例子,在locationManager( manager: ,didUpdateLocations:)方法吃取得位置后,常常会停下定位服务。之前以CLLocationManager中开创的那些变量非常适合处理时之这种状况。

**明白了!** iOS 8模拟器在学Core
Location时会面世一些前后不均等的作为。如果固定服务没有调用,在Info.plist文件中上加三独键:
NSLocationWhenInUsageDescription NSLocationAlwaysUsageDescription
NSLocationUsageDescription 每个键对应的价值设置成Always或者When in Use
这三只键值会帮打开定位服务

Core Location | Page 217

发送 http 请求

HTTP也是应用层协议。HTTP(HyperText Transport
Protocol)定义了一个基于请求/响应模式的、无状态的、应用层的磋商,用于从万维网服务器传输超文本及地面浏览器。绝大多数底Web开发,都是构建以HTTP协议之上的Web应用。客户端组织并发送
http 请求报文,包含 method、url、host、cookie
等信息,下面是看博客园首页时 http 请求报文的指南:

GET https://www.cnblogs.com/ HTTP/1.1
Host: www.cnblogs.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: __gads=ID=b62b1e22b7de2e02:T=1493954370:S=ALNI_MYRebVRavER2PJmwdeFwpl33ACNoQ;
If-Modified-Since: Mon, 27 Nov 2017 12:21:04 GMT

伸手求头里之每个字段都来分别的意,具体意思可查看 http 协议相关文章。

Map Kit

Map
Kit框架提供地图和方向,地图可以展示及大街级别的消息,3D建筑,卫星图像,或者用两端结合起来。地图自动响应缩小、放大、平移、倾斜等手势动作,还能当地图上标注点同时添加注解。

TCP 传输报文

TCP 将 http
长报文划分为短报文,通过“三蹩脚握手”与服务器建立连接,进行保险传输。“三不成握手”建立连接的经过以及通话极像:

客户端:喂,我要和 Server 通话
服务端:你好,我是 Server,你是 Client 吗
客户端:没错,我是 Client

连日来起成,接下去便可以正式传送数据了。

数码传完之后断开tcp连接还要经“四糟挥手”,大概意思如下:

客户端:Server 小宝贝,我谈说罢了,你挂电话吧
服务端:我不悬挂,我非挂,你先挂,你莫悬挂我啊未挂
—————- Client 阵无语 ————–
服务端:你挂了吧
客户端:行,那我事先挂了

迄今为止完成了一如既往软完整的资源要响应。

需留意的凡,浏览器对同一域名下并发的tcp连接数是起限量的,2单至10只非顶。为了解决这个资源加载瓶颈,有几种流行的优化方案:

MKMapView

Map
Kit提供MKMapView视图类来展示地图,MKMapView可以显示地图,管理用户的输入信息,展示起定义注释。

MKMapView也有一个delegate属性。和CLLocationManager的delegate属性一样,MKMapView的delegate也能够接收updates。MKMapView
delegate需要以MKMapViewDelegate协议。设置delegate的法门是,从Storyboard的Editor中,将Map
View用Control拖动法拖动到Document Outline中之View
Controller文字上,然后弹出一个菜系,点击菜单中之delegate,这样即使在有关界面及安好了delegate。

MKMapView有成百上千有益于之属性与措施。举了例子,MKMapView不用添加任何代码就得在地图上亮用户地理位置。我们将性能设置showsUserLocationtrue,就足以以地形图上展示用户信息了:

myMapView.showsUserLocation = true

用户的职务将会晤以地形图及之所以一个蓝点标注出。

貌似我们管用户所在位置设置也地图的主干点。如果想移动还设置地图中心点,需要装centerCoordinate属性,centerCoordinate性能需要CLLocationCoordinate2DCLLocationCoordinate2D举凡经度和纬度的坐标,被从包改成一个独自的变量。通过CLLocationCoordinate2DMake方式创建CLLocationCoordinate2D

var coordinates: CLLocationCoordinate2D = CLLocationCoordinate2DMake(100,100)

偶尔我们会于地形图及放位置,当region性设置好后,放大后图像会活动调整。region属性需要MKCoordinateRegion对象,然而,大部分景下,比打创建新的靶子,编辑时的region对象会再简约有:

var updatedRegion: MKCoordinateRegion = myMapView.region
updatedRegion.span.longitudeDelta = updatedRegion.span.longitudeDelta * 2.0
updatedRegion.span.latitudeDelta = updatedRegion.span.latitudeDelta * 2.0 
myMapView.region = updatedRegion

Page 218 | Chapter 8 : Maps and Location

longitudeDeltalatitudeDelta都是span的同等有的,span是面积来差不多那个,以centerCoordinate为核心可显示的增幅与惊人。

# 资源打包,合并请求

比如页面样式全部封装在一个 css 文件内,页面逻辑全部卷入在一个 js
文件内,图片拼合成雪碧图,这样只是使得减少页面的资源要数量。webpack
是当前最风靡的模块打包工具之一,它好以页面内有着资源(包括js,css,图片,字体等等)都自包上一个
js 文件,不明觉厉。

Directions (方向)

Map Kit还能以App中提供建议计划路线导航功能。MKDirections
API可以依据苹果服务器的盘算提供线路方向。有步行线路规划,驾驶线路设计,花费的日,和其它可选的路子。地图上之每个点用MKMapItem表示,MKMapItem包含了地图及有关地方的享有消息,这些信包括地图位置,坐标值,地点名称等数码。MKMapItem还会传遍地图应用达到,使用地图应用上重复多高档功能。

开创MKMapItem最简便易行的计是使mapItemForCurrentLocation措施,这个点子取得用户之岗位然后因职务创建MKMapItem:

var mapItem: MKMapItem = MKMapItem.mapItemForCurrentLocation()

MKMapItem类有一对利于之性。name属性是一个字符串,提供地方的描述性名称。phoneNumber属性也是字符串,存储这个职位的电话号码。URL属性存储位置的网址。

MKMapItem创建后,就可轻松的将岗位传递至地图应用及,使用导航功能。openMapWithItems: launchOptions方可吸纳一个反复组,数组中包括总括同交多个之MKMapItem。通过launchOptions,这么几items就见面让射到地图应用及。MKLaunchOptionsDirectionsModeKey深受地图应用基于两单点来供设计路。

# 域誉为拆分,资源分流储存

当浏览器为服务器请求一个静态资源时,会先行发送该域名下的
cookies,服务器对这些 cookie
根本无会见召开另外处理,因此其只是以毫无意义的消耗带来富,所以应保证于静态内容之求是无
cookie 的要(也不怕是所谓的 cookie-free)。将站点的
js、css、图片等静态文件在一个专门的域名下看,由于该域名和主站域名不同,所以浏览器就非见面管主域名下的
cookies
传给该域,从而减少网络开,特别是零星静态文件特别多的事态下效果显著。

另一方面,由于浏览器是根据域名的并发连接数限制,而非是页面。因此用资源配置于不同之域名下得使页面的总并发连接数得到线性提升。

Plotting Points (绘制点、标注点)

苹果公司供了一个于地形图上绘制点的方,叫annotations(注解)。annotations是好定义一个地方或者一个触及。它时时用于突出感兴趣的地方,提供更多细节。annotations也装有一个而选标注气泡(optional
callout
bubble)。气泡代表有些职位的名字以及地址那样的消息。气泡也是只是点击的,可以像button(按钮)那样接收用户之动作。

annotations由片有组成,注解对象(annotation
object)和注释视图(annotation view)。annotation
object是一个轻量级对象,管理annotation中的数据。annotation
object是由MKPointAnnotation类中开创的。annotation
view是从MKPinAnnotationView类中创造的。annotation
view用来当地形图及号pin(大头针)。

Map Kit | Page 219

其三只步将annotation添加到MKMapView中。第一步是吧谢兴趣之地址创建一个MKPointAnnotation:

var point = MKPointAnnotation()
point.coordinate = CLLocationCoordinate2DMake(37.7756, -122.4193)
point.title = "San Francisco"

接下来,遵循MKMapView协议,回应mapView(_: viewForAnnotation:)办法,此方法可以回收利用annotation
view,就像是table view中吗起道可以再利用cell:

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!)-> MKAnnotationView! {
    var pin = MKPinAnnotationView(annotation: annotation, reuseIdentifier:"pinIdentifier")
    return pin
}

最后,调用addAnnotation道,这样,就拿annotation添加到地图中了:

mapView.addAnnotation(point)

现今,我们来做定你首先个以了地图App吧。

# Connection: keep-alive,复用已成立的连年

于 http 早期,每个 http 请求都设开辟一个 tcp
连接,请求了便关这个连续,导致每个请求都要来同样不折不扣“三潮握手”和“四不好挥手”,从而磨磨唧唧多出来大量无谓的等候时。就哼于下吃饭,等饭当半只钟头,端上十分钟吃了了,结账排队而等了一半单小时,要是刚进去就吃现的吃了便走那么多爽朗啊。keep-alive
干的即是即刻宗事,当第一独请求数据传了后,服务器说“客户端你不要关是连续,直接换下只请求,我非思量再握你的破手了”。这样下蛋只请求虽一直传输数据而无用先走“三涂鸦握手”的流水线了。这好于你而失去吃饭,吃而最爱的吉祥如意烧肉,饭店以今率先只客人点红烧肉的当儿便炒了平等生锅红烧肉,你点餐的下一直吃现的虽行了,吃了却直接飞,哈哈美滋滋。

Exercise: Adding Maps to the Passport App

演习请见此链接

Page 220| Chapter 8 : Maps and Location

# 控制缓存

用静态资源强制缓存在客户端,通过添加文件指纹相当措施要客户端只请发生了反的资源,可使得降低静态资源要数量。具体但参考前端静态资源缓存控制策略。

# 延迟加载,懒加载,按需要加载

不少页面浏览量虽然非常酷,但事实上大怪比例用户扫了第一屏便径直跨越走了,第一屏以下的始末用户从就不感兴趣。
对于超大流量的网站,这个题目进一步重要。这时可因用户的作为进行以需加载,用户使用了便错过加载,用无交就是无去加载。

上述且是从压缩建立tcp连接数量的角度去优化页面性能,之后会享受更多前端性能优化点的实用方法。

IP 寻址

Internet Protocol
是概念网络中相互互联规则之磋商,主要解决逻辑寻址和网络通用数据传格式两单问题。

抱有连接到因特网上之装置都见面被分配一个唯一的 IP
地址,就比如网购时填的收货地址一样。由于一个大网设施的 IP
地址可以换,但是 MAC
硬件地址(就像身份证号)一般是原则性不更换的,所以率先使用 ARP
协议来找到对象主机的 MAC
硬件地址。当通信的双面非以同一个局域网时,需要频繁转账(路由器)才会找到最后之靶子,在转发的历程被尚需通过下一个中转站的
MAC 地址来找下一个转会目标。

传层传来的 TCP 报文会在即时等同重叠为 IP
封装成网络通用传输格式——IP数据包,IP
数据包是真正在网里开展传输的数码核心单元。

经过逻辑寻址定位到眼前应用层 DNS 解析出的 IP
地址的主机网络位置,然后将多少以 IP 数据包的格式发送至那去。

封装成帧

数码链路层负责用 IP
数据包封装成适合在物理网络及传的帧格式并传。设计数据链路层的重点目的就是于原的、有误的情理传输线路的底子及,采取错检测、差错控制与流量控制相当措施,将发出不是的物理线路改进成逻辑上随便差错的多少链路,向网络层提供高质量之劳务。当以复用技术时,一长物理链路上可生出差不多漫长数据链路。

物理传输

面这么多层其实还是以吗歧之目的对要传输的数量开展打包处理,而物理层则是透过各种传导介质(双绞线,电磁波,光纤等)以信号的形式拿上面各层封装好之数据物理传送过去。

由来一个 http
请求漂洋过海终于到了服务器,接下就是打物理层到应用层向上传递,将打包的数据一致层层剥起来,服务器在应用层拿到极致老的恳求信息后高速处理完毕,然后就起来为客户端发送响应信息。这次是坐服务器也起点,客户端也终点还倒相同全勤五叠协议栈。

服务器的响应消息跋山跋涉终于抵达了浏览器,接下去便页面渲染(更具体可参照浏览器中工作原理)。

页面的渲染工作主要是因为浏览器的渲染引擎来好(这里以Chrome为条例)。

页面渲染主流程

下是渲染引擎在取内容后的骨干流程:

解析html构建dom树 -> 解析css构建render树 -> 布局render树 ->
绘制render树

渲染引擎首先初步解析html,并将标签转化为dom树被之dom节点。接着,它解析外部css文件以及style标签中的体裁信息,这些体信息与html标签中的可见性指令以给用来构建另一样蔸树——render树。render树构建好了后,将会实行布局过程,该过程用规定render树每个节点在屏幕及之适坐标。最后是绘制render树,即满历render树的每个节点并以它绘制到屏幕及。

偷盗了同一张图(Chrome和Safari所用外核webkit页面渲染主流程):


webkit页面渲染主流程

为更好之用户体验,渲染引擎将会尽量早地将内容绘制在屏幕上,而无会见等及具备的html都分析完成后又失去构建、布局和制图render树,它是分析了部分情节即绘制有情,同时可能还在通过网下载其余内容(图片,脚本,样式表等)。比如说,浏览器在代码中发觉一个
img
标签引用了一致摆放图纸,于是便向服务器出图片请,此时浏览器不见面等及图片下载完,而是会连续分析渲染后面的代码,等到服务器返回图片文件,由于图片占用了必然面积,影响了后面段落的布局,浏览器就是见面回过头来重新渲染这有代码。

dom树和render树的涉嫌

render树节点和dom树节点相对应,但这种对应关系匪是一对一底,不可见的dom元素不见面叫插入render树,例如head元素、script元素等。另外,display属性为none的素也未见面在渲染树被起(visibility属性为hidden的要素以应运而生在渲染树中,这是因visibility属性为hidden的因素虽然不可见但保留了元素的占位)。

再就是偷走了扳平摆放图:

render树与dom树

布局render树(layout)

当渲染对象吃创造并补充加至render树后,它们并从未位置与大小,计算这些价值的进程叫layout(布局)。

布局之坐标体系相对于清渲染对象(它对应文档的html标签,可用
document.documentElement 拿到),使用top和left坐标。根渲染对象的岗位是
(0,0),它的大大小小是viewport即浏览器窗口的可见有。布局是一个递归的经过,由穷渲染对象开始,然后递归地通过有些要具有的层级节点,为每个需要几哪里信息之渲染对象进行计算。

为了不因每个微变化还通重复布局,浏览器采用一个 dirty
bit(页面还写标志位)系统,一个渲染对象来了转移或者被补充加了,就标志它同她的children为dirty——需要layout。

当layout在整棵渲染树触发时,称为全局layout,这或许当底下这些状况下出:

  • 一个大局的样式改变影响有的渲染对象,比如字号的改。
  • 窗口resize。

layout也得以是增量的,这样光来标志吧dirty的渲染对象见面重布局(也以导致部分分外的布局)。增量layout会在渲染对象dirty时异步触发,例如,当网络收到至新的情节并加加至dom树后,新的渲染对象会补充加至render树中。

绘制(paint)

绘图阶段,遍历render树并调用渲染对象的paint方法将它们的内容显示在屏幕及。和布局一样,绘制也可以是大局的(绘制完整的养)或增量的。在增量的绘图过程中,一些渲染对象为不影响整棵树的道转,改变之渲染对象要其当屏幕及之矩形区域失效(invalidate),这将造成操作系统将其当做dirty区域,并起一个paint事件,操作系统很巧妙的拍卖此过程,并以大半独区域统一为一个。

浏览器总是试着坐最好小的动作应一个弯,所以一个元素颜色的转变将仅造成拖欠因素的重绘,元素位置的浮动将导致元素的布局及重绘,添加一个dom节点,也会见促成这个因素的布局与重绘。一些关键的转移,比如增加html元素的字号,将见面招缓存失效,从而挑起上上下下render树的布局及重绘。

当交绘制了,页面就全地表现在咱们眼前了。

看似重略不了的操作,背后支持的技术链已经复杂到不可想像。上面才是初步的大概,其中的各一样步深挖潜进去都是一致帮派大学问。不过我们前端了解一下便行了,没必要比这个强大,不然就舍本逐末了。

觉得不错就接触个推荐吧:)