Vue的基本原理
Vue 生命周期
Vue 实例有⼀个完整的⽣命周期,也就是从开始创建、初始化数据、编译模版、挂载Dom -> 渲染、更新 -> 渲染、卸载 等⼀系列过程,称这是Vue的⽣命周期。
(1)冒号(:)用于CSS3伪类,双冒号(::)用于CSS3伪元素。
(2)::before就是以一个子元素的存在,定义在元素主体内容之前的一个伪元素。并不存在于dom之中,只存在在页面之中。
注意: :before 和 :after 这两个伪元素,是在CSS2.1里新出现的。起初,伪元素的前缀使用的是单冒号语法,但随着Web的进化,在CSS3的规范里,伪元素的语法被修改成使用双冒号,成为::before、::after。
(1)有空格时会有间隙,可以删除空格解决;
(2)margin正值时,可以让margin使用负值解决;
(3)使用font-size时,可通过设置font-size:0、letter-spacing、word-spacing解决;
他们都是 CSS 预处理器,是 CSS 上的一种抽象层。
为什么要使用它们?
媒体查询(Media Queries)是CSS3引入的一个重要概念,它允许开发者根据不同的设备特性(如屏幕尺寸、分辨率、色彩深度、设备方向等)来应用特定的CSS样式规则。这使得网站能够提供更加优化的视觉体验,无论是在大屏幕的台式机、笔记本电脑上,还是在小屏幕的智能手机和平板电脑上。
1 | @media [not] <media_type> and (<media_feature>: <value>) { |
其中各个部分的含义如下:
not 是可选的关键词,用于否定媒体类型。<media_type> 是媒体类型,如 all、print、screen 等,表示目标输出设备的类型。and 连接符用于组合多个媒体特性。<media_feature> 是媒体特性,比如 width、height、orientation、color 等,它们描述了设备的物理属性。<value> 是与媒体特性相关的值,例如 600px 或者 landscapeCSS工程化是指在大型项目中,为了更好地管理和维护CSS代码,通过一系列的方法、工具和技术来组织、优化、构建和维护CSS的过程。随着前端项目的规模越来越大,CSS工程化变得尤为重要,它帮助开发者应对代码复用、模块化、性能优化、可维护性和团队协作等方面的挑战。
以下是CSS工程化的一些关键方面:
通过这些策略,CSS工程化不仅提高了代码的质量和性能,还促进了团队协作,降低了维护成本,使前端开发变得更加高效和可持续。
以图片显示为例:
window.innerHeight 是浏览器可视区的高度;document.body.scrollTop || document.documentElement.scrollTop 是浏览器滚动的过的距离;imgs.offsetTop 是元素顶部距离文档顶部的高度(包括滚动条的距离);img.offsetTop < window.innerHeight + document.body.scrollTop;通常 z-index 的使用是在有两个重叠的标签,在一定的情况下控制其中一个在另一个的上方或者下方出现。z-index值越大就越是在上层。z-index元素的position属性需要是relative,absolute或是fixed。
z-index属性在下列情况下会失效:
CSS3的transform属性允许对元素进行变形操作,这包括旋转、缩放、倾斜和移动等效果。
浮动的定义: 非IE浏览器下,容器不设高度且子元素浮动时,容器高度不能被内容撑开。 此时,内容会溢出到容器外面而影响布局。这种现象被称为浮动(溢出)。
在CSS中,clear属性用于指定元素的哪一侧不允许出现浮动元素。当一个元素周围有浮动元素时(即,使用了float属性的元素),该元素可能会与这些浮动元素重叠,或者被推到浮动元素后面。clear属性可以防止这种情况发生,确保元素在浮动元素之下或之后开始。
clear属性可以接受以下值:
BFC,全称 Block Formatting Context(块级格式化上下文),是CSS中一种重要的渲染规则,它决定了页面上块级元素如何布局以及它们与其他元素之间的相互作用。BFC可以看作是一个独立的容器,其中的元素不会受到外部元素的影响,同样,BFC外部的元素也不会受到BFC内部元素的影响,除非它们直接与BFC边缘接触。
BFC的创建条件如下:
BFC的主要特性包括:
创建BFC的一个常见用途是解决浮动元素导致的父元素高度塌陷问题。通过将父元素设置为BFC(比如使用overflow: auto),可以确保父元素包含其内部的浮动子元素,从而正确地计算高度。
例如,为了防止高度塌陷,可以这样做:
1 | .parent { |
1 | <div class="parent"> |
在现代布局技术(如Flexbox和Grid)中,BFC的概念仍然重要,但实现布局的方式更为简单和直观。然而,在处理遗留代码或特定布局需求时,理解BFC的工作原理仍然是非常有用的。
在CSS布局中,margin重叠问题,也称为margin折叠(margin collapsing)或margin合并,指的是当两个相邻的块级元素的上外边距(margin-top)和下外边距(margin-bottom)遇到彼此时,它们不会简单相加,而是合并成一个单一的外边距,这个外边距的大小通常是这两个外边距中的最大值。
Margin重叠的几种情况:
1 | .element { |
overflow为auto、scroll或hidden。display: flex或display: grid。float属性(非none)。position: absolute或position: fixed。display: inline-block或display: table-cell。1 | .container { |
:before或:after),并设置一些高度或边框,也可以防止margin折叠。1 | .element:after { |
margin:虽然不是直接解决问题,但有时使用负margin可以帮助调整布局以达到预期的效果。1 | 深色版本 |
position的属性有哪些,区别是什么CSS 中的 position 属性用于控制元素的定位方式,它有五个主要的值,每个值定义了元素不同的定位行为。以下是这些值及其主要区别:
static:position 的默认值。top, right, bottom, left 和 z-index 属性对静态定位的元素没有效果。relative: top, right, bottom, left 属性来指定偏移量。z-index值。absolute:position 不是 static 的祖先)定位。 top, right, bottom, left 属性确定位置。fixed:absolute,但元素相对于浏览器窗口定位,即使页面滚动,元素位置不变。top, right, bottom, left 属性确定位置。sticky:static,一旦到达边界则表现为 fixed。top, right, bottom, left 属性确定。height 或 max-height 来确保正确的行为。每个 position 属性值都有其特定的用途和应用场景。例如,relative 常用于微调元素位置而不影响布局,absolute 和 fixed 用于创建弹出窗口、侧边栏或其他需要精确控制位置的元素,而 sticky 则用于创建随滚动显示和隐藏的导航条等。理解这些定位类型是CSS布局的关键部分。
**栈:**由系统自动分配,一般存放函数参数值、局部变量的值等。由编译器自动创建与释放。其操作方式类似于数据结构中的栈,即后进先出、先进后出的原则。
堆区(heap):一般由程序员申请并指明大小,最终也由程序员释放。如果程序员不释放,程序结束时可能会由OS回收。对于堆区的管理是采用链表式管理的,操作系统有一个记录空闲内存地址的链表,当接收到程序分配内存的申请时,操作系统就会遍历该链表,遍历到一个记录的内存地址大于申请内存的链表节点,并将该节点从该链表中删除,然后将该节点记录的内存地址分配给程序。
全局区/静态区:顾名思义,全局变量和静态变量存储在这个区域。只不过初始化的全局变量和静态变量存储在一块,未初始化的全局变量和静态变量存储在一块。程序结束后由系统释放。
文字常量区:这个区域主要存储字符串常量。程序结束后由系统释放。
程序代码区:这个区域主要存放函数体的二进制代码。
Texture原名AsyncDisplayKit,是FaceBook为解决页面卡顿提供方案。他自己重新实现一整套异步布局和渲染机制来达到预期结果。
该框架从一下三个方面来优化
渲染,对于大量图片,或者大量文字(尤其是CJK字符)混合在一起时。而文字区域的大小和布局,恰恰依赖着渲染的结果。ASDK尽可能后台线程进行渲染,完成后再同步回主线程相应的UIView。
布局。ASDK完全弃用了Autolayout,另辟蹊径实现了自己的布局和缓存机制。关于布局的问题会在下一篇讲到。
系统objects的创建与销毁。由于UIKit封装了CALayer以支持触摸等显示以外的操作,耗时也相应增加。而这些同样也需要在主线程上操作。ASDK基于Node的设计,突破了UIKit线程的限制。
对于一般UIView和CALayer来说,因为他们不是线程安全的,任何相关操作都需要在主线程进行。ASDK引入了Node的概念来解决UIView/CALayer只能在主线程上操作的限制。
ASDisplayNode主要特点:
- 每个Node对应相应的UIView或者CALayer,从开发者的角度而言,只需要将初始化UIView的代码稍作修改,替换为创建ASDisplayNode即可。在不需要接受用户操作的Node上可以开启isLayerBacked,直接使用CALayer进一步降低开销。根据Scott的研究UIView的开销大约是CALayer的5倍。
- Node默认是异步布局/渲染,只有在需要将frame/contents等同步到UIView上才会回到主线程,使其空出更多的时间处理其他事件。
- ASDK只有在认为需要的时候才会异步地为Node加载相应的View,因此创建Node的开销变得非常低。同时Node是线程安全的,可以在任意queue上创建和设置属性。
- ASDK不仅有与UIView对应的大部分控件(如ASButtonNode、ASTextNode、ASImageNode、ASTableNode等等),同时也bridge了大多数UIView的方法和属性,可以非常方便的操作frame/backgroundColor/addSubnode等,因此一般情况下只要对Node进行操作,ASDK就会在适当的时候同步到其View。如果需要的话,当相应的View加载之后(或访问node.view手动触发加载),也可以通过node.view的方式直接访问,回到我们熟悉的UIKit。
- 当实现自定义View的时候,ASDisplayNode提供了一个初始化方法initWithViewBlock/initWithLayerBlock,就可以将任意UIView/CALayer用Node包裹起来(被包裹的view可以使用autolayout),从而与ASDK的其他组件相结合。虽然这样创建的Node与一般view在布局和渲染上的差异不大,但是由于Node管理着何时何地加载view,我们仍然能得到一定的性能提升。