2025年重绘和重排的区别(重绘和重排是什么,如何避免)

重绘和重排的区别(重绘和重排是什么,如何避免)br strong 重绘 strong 当页面元素样式的改变不影响布局时 浏览器重新对元素进行更新的过程叫做重绘 strong 重排 strong 当页面元素的尺寸 结构 或某些属性发生改变时 浏览器重新渲染部分或全部文档的过程叫做重排也叫做回流 br

大家好,我是讯享网,很高兴认识大家。



<br /> 

讯享网

讯享网<strong>重绘</strong>:当页面元素样式的改变不影响布局时,浏览器重新对元素进行更新的过程叫做重绘。 

<strong>重排</strong>:当页面元素的尺寸、结构、或某些属性发生改变时,浏览器重新渲染部分或全部文档的过程叫做重排也叫做回流。 

讯享网<br /> 



由于回流和重绘会带来很大的性能开销,所以在开发中我们要尽量避免或减少回流和重绘的次数来提高性能

1.     避免频繁读取会引发回流/重绘的属性,如果确实需要多次使用,就用一个变量缓存起来。

2.     对具有复杂动画的元素使用绝对定位,使其脱离文档流,否则会引起父元素及后续元素频繁回流。

3.     要避免频繁的去操作DOM,可以通过创建documentFragment,完成所有所有DOM操作后,最后再把它添加到文档中。

4.     避免频繁操作样式,最好一次性重写style属性,或者将样式列表定义为class并一次性更改class属性。

  1. 重绘的性能开销较低,重排的性能开销较高;
  2. 回流(重排)一定会触发重绘,而重绘不一定会回流(重排)

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 的值。

假设我们在变量firstNamelastName nickName 中存储着一个用户的数据。如果用户决定不输入值,则所有这些变量的值都可能是未定义的。

我们想使用这些变量之一显示用户名,如果这些变量的值都是未定义的,则显示 "Anonymous"

让我们使用?? 运算符来实现这一需求:

讯享网 firstName = ;
 lastName = ;
讯享网 nickName = ;
讯享网
alert(firstName ?? lastName ?? nickName ?? ); 

或运算符|| 可以以与?? 运算符相同的方式使用。

例如,在上面的代码中,我们可以用|| 替换掉??,也可以获得相同的结果:

讯享网 firstName = ;
 lastName = ;
讯享网 nickName = ;
讯享网
alert(firstName || lastName || nickName || ); 

|| 运算符自 JavaScript 诞生就存在,因此开发者长期将其用于这种目的。

另一方面,空值合并运算符?? 是最近才被添加到 JavaScript 中的,它的出现是因为人们对|| 不太满意。

它们之间重要的区别是:

  • || 返回第一个 值。
  • ?? 返回第一个 已定义的 值。

换句话说,|| 无法区分false0、空字符串"" 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的类型,分别是:typeofinstanceofconstructortoString(),接下来我们分别来看这几种方法使用以及区别

typeof是一个操作符,其右侧跟一个一元表达式,并返回这个表达式的数据类型。返回的结果用该类型的字符串(全小写字母)形式表示,包含这8种: numberbigIntbooleansymbolstringobjectundefinedfunction

引用类型,除了function返回function类型外,其他均返回object,其中,null 有属于自己的数据类型 Null , 引用类型中的 数组、日期、正则 也都有属于自己的具体类型,而 typeof 对于这些类型的处理,只返回了处于其原型链最顶端的 Object 类型

instanceof用来判断A是否为B的实例,表达式为:A instanceof B,如果AB的实例,则返回true,否则返回falseinstanceof检测的是原型,内部机制是通过判断对象的原型链中是否有类型的原型。

另外一种情况下,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,并且这个prototypeconstructor属性指向函数引用, 因此重写prototype会丢失原来的constructor。 从原型链角度讲,构造函数就是新对象的类型。这样做的意义是,让对象诞生以后,就具有可追溯的数据类型

toString()Object的原型方法,调用该方法,默认返回当前对象的[[Class]]。这是一个内部属性,其格式为[object Xxx],其中Xxx就是对象的类型。

对于Object对象,直接调用toString()就能返回[object Object],而对于其他对象,则需要通过callapply来调用才能返回正确的类型信息。

这是因为toStringObject的原型方法,而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 为对象时,可以通过typedefaultrequiredvalidator等配置来设置属性的类型、默认值、是否必传和校验规则。
$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 param2param3 …… 等数十个参数,如果通过 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类似,可以通过配置defaultfrom等属性来设置默认值,在子组件中使用新的命名属性等。

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很好理解,三元表达式,控制vdom
v-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;






























































































小讯
上一篇 2025-05-09 15:09
下一篇 2025-04-24 20:36

相关推荐

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