<br />
讯享网
讯享网<strong>重绘</strong>:当页面元素样式的改变不影响布局时,浏览器重新对元素进行更新的过程叫做重绘。 <strong>重排</strong>:当页面元素的尺寸、结构、或某些属性发生改变时,浏览器重新渲染部分或全部文档的过程叫做重排也叫做回流。 讯享网<br />
由于回流和重绘会带来很大的性能开销,所以在开发中我们要尽量避免或减少回流和重绘的次数来提高性能
1. 避免频繁读取会引发回流/重绘的属性,如果确实需要多次使用,就用一个变量缓存起来。
2. 对具有复杂动画的元素使用绝对定位,使其脱离文档流,否则会引起父元素及后续元素频繁回流。
3. 要避免频繁的去操作DOM,可以通过创建documentFragment,完成所有所有DOM操作后,最后再把它添加到文档中。
4. 避免频繁操作样式,最好一次性重写style属性,或者将样式列表定义为class并一次性更改class属性。
- 重绘的性能开销较低,重排的性能开销较高;
- 回流(重排)一定会触发重绘,而重绘不一定会回流(重排)
1. 使用模板字符串
使用+运算符拼接字符串来构建有意义的字符串,这是过时的做法。此外,将字符串与动态值(或表达式)连接可能会导致计算或表达错误。
let name = 'Charlse';
let place = 'India';
// 使用`+`运算符的字符串连接
2. isInteger
有一种更简洁的方法可以知道值是否为整数。JavaScript 的 Number API 提供了名为 isInteger() 的方法来实现此目的。这是非常有用的,最好了解一下。
let mynum = 123;
let mynumStr = "123";
console.log(`${mynum} is a number?`, Number.isInteger(mynum));
console.log(`${mynumStr} is a number?`, Number.isInteger(mynumStr));
3. 使用 && 运算符化简表达式
让我们考虑一个具有布尔值和函数的情况。
let isPrime = true;
const startWatching = () => {
console.log('Started Watching!');
}
复制代码
像下面这样,通过检查布尔值来确定是否调用函数,代码太多了。
if (isPrime) {
startWatching();
}
能否通过 AND(&&)运算符使用简写形式?是的,完全可以避免使用 if 语句。
isPrime && startWatching();
4. 使用 || 运算符处理默认值
如果您想为变量设置默认值,可以使用 OR(||)运算符轻松实现。
let person = {name: 'Jack'};
let age = person.age || 35; // 如果 age 未定义,则将值设置为 35
console.log(`Age of ${person.name} is ${age}`);
5. 函数默认参数
在JavaScript中,函数实参(或形参)就像该函数的局部变量一样。调用函数时,您可以传递也可以不传递值。如果您不为参数传递值,则该值将是undefined,并且可能会导致一些多余的副作用。
有一种在定义参数时将默认值传递给函数参数的简单方法。在以下示例中,我们将默认值Hello传递给greetings函数的参数message。
let greetings = (name, message='Hello,') => {
return `${message} ${name}`;
}
console.log(greetings('Jack'));
console.log(greetings('Jack', 'Hola!'));
6. isArray
确定输入是否为数组的另一种有用方法。
let emojis = ['a', 'b', 'c', 'd'];
console.log(Array.isArray(emojis));
let obj = {};
console.log(Array.isArray(obj));
复制代码
7. undefined 和 null
undefined指的是还没有给变量定义值,但已经声明了该变量。
null本身是一个空且不存在的值,必须将其显式赋值给变量。
undefined和null并不严格相等,
undefined === null // false
链接:https://juejin.im/post/
在本文中,我们将值既不是null 也不是undefined 的表达式称为“已定义的(defined)”。
空值合并运算符(nullish coalescing operator)的写法为两个问号??。
a ?? b 的结果是:
- 如果a 是已定义的,则结果为a,
- 如果a 不是已定义的,则结果为b。
换句话说,如果第一个参数不是null/undefined,则?? 返回第一个参数。否则,返回第二个参数。
空值合并运算符并不是什么全新的东西。它只是一种获得两者中的第一个“已定义的”值的不错的语法。
我们可以使用我们已知的运算符重写result = a ?? b,像这样:
result = (a !== && a !== ) ? a : b;
通常?? 的使用场景是,为可能是未定义的变量提供一个默认值。
例如,在这里,如果user 是未定义的,我们则显示Anonymous:
讯享网 user; 讯享网alert(user ?? );
当然,如果user 的值为除null/undefined 外的任意值,那么我们看到的将是它:
user = ;
讯享网
alert(user ?? );
我们还可以使用?? 序列从一系列的值中选择出第一个非null/undefined 的值。
假设我们在变量firstName、lastName 或nickName 中存储着一个用户的数据。如果用户决定不输入值,则所有这些变量的值都可能是未定义的。
我们想使用这些变量之一显示用户名,如果这些变量的值都是未定义的,则显示 "Anonymous"。
让我们使用?? 运算符来实现这一需求:
讯享网 firstName = ;
lastName = ;
讯享网 nickName = ;
讯享网
alert(firstName ?? lastName ?? nickName ?? );
或运算符|| 可以以与?? 运算符相同的方式使用。
例如,在上面的代码中,我们可以用|| 替换掉??,也可以获得相同的结果:
讯享网 firstName = ;
lastName = ;
讯享网 nickName = ;
讯享网
alert(firstName || lastName || nickName || );
或|| 运算符自 JavaScript 诞生就存在,因此开发者长期将其用于这种目的。
另一方面,空值合并运算符?? 是最近才被添加到 JavaScript 中的,它的出现是因为人们对|| 不太满意。
它们之间重要的区别是:
- || 返回第一个 真 值。
- ?? 返回第一个 已定义的 值。
换句话说,|| 无法区分false、0、空字符串"" 和null/undefined。它们都一样 —— 假值(falsy values)。如果其中任何一个是|| 的第一个参数,那么我们将得到第二个参数作为结果。
不过在实际中,我们可能只想在变量的值为null/undefined 时使用默认值。也就是说,当该值确实未知或未被设置时。
例如,考虑下面这种情况:
讯享网 height = ;
讯享网alert(height || );
alert(height ?? );
- height || 100 首先会检查height 是否为一个假值,发现它确实是。
- 所以,结果为第二个参数,100。
- height ?? 100 首先会检查height 是否为null/undefined,发现它不是。
- 所以,结果为height 的原始值,0。
如果高度0 为有效值,则不应将其替换为默认值,所以?? 能够得出正确的结果。
?? 运算符的优先级相当低:在 MDN table 中为5。因此,?? 在= 和? 之前计算,但在大多数其他运算符(例如,+ 和*)之后计算。
因此,如果我们需要在还有其他运算符的表达式中使用?? 进行取值,需要考虑加括号:
讯享网 height = ;
width = ;
讯享网
讯享网 area = (height ?? ) * (width ?? );
讯享网alert(area); 否则,如果我们省略了括号,则由于* 的优先级比?? 高,它会先执行,进而导致错误的结果。
讯享网 area = height ?? * width ?? ;
讯享网
area = height ?? ( * width) ?? ;
出于安全原因,JavaScript 禁止将?? 运算符与&& 和|| 运算符一起使用,除非使用括号明确指定了优先级。
下面的代码会触发一个语法错误:
讯享网 x = && ?? ;
这个限制无疑是值得商榷的,但它被添加到语言规范中是为了避免人们从|| 切换到?? 时的编程错误。
可以明确地使用括号来解决这个问题:
x = ( && ) ?? ;
讯享网
alert(x);
- Number: 任意数值
- String: 任意文本
- Boolean: true/false
- undefined: undefined
- null: null
- symbol:(ECMAScript 6 新定义)
- BigInt(ECMAScript 2020 新增)
- Object: 任意对象
- Array: 特别的对象类型(下标/内部数据有序)
- Function: 特别的对象类型(可执行)
通常我们会使用四种方法来判断JavaScript的类型,分别是:typeof、instanceof、constructor、toString(),接下来我们分别来看这几种方法使用以及区别
typeof是一个操作符,其右侧跟一个一元表达式,并返回这个表达式的数据类型。返回的结果用该类型的字符串(全小写字母)形式表示,包含这8种: number、bigInt、boolean、symbol、string、object、undefined、function,
引用类型,除了function返回function类型外,其他均返回object,其中,null 有属于自己的数据类型 Null , 引用类型中的 数组、日期、正则 也都有属于自己的具体类型,而 typeof 对于这些类型的处理,只返回了处于其原型链最顶端的 Object 类型
instanceof用来判断A是否为B的实例,表达式为:A instanceof B,如果A是B的实例,则返回true,否则返回false。instanceof检测的是原型,内部机制是通过判断对象的原型链中是否有类型的原型。
另外一种情况下,obj instanceof A 原表达式的值也会改变,就是改变对象 obj 的原型链的情况,虽然在目前的ES规范中,我们只能读取对象的原型而不能改变它,但借助于非标准的 proto 伪属性,是可以实现的。比如执行 obj.proto = {} 之后,obj instanceof A就会返回 false 了,但它不能检测 null 和 undefined。
由上图可以看出[]的原型指向Array.prototype,间接指向Object.prototype, 因此 [] instanceof Array 返回true, [] instanceof Object 也返回true。
instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型。
constructor是原型prototype的一个属性,当函数被定义时候,js引擎会为函数添加原型prototype,并且这个prototype中constructor属性指向函数引用, 因此重写prototype会丢失原来的constructor。 从原型链角度讲,构造函数就是新对象的类型。这样做的意义是,让对象诞生以后,就具有可追溯的数据类型
toString()是Object的原型方法,调用该方法,默认返回当前对象的[[Class]]。这是一个内部属性,其格式为[object Xxx],其中Xxx就是对象的类型。
对于Object对象,直接调用toString()就能返回[object Object],而对于其他对象,则需要通过call、apply来调用才能返回正确的类型信息。
这是因为toString为Object的原型方法,而Array 、Function等类型作为Object的实例,都重写了toString方法。不同的对象类型调用toString方法时,根据原型链的知识,调用的是对应的重写之后的toString方法(Function类型返回内容为函数体的字符串,Array类型返回元素组成的字符串.....),而不会去调用Object上原型toString方法(返回对象的具体类型),所以采用obj.toString()不能得到其对象类型,只能将obj转换为字符串类型;因此,在想要得到对象的具体类型时,应该调用Object上原型toString方法。
链接:https://juejin.im/post/0
props和$emit相信大家十分的熟悉了,这是我们最常用的vue通信方式。
props:props可以是数组或对象,用于接收来自父组件通过v-bind传递的数据。当props为数组时,直接接收父组件传递的属性;当 props 为对象时,可以通过type、default、required、validator等配置来设置属性的类型、默认值、是否必传和校验规则。
$emit:在父子组件通信时,我们通常会使用$emit来触发父组件v-on在子组件上绑定相应事件的监听。
2. v-slot
v-slot是 Vue2.6 版本中新增的用于统一实现插槽和具名插槽的api,用于替代slot(2.6.0废弃)、slot-scope(2.6.0废弃)、scope(2.5.0废弃)等api。
v-slot在 template 标签中用于提供具名插槽或需要接收 prop 的插槽,如果不指定 v-slot ,则取默认值 default 。
3. $refs/$parent/$children/$root
我们也同样可以通过 $refs/$parent/$children/$root 等方式获取 Vue 组件实例,得到实例上绑定的属性及方法等,来实现组件之间的通信。
$refs:我们通常会将 $refs 绑定在DOM元素上,来获取DOM元素的 attributes。在实现组件通信上,我们也可以将 $refs 绑定在子组件上,从而获取子组件实例。
$parent:我们可以在 Vue 中直接通过this.$parent来获取当前组件的父组件实例(如果有的话)。
$children:同理,我们也可以在 Vue 中直接通过this.$children来获取当前组件的子组件实例的数组。但是需要注意的是,this.$children数组中的元素下标并不一定对用父组件引用的子组件的顺序,例如有异步加载的子组件,可能影响其在 children 数组中的顺序。所以使用时需要根据一定的条件例如子组件的name去找到相应的子组件。
$root:获取当前组件树的根 Vue 实例。如果当前实例没有父实例,此实例将会是其自己。通过 $root ,我们可以实现组件之间的跨级通信。
4. $attrs/$listener
$attrs 和 $listeners 都是 Vue2.4 中新增加的属性,主要是用来供使用者用来开发高级组件的。
$attrs:用来接收父作用域中不作为 prop 被识别的 attribute 属性,并且可以通过v-bind="$attrs"传入内部组件——在创建高级别的组件时非常有用。
试想一下,当你创建了一个组件,你要接收 param1 、param2、param3 …… 等数十个参数,如果通过 props,那你需要通过props: ['param1', 'param2', 'param3', ……]等声明一大堆。如果这些 props 还有一些需要往更深层次的子组件传递,那将会更加麻烦。
而使用 $attrs ,你不需要任何声明,直接通过$attrs.param1、$attrs.param2……就可以使用,而且向深层子组件传递上面也给了示例,十分方便。
$listeners:包含了父作用域中的 v-on 事件监听器。它可以通过 v-on="$listeners" 传入内部组件——在创建更高层次的组件时非常有用,这里
5. provide/inject
provide/inject这对选项需要一起使用,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在其上下游关系成立的时间里始终生效。如果你是熟悉React的同学,你一定会立刻想到Context这个api,二者是十分相似的。
provide:是一个对象,或者是一个返回对象的函数。该对象包含可注入其子孙的 property ,即要传递给子孙的属性和属性值。
injcet:一个字符串数组,或者是一个对象。当其为字符串数组时,使用方式和props十分相似,只不过接收的属性由data变成了provide中的属性。当其为对象时,也和props类似,可以通过配置default和from等属性来设置默认值,在子组件中使用新的命名属性等。

6. eventBus
eventBus又称事件总线,通过注册一个新的Vue实例,通过调用这个实例的$emit和$on等来监听和触发这个实例的事件,通过传入参数从而实现组件的全局通信。它是一个不具备 DOM 的组件,有的仅仅只是它实例方法而已,因此非常的轻便。
我们可以通过在全局Vue实例上注册:
// main.js
Vue.prototype.$Bus = new Vue()
但是当项目过大时,我们最好将事件总线抽象为单个文件,将其导入到需要使用的每个组件文件中。这样,它不会污染全局命名空间:
// bus.js,使用时通过import引入
import Vue from 'vue'
export const Bus = new Vue()
当项目庞大以后,在多人维护同一个项目时,如果使用事件总线进行全局通信,容易让全局的变量的变化难以预测。于是有了Vuex的诞生。
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
有关Vuex的内容,可以参考Vuex官方文档,我就不在这里班门弄斧了,直接看代码。
主要思路利用时间戳判断,每次调用判断和上一次调用的时间差异确定是否需要调用。 throttle实际是一个工厂函数,可以将一个函数封装为一个带有节流功能的函数。
在一段时间内,不论触发多少期回调,都已最后一次为准。 比如:以用户拖拽改变窗口大小,触发 resize 事件为例,会触发组件重新布局,这里面只有最后一次调用是有意义的。
实现的话可以使用定时器执行函数,新调用发生时如果旧调用没有执行就清除之前的定时器。
<div class="spiral-tower">
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
<div class="cube">
<div class="face cube__front"></div>
<div class="face cube__back"></div>
<div class="face cube__right"></div>
<div class="face cube__left"></div>
<div class="face cube__top"></div>
<div class="face cube__bottom"></div>
</div>
</div>
body {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
margin: 0;
background: hsl(240, 56%, 98%);
}
*,
*::after,
*::before {
box-sizing: border-box;
transform-style: preserve-3d;
}
:root {
--grey-color-1: #bdc3c7;
--grey-color-2: #95a5a6;
--grey-color-3: #7f8c8d;
}
@mixin cube($width, $height, $depth) {
&__front {
@include cube-front($width, $height, $depth);
}
&__back {
@include cube-back($width, $height, $depth);
}
&__right {
@include cube-right($width, $height, $depth);
}
&__left {
@include cube-left($width, $height, $depth);
}
&__top {
@include cube-top($width, $height, $depth);
}
&__bottom {
@include cube-bottom($width, $height, $depth);
}
.face {
position: absolute;
}
}
@mixin cube-front($width, $height, $depth) {
width: var($width);
height: var($height);
transform-origin: bottom left;
transform: rotateX(-90deg) translateZ(calc(calc(var(#{$depth}) * 2) - var(#{$height})));
}
@mixin cube-back($width, $height, $depth) {
width: var($width);
height: var($height);
transform-origin: top left;
transform: rotateX(-90deg) rotateY(180deg) translateX(calc(var(#{$width}) * -1))
translateY(calc(var(#{$height}) * -1));
}
@mixin cube-right($width, $height, $depth) {
width: calc(var(#{$depth}) * 2);
height: var($height);
transform-origin: top left;
transform: rotateY(90deg) rotateZ(-90deg) translateZ(var(#{$width})) translateX(calc(var(#{$depth}) * -2))
translateY(calc(var(#{$height}) * -1));
}
@mixin cube-left($width, $height, $depth) {
width: calc(var(#{$depth}) * 2);
height: var($height);
transform-origin: top left;
transform: rotateY(-90deg) rotateZ(90deg) translateY(calc(var(#{$height}) * -1));
}
@mixin cube-top($width, $height, $depth) {
width: var($width);
height: calc(var(#{$depth}) * 2);
transform-origin: top left;
transform: translateZ(var($height));
}
@mixin cube-bottom($width, $height, $depth) {
width: var($width);
height: calc(var(#{$depth}) * 2);
transform-origin: top left;
transform: rotateY(180deg) translateX(calc(var(#{$width}) * -1));
}
.cube {
--cube-width: 12rem;
--cube-height: 12rem;
--cube-depth: 0.5rem;
@include cube(--cube-width, --cube-height, --cube-depth);
width: 12rem;
height: 0.5rem;
transform-origin: center center 6rem;
animation: spin 3s ease-in-out alternate infinite;
&__front {
background-color: var(--grey-color-1);
}
&__back {
background-color: var(--grey-color-3);
}
&__right {
background-color: var(--grey-color-1);
}
&__left {
background-color: var(--grey-color-2);
}
&__top {
background-color: var(--grey-color-3);
}
&__bottom {
background-color: var(--grey-color-2);
}
}
.spiral-tower {
display: grid;
grid-auto-flow: row;
transform: rotateX(-30deg) rotateY(45deg);
.cube {
@for $i from 1 through 48 {
&:nth-child(#{$i}) {
animation-delay: 0.015s * ($i - 1);
}
}
}
}
@keyframes spin {
0%,
15% {
transform: rotateY(0);
}
85%,
100% {
transform: rotateY(1turn);
}
}
标签与一起使用,来为它指定一个可见的标题。
contenteditable是可以在元素上设置以使内容可编辑的属性
可以与DIV,P,UL等元素一起使用。您必须像这样指定它:。
注意,如果contenteditable未在元素上设置属性,则会从其父级继承该属性。
可以使span或div元素可编辑,并且可以使用CSS样式向其添加任何丰富的内容。这将比使用input 输入框更好。试一试!
标签可以帮助定义image map,image map是其中具有一个或多个可单击区域的任何图像。map标签与标签一起确定可点击区域。可点击区域可以是矩形,圆形或多边形区域中的任意一种。如果您未指定任何形状,它将默认整个图像。
使用标记突出显示任何文本内容。
您始终可以使用CSS更改突出显示颜色,
mark {
background-color: green;
color: #FFFFFF;
}
data-*属性用于存储页面或应用程序专用的自定义数据。可以在JavaScript代码中使用存储的数据来创建更多的用户体验。
data- *属性由两部分组成:
• 属性名称不得包含任何大写字母,并且前缀“ data-”后必须至少长一个字符
• 属性值可以是任何字符串
注意:要在JavaScript中读取这些属性的值,可以使用getAttribute(),但是规范定义了一种更简单的方法:使用dataset属性。
标签表示运算的结果。通常,此元素定义一个区域,该区域将用于显示某些计算得出的文本。
如果要在客户端JavaScript中执行任何计算,并且希望结果反映在页面上,请使用标记。您不必走动使用可获取元素的额外步骤:getElementById()。
标签指定了预先定义的选项列表,并允许用户添加更多。它提供了一项autocomplete功能,使您可以提前输入所需的选项。
与传统-标签有何不同?Select标记用于从选项中选择一个或多个项目,您需要浏览列表以进行选择。Datalist是具有自动完成支持的高级功能。也就是说Datalist标签不仅可以选择,还可以输入
range具有滑块,范围选择的输入类型
使用标签测量给定范围内的数据。
请勿将标签用于进度条。我们有HTML5的标记。
这一题面试官考察的是你关于js的打印相关基础api的熟悉程度
斐波那契数列,就是数列的每一一个数字,都是前两个数字相加的和,常见面试题
斐波那契数列是一个可难可简单的题目,从暴力递归,到动态规划,以及数学地推公式和矩阵优化几个级别,这里要求了30以内,说明对性能要求不高
考点就是常见的各种排序算法,比如冒泡,快排等,可能还会考察空间时间复杂度等问题
请js实现一个permute函数,输入数字123, 打印出这三个数字的全排列
v-if很好理解,三元表达式,控制vdomv-show生成的directive如果不是node, 设置originDisplay是之前的el.style.display呀,可能是flex,可能是inline 还有可能是inline-block等
先在父元素上设置grid布局
display: grid;
grid: var(--居中);
指定子元素在中心位置
grid-area: 中;给子元素设置宽高,
width: 150px;
height: 150px;
先在父元素上设置相对定位position: relative
给子元素 绝对定位
position: absolute;
上下左右全部为0
top: 0; right: 0; bottom: 0; left: 0;
给定宽高
width: 70%; height: 25%;
令外边距自动填充
margin: auto;
先在父元素上设置相对定位
position: relative
给子元素绝对定位
position: absolute;
上方和左方为50%
top: 50%; left: 50%;
给定宽高
width: 300px; height: 200px;
上外边距为负的给定高度的一半
margin-top: -100px;
左外边距为负的给定宽度的一半
margin-left: -150px;
先在父元素上设置相对定位
position: relative
给子元素绝对定位
position: absolute;
上方和左方为50%top: 50%; left: 50%;
不用给宽高,但是可以给个内边距防止内容与盒子过于贴合
padding: 10px;
这个50%是相对于自身宽高而言的
transform: translate(-50%, -50%);
令其父元素变成网格布局
display: grid;
令其子元素居中
place-items: center;
父元素 令其变成弹性布局display: flex;
令其子元素自动外边距
margin: auto;
讯享网<br /> 父元素上 display: table-cell;
text-align: center;
vertical-align: center;
子元素上设置
display: inline-block;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/185138.html