1.Array.of() 和 Array() 区别
Array.of() 和 Array() 构造函数之间的区别在于对单个参数的处理:Array.of(7) 创建一个具有单个元素 7 的数组,而 Array(7) 创建一个 length 为 7 的空数组(这意味着一个由 7 个空槽组成的数组,而不是由 7 个 undefined 组成的数组)。
Array.of(7); // [7]
Array(7); // 由 7 个空槽组成的数组
Array.of(1, 2, 3); // [1, 2, 3]
Array(1, 2, 3); // [1, 2, 3]
2.超出n行显示省略号
<p>
在此示例中,<code>-webkit-line-clamp</code> 属性设置为
<code>2</code>,即文本在超过两行后将被截断。文本截断处将显示省略号。
</p>
p {
width: 300px;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
3.数组的flat(depth )
flat(depth) 方法创建一个新的数组,并根据指定深度递归地将所有子数组元素拼接到新的数组中。
depth 指定要提取嵌套数组的结构深度,默认值为 1。
const arr1 = [1, 2, [3, 4]];
arr1.flat();
// [1, 2, 3, 4]
const arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat();
// [1, 2, 3, 4, [5, 6]]
const arr3 = [1, 2, [3, 4, [5, 6]]];
arr3.flat(2);
// [1, 2, 3, 4, 5, 6]
const arr4 = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]];
arr4.flat(Infinity);
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
4.Array.prototype.flatMap()
flatMap() 方法对数组中的每个元素应用给定的回调函数,然后将结果展开一级,返回一个新数组。它等价于在调用 map() 方法后再调用深度为 1 的 flat() 方法(arr.map(…args).flat()),但比分别调用这两个方法稍微更高效一些。
- map() 与 flatMap()
const arr1 = [1, 2, 3, 4];
arr1.map((x) => [x * 2]);
// [[2], [4], [6], [8]]
arr1.flatMap((x) => [x * 2]);
// [2, 4, 6, 8]
// 只有一层被展平
arr1.flatMap((x) => [[x * 2]]);
// [[2], [4], [6], [8]]
const arr1 = ["it's Sunny in", "", "California"];
arr1.map((x) => x.split(" "));
// [["it's","Sunny","in"],[""],["California"]]
arr1.flatMap((x) => x.split(" "));
// ["it's","Sunny","in", "", "California"]
5.transition
可视化贝塞尔曲线:https://cubic-bezier.com/#.17,.67,.83,.67
/* timing function 是过渡时机函数,可以使用贝塞尔曲线 */
transition: margin-right 4s ease-in-out 1s;
timing function
/* Keyword values */
transition-timing-function: ease;
transition-timing-function: ease-in;
transition-timing-function: ease-out;
transition-timing-function: ease-in-out;
transition-timing-function: linear;
transition-timing-function: step-start;
transition-timing-function: step-end;
/* Function values */
transition-timing-function: steps(4, jump-end);
transition-timing-function: cubic-bezier(0.1, 0.7, 1, 0.1);
/* Steps Function keywords */
transition-timing-function: steps(4, jump-start);
transition-timing-function: steps(10, jump-end);
transition-timing-function: steps(20, jump-none);
transition-timing-function: steps(5, jump-both);
transition-timing-function: steps(6, start);
transition-timing-function: steps(8, end);
/* Multiple timing functions */
transition-timing-function: ease, step-start, cubic-bezier(0.1, 0.7, 1, 0.1);
/* Global values */
transition-timing-function: inherit;
transition-timing-function: initial;
transition-timing-function: revert;
transition-timing-function: revert-layer;
transition-timing-function: unset;
6. transform 旋转、缩放、倾斜或平移给定元素
CSS transform 属性允许你旋转、缩放、倾斜或平移给定元素。这是通过修改 CSS 视觉格式化模型的坐标空间实现的。
<!-- https://developer.mozilla.org/zh-CN/docs/Web/CSS/transform-function -->
<!-- transform 后面跟css变换函数 -->
<option>rotate(360deg)</option>
<option>rotateX(360deg)</option>
<option>rotateY(360deg)</option>
<option>rotateZ(360deg)</option>
<option>rotate3d(1, 1, 1, 90deg)</option>
<option>scale(1.5)</option>
<option>scaleX(1.5)</option>
<option>scaleY(1.5)</option>
<option>scaleZ(1.5)</option>
<option>scale3d(1, 1.5, 1.5)</option>
<option>skew(17deg, 13deg)</option>
<option>skewX(17deg)</option>
<option>skewY(17deg)</option>
<option>translate(100px, 100px)</option>
<option>translateX(100px)</option>
<option>translateY(100px)</option>
<option>translateZ(100px)</option>
<option>translate3d(50px, 50px, 50px)</option>
<option>perspective(200px)</option>
<option>matrix(1, 2, -1, 1, 80, 80)</option>
<option>matrix3d(1,0,0,0,0,1,3,0,0,0,1,0,50,100,0,1.1)</option>
transform-origin CSS 属性让你更改一个元素变形的原点。
CSS 属性 transform-style 设置元素的子元素是位于 3D 空间中还是平面中。
/* Keyword values */
transform-style: flat;
transform-style: preserve-3d;
7.css函数
https://developer.mozilla.org/en-US/docs/Web/CSS/abs
里面有跟多,transform 后面跟css变换函数可在里面查找
/* 好用的css函数 */
width:calc(100% - 80px); /*用于css 的样式计算 */
filter: /*滤镜 */
circle() /* circle() CSS 函数定义了一个圆形,使用半径和位置来描述。它是 <basic-shape> 数据类型之一 */
ellipse() /* 椭圆 */
filter:drop-shadow(offset-x offset-y blur-radius spread-radius color) /* 投影 */
模糊半径 阴影的扩散半径
transform: rotate(45deg); /*指定的角度定义了旋转的量度。若角度为正,则顺时针方向旋转,否则逆时针方向旋转。旋转 180° 也被称为点反射*/
rotate3d(x, y, z, a)
/* x*/
/*<number> 类型,可以是 0 到 1 之间的数值,表示旋转轴 X 坐标方向的矢量。*/
/*y*/
/*<number> 类型,可以是 0 到 1 之间的数值,表示旋转轴 Y 坐标方向的矢量。*/
/*z*/
/*<number> 类型,可以是 0 到 1 之间的数值,表示旋转轴 Z 坐标方向的矢量。*/
/*a*/
/*<angle> 类型,表示旋转角度。正的角度值表示顺时针旋转,负值表示逆时针旋转。*/
`
transform:scale(sx, sy) /* 缩放*/
/*sx*/
/*<number>,表示缩放向量的横坐标。*/
/*sy*/
/*<number> ,表示缩放向量的纵坐标。如果未设置,则他的默认值被设置为 sx。从而使得元素在保持原有形状下均等缩放*/
transform:skew(ax, ay); /*skew() 函数指定一个或两个参数,它们表示在每个方向上应用的倾斜量。*/
/*ax*/
/*ax 是一个 <angle>,表示用于沿横坐标扭曲元素的角度。*/
/*ay*/
/*ay 是一个 <angle> ,表示用于沿纵坐标扭曲元素的角度。如果未定义,则其默认值为 0,导致纯水平倾斜。*/
transform:translate() /* 这个 CSS 函数在水平和/或垂直方向上重新定位元素 */
transform:translate3d(tx, ty, tz) /*CSS 函数在 3D 空间内移动一个元素的位置。这个移动由一个三维向量来表达,分别表示他在三个方向上移动的距离。 */
8.esm中的额符号绑定(简单的说变量共同指向于同一块内存空间)
// a.js
export let count = 1;
ecxxport function increase(){
count++;
}
// b.js
import {count,increase} from "./a.js" //此写法属于es中的具名导入,不属于解构赋值,
console.log(count); // 1
increase();
console.log(count); // 2
9.修改this指向
// apply 修改this指向,传递的参数是一个数组
const obj = {
name: 'Charlie',
};
function greet(greeting, punctuation) {
console.log(`${greeting}, ${this.name}${punctuation}`);
}
greet.apply(obj, ['Hello', '!']); // 输出: Hello, Charlie!
// call 修改this指向
const obj = {
name: 'Bob',
};
function greet(greeting) {
console.log(`${greeting}, ${this.name}`);
}
greet.call(obj, 'Hi'); // 输出: Hi, Bob
// 调用后永久的绑定this,并产生一个新的函数 vuemethods里的方法其实就是通过bind绑定到this实例上的
const obj = {
name: 'Alice',
};
function greet() {
console.log(`Hello, ${this.name}`);
}
const boundGreet = greet.bind(obj);
boundGreet(); // 输出: Hello, Alice
10.customRef() 自定义ref,可用于防抖
https://cn.vuejs.org/api/reactivity-advanced.html#customref,
基本原理就是使用 ref 里的get 和 set 方法
customRef() 预期接收一个工厂函数作为参数,这个工厂函数接受 track 和 trigger 两个函数作为参数,并返回一个带有 get 和 set 方法的对象。
一般来说,track() 应该在 get() 方法中调用,而 trigger() 应该在 set() 中调用。然而事实上,你对何时调用、是否应该调用他们有完全的控制权。
- 封装
import { customRef } from 'vue'
export function useDebouncedRef(value, delay = 200) {
let timeout
return customRef((track, trigger) => {
return {
get() {
track()
return value
},
set(newValue) {
clearTimeout(timeout)
timeout = setTimeout(() => {
value = newValue
trigger()
}, delay)
}
}
})
}
2.使用
<script setup>
import { useDebouncedRef } from './debouncedRef'
const text = useDebouncedRef('hello')
</script>
<template>
<input v-model="text" />
</template>
11.vue渲染机制
可以通过自定义实例的方式封装类似于弹窗的一些组件
import HelloWorld from "@/components/HelloWorld.vue";
import Vue from 'vue'
function showMessage(message, clickHandler) {
const div = document.createElement("div");
document.body.appendChild(div);
// 渲染一个messagebox
const app2 = new Vue({
render: h => h(HelloWorld, {
props: {
msg: message
},
on: {
click: () => {
clickHandler && clickHandler(()=>{
app2.$destroy();
});
}
}
})
}).$mount(div)
}
export default showMessage;
<template>
<div>
这是a页面
<button @click="btn">cancel</button>
<button @click="message">消息</button>
</div>
</template>
<script>
// 弹框组件
import showMessage from "../utils/message";
export default {
data() {
return {};
},
methods: {
message() {
showMessage("这是展示的消息",(close)=>{
console.log("点击了关闭按钮");
close();
})
},
},
};
</script>
12.自动注入 sass less 全局变量
简单的理解为,使用less 或 scss 的时候,需要引入一些共有的额样式,在每个组件里面使用 @import 比较麻烦,此方法就是帮助我们在运行及打包的时候自动帮我们注入
可通过less-loader 和 scss-loader处理
https://cn.vitejs.dev/config/shared-options.html#css-preprocessoroptions-extension-additionaldata
13.光标操作
const selection = window.getSelection() ; // 返回一个 Selection 对象,表示用户选择的文本范围或光标的当前位置
选区可能有多个
selection.toString() // 获取被选中的文本,返回的是一段字符串
selection.collapse(parentNode, offset); // 可以收起当前选区到一个点。文档不会发生改变。如果选区的内容是可编辑的并且焦点落在上面,则光标会在该处闪烁。
// parentNode
// 光标落在的目标节点。
// offset 可选
// 落在节点的偏移量。
/* 将光标收起到文档 body 的开头 */
var body = document.getElementsByTagName("body")[0];
window.getSelection().collapse(body, 0);
可配合 Selection.collapseToEnd()// 方法的作用是取消当前选区,并把光标定位在原选区的最末尾处,如果此时光标所处的位置是可编辑的,且它获得了焦点,则光标会在原地闪烁。
Selection.collapseToStart() // 方法的作用是取消当前选区,并把光标定位在原选区的最开始处,如果此时光标所处的位置是可编辑的,且它获得了焦点,则光标会在原地闪烁。
-----------------
Selection.getRangeAt(index) 返回一个包含当前选区内容的区域对象。
let ranges = [];
sel = window.getSelection();
for (var i = 0; i < sel.rangeCount; i++) {
ranges[i] = sel.getRangeAt(i);
}
/* 在 ranges 数组的每一个元素都是一个 range 对象,
* 对象的内容是当前选区中的一个。 */
-----------------
Selection.removeAllRanges() 移除所有的选区
13.css 的 animation 动画
CSS animation 属性是 animation-name,animation-duration, animation-timing-function,animation-delay,animation-iteration-count,animation-direction,animation-fill-mode 和 animation-play-state 属性的一个简写属性形式。
一共8个属性
/* @keyframes name | duration | easing-function | delay |
iteration-count | direction | fill-mode | play-state */
animation: move 3s ease-in 1s 2 reverse both paused;
/*动画时间函数 */
/* 关键字值 */
animation-timing-function: ease; /* 中间加速,结束减速 */
animation-timing-function: ease-in; /* 一开始较慢,随着动画属性的变化逐渐加速,直至完成 */
animation-timing-function: ease-out; /* 一开始较快,随着动画的进行逐渐减速 */
animation-timing-function: ease-in-out; /* 一开始缓慢变化,随后加速变化,最后再次减速变化 */
animation-timing-function: linear; /* 匀速运动 */
animation-timing-function: steps(n, <jumpterm>); /* 解释如下 */
animation-timing-function: cubic-bezier(p1, p2, p3, p4) /* 开发者自定义的三次贝塞尔曲线,其中 p1 和 p3 的值必须在 0 到 1 的范围内。 */
按照 n 个定格在过渡中显示动画迭代,每个定格等长时间显示。例如,如果 n 为 5,则有 5 个步骤。动画是否在 0%、20%、40%、60% 和 80% 处或 20%、40%、60%、80% 和 100% 处暂停,或者在动画的 0% 和 100% 之间设置 5 个定格,又或是在包括 0% 和 100% 的情况下设置 5 个定格(在 0%、25%、50%、75% 和 100% 处)取决于使用以下跳跃项之一:
jump-start
表示一个左连续函数,因此第一个跳跃发生在动画开始时。
jump-end
表示一个右连续函数,因此最后一个跳跃发生在动画结束时。
jump-none
两端都没有跳跃。相反,在 0% 和 100% 标记处分别停留,每个停留点的持续时间为总动画时间的 1/n。
jump-both
在 0% 和 100% 标记处停留,有效地在动画迭代过程中添加一个步骤。
start
等同于 jump-start。
end
等同于 jump-end。
step-start
等同于 steps(1, jump-start)。
step-end
等同于 steps(1, jump-end)。
14.canvas
注:canvas 所有的样式都是在绘制前提前标注
/**
绘制矩形
*/
fillRect(x, y, width, height) // 绘制一个填充的矩形
strokeRect(x, y, width, height) // 绘制一个矩形的边框
clearRect(x, y, width, height) // 清除指定矩形区域,让清除部分完全透明。
/**
绘制直线
*/
moveTo(x, y) // 将笔触移动到指定的坐标 x 以及 y 上。
lineTo(x, y) // 绘制一条从当前位置到指定 x 以及 y 位置的直线。
/**
绘制圆弧
*/
// 画一个以(x,y)为圆心的以 radius 为半径的圆弧(圆),从 startAngle 开始到 endAngle 结束,按照 anticlockwise 给定的方向(默认为顺时针)来生成。
arc(x, y, radius, startAngle, endAngle, anticlockwise)
// 根据给定的控制点和半径画一段圆弧,再以直线连接两个控制点。
arcTo(x1, y1, x2, y2, radius)
/**
绘制贝塞尔曲线
*/
quadraticCurveTo(cp1x, cp1y, x, y) // 绘制二次贝塞尔曲线,cp1x,cp1y 为一个控制点,x,y 为结束点。
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) // 绘制三次贝塞尔曲线,cp1x,cp1y为控制点一,cp2x,cp2y为控制点二,x,y为结束点。
/**
设置透明度
*/
ctx.globalAlpha = 0.2;
/**
绘制文本
*/
fillText(text, x, y [, maxWidth]) // 在指定的 (x,y) 位置填充指定的文本,绘制的最大宽度是可选的。
strokeText(text, x, y [, maxWidth]) // 在指定的 (x,y) 位置绘制文本边框,绘制的最大宽度是可选的。
let style = ctx.measureText("哈哈哈").width // 预测文本宽度
/**
绘制图像
*/
const img = new Image();
const img = new Image();
img.onload = () => {
/**
若调用 drawImage 时,图片没装载完,那什么都不会发生(在一些旧的浏览器中可能会抛出异常)。
因此你应该用 load 事件来保证不会在加载完毕之前使用这个图片:
*/
};
img.src = "https://www.runoob.com/wp-content/themes/runoob/assets/img/404.jpg";
// 裁剪图片
ctx.drawImage(document.querySelector('img'), 0, 0, 150, 150, 37, 37, 150, 150);
drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight); //参数解释如下