每周学习总结——第一周

1.typeof

typeof undefined === 'undefined' // true

typeof null === 'object' // true
let a = null
if (!a && typeof a === 'object')// 判断null
复制代码

虽然array 、object、function的在基本类型中都是Object,但是使用typeof获取结果能过区分function

let a = function() {}
typeof a === 'function' //true

let b = []
let c = {}
typeof b === 'array' //false
typeof b === 'object' //true
typeof c === 'object' // true
复制代码

区分array与object必须通过其他方式

let a = []
if (Array.isArray) {
    Array.isArray(a)
} else {
    Object.toString.call(a) === [Object Array]
}
复制代码

typeof获取到的返回值是字符串

typeof typeof {} === 'string' // true
复制代码

2.line-height

line-height让文字居中与height没有关系,设置line-height后文字水平中线仅与line-height高度有关(学习内容来源张鑫旭

/*css*/
div{
    line-height:40px;
    height: 30px;
}
// 文字内容水平中线会在20px处
复制代码

当元素存在内容,设置line-height可以达到设置高度的效果,基于这个特性,在没有固定高度要求或者仅排版文字或者图片内容的时候,line-height可以用来替代height,并且将内容表现为水平居中,文字和图片排版都可以;在inline box模型中,有一个line boxes,设置line-height后会给line boxes一个高度,如果div没有设置height,那么其高度就由line boxes撑开。但是有一个问题,这种高度无法继承,也无法覆盖height

  <style>
  .parent {
    width: 100px;
    line-height: 150px;
    background: red; 
  }
  .child {
    width: 100%;
    height: 100%;
    background: blue
  }
  </style>
</head>

<body>
  <div class="parent">
    asdfasdfasdfasdfasdfasdfffffffffffffffffffffffffffffffffffffff
    <div class="child">
    </div>

  </div>
</body>
// 出现一个红色的盒子,子类无法继承高度,不显示,如果parent内容不存在,界面上无任何内容,因为line-height无法撑开没有内容的区域,line boxes是作为一个包裹文字的中间模型存在,当没有内容,无法产生line boxes
复制代码

line-height 也可以设置百分比和数值,差别在于百分比具有继承性,使用百分比后续子元素继承的时候,是继承通过百分比转成的px像素大小,而数值1.2这种,是先继承1.2,显示的时候再计算。line-height属于行高,其设置的仅仅为单行内容高度

3.vertical-align

首先,是关系vertical-align属性描述

通过调节 数值和百分比,可以直接调节内容相对于基线的位置,百分值%的计算来源于当前内容行高。例如line-height 20px,那么 vertical-align:-10%内容就是2px

经常会出现vertical不起作用的情况,那是因为vertical仅仅适用于inline-block元素,可以相对影响inline元素。vertical-align设置middle,top,bottom仅与父标签有关,与对标的文字内容无关

4.MutationObserver

mutationObserver的出现是为了解决mutationEvent所带来的问题,mutationEvent的事件无法取消,这是设计所带来的问题,appendChild,remove等添加删除节点都会执行mutationEvent事件。mutationEvent事件是同步执行的,意味着每次修改dom都会触发,对性能影响很大,而且会造成安全问题

document.addEventListener('DOMNodeInserted', function() {
    var newEl = document.createElement('div');
    document.body.appendChild(newEl);
});
复制代码

这样,每次appendChild会执行DOMNodeInserted,而同样每次坚挺到inserted都会执行一次appenChild,从而让浏览器崩溃

mutationObserver在性能和事件处理方面有了很大进步,而且是异步进行操作的,属于与nextTick,then同一类型的微任务,但是兼容性不够,最低只能适配ie11。mutationObserver的使用也很简单,

let observe = new MutationObserver(function(mutations,observer){})
复制代码

生成observe有三个总要属性: 1.observe(target,options),target表示你要监听的dom对象或者说目标,option是一个对象,通过设置它的属性,来表达所要进行的监听方式

option属性

childList:设置true,表示观察目标子节点的变化,比如添加或者删除目标子节点,不包括修改子节点以及子节点后代的变化

attributes:设置true,表示观察目标属性的改变

characterData:设置true,表示观察目标数据的改变

subtree:设置为true,目标以及目标的后代改变都会观察

attributeOldValue:如果属性为true或者省略,则相当于设置为true,表示需要记录改变前的目标属性值,设置了attributeOldValue可以省略attributes设置

characterDataOldValue:如果characterData为true或省略,则相当于设置为true,表示需要记录改变之前的目标数据,设置了characterDataOldValue可以省略characterData设置

attributeFilter:如果不是所有的属性改变都需要被观察,并且attributes设置为true或者被忽略,那么设置一个需要观察的属性本地名称(不需要命名空间)的列表
复制代码

disconnect:阻止观察者观察任何改变

takeRecords:清空记录队列并返回里面的内容

与mutationEvent做对比:

一般用法:

function callBack() {}
let dom = documment.getElementById('')
let observe = new MutationObserver(callBack)
observe.observe(dom,{childList:true,subtree:true})
dom.appendChild(childDom)
// 当dom执行添加操作的时候,会执行callBack
复制代码

使用mutationObserver执行异步操作。类似nextTick或者preomise.then这种微任务操作

 let mutation = window.MutationObserver || window.webkitMutationObserver
  let observer = new mutation(callback)
  let element = document.createTextNode('')
  observer.observe(element, {
    characterData: true
  })
  element.data = 1
  // 创建一个空的文本节点,监听它的数据变化,然后修改数据,就会执行一次mutationObserver监听,从而达到异步操作的效果
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值