如何让一个盒子快速居中

node,react,webpack,服务器部署,前端安全,浏览器,vite,数据结构

css

如何让一个盒子快速居中

image-20220702112612059

1
2
3
4
5
6
7
8
9
10
11
12
13
   * {
margin: 0;
padding: 0;
}
body,html {
width: 100%;
height: 100%;
}
.box {
width: 200px;
height: 200px;
background-color: pink;
}
1
2
3
4
<body>
<div class="box">
</div>
</body>

方法:给box加margin:auto,body加display:flex;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    <style>
* {
margin: 0;
padding: 0;
}
body,html {
width: 100%;
height: 100%;
}
.box {
width: 200px;
height: 200px;
background-color: pink;
margin: auto;
}
body {
display: flex;
}
</style>
</head>
<body>
<div class="box">
</div>
</body>

margin和padding有何不同

作用对象不同,margin作用于外部对象,padding作用于自身

vw和百分比有何区别

百分比有继承关系,vw只和设备的宽度有关系

行内元素与块级元素的区别

行内元素的宽度由它的内容决定,而块级元素的宽度具有继承关系,默认继承父元素的宽度

块级width的默认值是父元素的100%,一般情况下不用设置就可以满足需求。height的默认值是里面内容的高度,也就是auto,一般写代码的时候也不需要给元素设置高度,如果设置了高度而且设置的高度不够的时候,就会出现元素重叠的情况。

如何让谷歌浏览器支持小字体

使用scale

1
2
3
4
p {
font-size: 12px;
transform: scale(.51);
}

js

let与var&const

var的三个问题:

1.声明提升=>先上车后买票

2.没有局部作用域=>红杏出墙

1
2
3
4
5
6
7
function func(){
for(var i=0;i<5;i++){

}
console.log(i) //5
}
func()

3.声明覆盖=>变量污染

1
2
3
var name2='huahua'
var name2='lala'
console.log(name2); //lala

const:

const 声明之后必须赋值,否则报错

const定义的值不能修改,否则报错

支持let的其他属性

解构相关

如何使用第三方变量交换a,b的值

1
2
3
4
5
let a = 1;

let b = 2;

[a, b] = [b, a]

如何去重 arr=[12,43,23,12,43,55]?

1
let item = [...new Set(arr)]

promise

请问以下代码输出顺序?

1
2
3
4
5
6
7
8
9
10
const promise = new Promise((resolve, reject)=>{
console.log(1)
resolve()
console.log(2)
})

promise.then(()=>{
console.log(3)
})
console.log(4)

output 1 2 4 3

标杆:构造函数同步执行

​ .then()异步执行

深拷贝与浅拷贝

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
//普通类型的赋值不算拷贝
//数组和对象的赋值叫做浅拷贝(藕断丝连)
let arr = [1,2,3];
let newArr = arr;
newArr.push(4)
console.log(arr,newArr) //[1,2,3,4] [1,2,3,4]
//解构赋值
//对一维数据可以看作深拷贝
// let arr = [1,2,3]
// let newArr=[...arr]
// newArr.push(4)
// console.log(arr,newArr) //[1,2,3] [1,2,3,4]

let arr = [[1,2,3],[4,5,6]]
let newArr=[...arr]
newArr[0].push(666)
console.log(arr,newArr) //[[1,2,3,666],[4,5,6]] [[1,2,3,666],[4,5,6]]

//深拷贝用法=>80%
let list = [
{id:1,name:'huahua',age:800},
{id:2,name:'xielian',age:817},
{id:3,name:'lala',age:800},
]

let newList = JSON.parse(JSON.stringify(list))
newList.push({id:6})
console.log(list,newList) // list {id: 1, name: 'huahua', age: 800},{id: 2, name: 'xielian', age: 817},{id: 3, name: 'lala', age: 800}
// newList {id: 1, name: 'huahua', age: 800},{id: 2, name: 'xielian', age: 817},{id: 3, name: 'lala', age: 800},{id: 6}


//简单版深拷贝
function deepClone(source){
//[]=>Array(基类) {}=>Object
const targetObj = source.constructor === Array ? []:{};
for (let keys in source) {
if(source.hasOwnProperty(keys)){
//引用数据类型
if(source[keys] && typeof source[keys]==='object'){
//递归
targetObj[keys]=deepClone(source[keys])
}else {
//基本数据类型
targetObj[keys]=source[keys]
}
}
}
return targetObj
}

let obj={
name:'huahua',
age:18,
a:{
id:1,
class:'203'
}
}
let newObj=deepClone(obj)
newObj.name="hh"
console.log(obj,newObj)

this指向问题

见我的另一篇博客

闭包

为什么要有闭包?

  1. 编码变量被污染
  2. 私有化
  3. 保存变量,常驻内存

防抖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 //防抖=>固定时间内,事件只运行发生一次 将多次操作变成一次
let telInput = document.querySelector('input')
telInput.addEventListener('input',antiShake(demo,2000))

function antiShake(fn,wait){
let timeOut=null
return args => {
if(timeOut) clearTimeout(timeOut)
timeOut = setTimeout(fn,wait)
}

}

function demo(){
console.log('发起请求');
}

节流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//节流 =》 一定时间内只调用一次函数
//应用场景=》1.提交表单 2.高频监听事件
let box = document.querySelector(".box")
console.log(box)
box.addEventListener("touchmove",(e)=>{

console.log("发起请求");
})

function throttle(event, time){
//定时器
let timer = null
return function() {
// 如果没有定时器就设置一个
if(!timer){
timer=setTimeout(()=>{
// 每隔timer时间才会掉用请求事件
event()
//调用以后清除定时器
timer=null
},time)
}
}
}

null与undefined

  1. null表示无对象 0
  2. undefined 表示无的元素值 NaN

以下几种undefined情况:

  • 已声明,未赋值
  • 对象的某个属性不存在
  • 函数调用,少了参数
  • 函数的默认返回值

以下几种null的情况:

  • let obj={};obj=null 手动释放内存
  • 作为函数的参数(此参数不是对象)
  • 原型链的顶端

filter

foreach

没有返回值,不能break

map

1.有返回值(数组)默认returnun defined

2.接受的参数时一个函数(key,value)

3.不能用break打断

js递归求和

求1~100的和

1
2
3
4
5
6
7
8
9
10
function add(a,b){
let sum=a+b
if(sum+1>100){
ruturn sum
}else {
add(sum,b+1)
}

}
add(1,2)

原型与原型链

性能优化

在浏览器输入url之后浏览器做了什么?

https://www,baidu.com

url->统一资源定位符,俗称网址

url是ip的一个映射

https:传输协议(http和TCP之间加了一层TSL或者SSL安全层)

www:服务器

第一次访问:

  1. 解析url
  2. DNS域名系统匹配真实ip
  3. 拿到真实ip
  4. 建立连接(TCP三次握手)
  5. 拿数据,渲染页面
  6. 四次挥手

第二次访问:读取浏览器缓存在本地的ip

从哪些点做性能优化?

  • 加载
    • 减少http请求(精灵图,文件的合并)
    • 减小文件大小(资源压缩,图片压缩,代码压缩)
    • CDN(第三方库,大文件,大图)
    • SSR服务端渲染,预渲染
    • 懒加载
    • 分包
  • 减少dom操作,避免回流,文档碎片

[前端性能优化 —— reflow(回流)和repaint(重绘) - 潇洒-zhutao - 博客园 (cnblogs.com)](https://www.cnblogs.com/zhutao/p/6551216.html#:~:text=前端性能优化 —— reflow (回流)和repaint (重绘),简要: 整个在浏览器的渲染过程中(页面初始化,用户行为改变界面样式,动画改变界面样式等)reflow (回流)和repaint (重绘) 会大大影响web性能,尤其是手机页面。)。

性能优化之文档碎片 - 知乎 (zhihu.com)

性能分析

  1. 页面加载性能
  2. 动画与操作性能
  3. 内存占用
  4. 电量消耗

图片懒加载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
let num = document.getElementsByTagName("img").length
let img = document.getElementsByTagName("img")
let n = 0

lazyload()

window.onscroll=lazyload

function lazyload(){
let seeHeight = document.documentElement.clientHeight; //可见高度
let scrollTop = document.documentElement.scrollTo || document.body.scrollTo

for(let i=n; i<num;i++){
if(img[i].offsetTop<seeHeight+scrollTop){
if(img[i].getAttribute("src") == "./img2/timg.gif"){
img[i].src=img[i].getAttribute("data-src")
}
n=i+1 //防止图片重复加载
}
}
}