前端面试题学习


提示:以下是本篇文章正文内容,下面案例可供参考

一、HTML + CSS

1、讲一下盒模型、普通盒模型、怪异盒模型有什么区别?

盒模型:CSS把每个元素视为一个盒子,每个盒子包括content(内容)、padding(内边距)、border(边框)、margin(外边距)四个部分。盒模型是CSS布局的基本单元;

W3C标准盒模型(普通盒模型 content-box):指在CSS中设置width(宽)、height(高)属性时,是给content(内容)区域设置;

怪异盒模型(border-box):指在CSS中设置width(宽)、height(高)属性时,是给content(内容)、padding(内边距)、border(边框)设置。

2、块元素和行内元素区别是什么?常见块元素和行内元素有哪些?

(1)块元素,宽度默认是它容器的 100%,各占据一行,垂直方向排列;行内元素,不会占据整行,都是同一行,水平方向排列;
(2)块元素,能容纳其他块元素或者行内元素;行内元素,只能容纳文本或其他行内元素;
(3)块元素中 height,line-height 以及 margin 和 padding 都可以控制;行内元素设置width、 height 无效(可以设置 line-height),margin、padding 上下无效。
(4)

  • 常见的块元素(display:block):div、ul 、li 非排序列表、form - 交互表单、h1 -h6 标题、p - 段落
  • 常见的行元素(display:inline):a – 链接、span - 常用内联容器、br 、
  • 行内块元素(display:inline-block):img - 图片、 input - 输入框、textarea

3、HTML 语义化标签有哪些?

通过使用恰当语义的 HTML 标签,让页面具有良好的结构与含义.
header 网页的头部
main 网页的主体部分(只有一个 main)
nav 网页的导航
section 一个独立的区块
aside 和主体相关的其他内容(侧边栏)
article 独立的文章
footer 网页的底部

4、伪类和伪元素的区别是什么?

(1)伪类(pseudo-class)是一个以冒号作为前缀,被添加到一个选择器末尾的关键字,样式被呈现到指定的元素时。如:(:last-child),通过在元素选择器上加入伪类改变元素状态。
(2)伪元素是以两个冒号作为前缀,用于创建一些不在文档树中的元素,并为其添加样式。通过对元素的操作进行对元素的改变。伪元素其实相当于伪造了一个元素。

5、CSS 如何实现垂直居中?

(1)设置vertical-align:middle。
vertical生效的前提是元素的display:inline-block。
在使用vertical-align:middle的时候需要一个兄弟元素做参照物,让它垂直于兄弟元素的中心点。vertical-align对齐的方法是寻找兄弟元素中最高的元素作为参考。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>CSS垂直居中</title>
  <style>
    .parent {
      width: 200px;
      height: 200px;
      border:1px solid blue;
 
      text-align: center;
    }
    .child {
      width: 50%;
      height: 50%;
      background-color: yellow;
 
      display: inline-block;
      vertical-align: middle;
      margin: 0 auto;
    }
    .help {
      width: 0;
      height: 100%;
      display: inline-block;
      vertical-align: middle;
    }
  </style>
</head>
 
<body>
  <div class="parent">
    <div class="child"></div>
    <div class="help"></div>
  </div>
</body>
 
</html>

(2)设置display:flex
给父元素设置display: flex布局,水平居中 justify-content: center,垂直居中align-items: center。

<!DOCTYPE html>
<html lang="en">
 
<head>
  <meta charset="UTF-8">
  <title>CSS垂直居中</title>
  <style>
 .parent{
    width: 200px;
    height: 200px;
    background: grey;
    display: flex;
    justify-content: center;
    align-items: center;
}
 .child{
    width: 50%;
    height: 50%;
    background:green;
}
  </style>
</head>
 
<body>
  <div class="parent">
    <div class="child"></div>
  </div>
</body>
 
</html>

(3)设置伪元素::before
给父元素添加一个伪元素::before,让这个伪元素的div高度为100%,这样其他div就可垂直居中了,但div 本身就是块级元素,而vertical-align是行内元素属性,则需要修改为inline-block。

<!DOCTYPE html>
<html lang="en">
 
<head>
  <meta charset="UTF-8">
  <title>CSS垂直居中</title>
  <style>
    .parent{
    width:200px;
    height: 200px;
    border:1px solid blue;
    
}
.parent::before{
    content:'';
    height:100%;
    display: inline-block;
    vertical-align: middle;  
}
.child{
    width:50%;
    height: 50%;
    background:yellow;
    display: inline-block;
    vertical-align: middle;
}
  </style>
</head>
 
<body>
  <div class="parent">
    <div class="child"></div>
  </div>
</body>
 
</html>

(4)设置display:table-cell
将父元素设置display:table,子元素table-cell会自动撑满父元素。组合 display: table-cell、vertical-align: middle完成水平垂直居中。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>CSS垂直居中</title>
  <style>
    .parent{
    width:200px;
    height:200px;
    border:1px solid blue;
    display: table;
  }
   .child{
    background:yellow;
    display: table-cell;
    vertical-align: middle;
  }
  </style>
</head>
 
<body>
  <div class="parent">
    <div class="child"></div>
  </div>
</body>
 
</html>

(5)设置隐藏节点
创建一个隐藏节点#hide,使得隐藏节点的height值为剩余高度的一半即可。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>CSS垂直居中</title>
  <style>
  .parent {
    width:200px;
    height:200px;
    border:1px solid blue;
  }
  .child {
    width: 50%;
    height: 50%;
    background:yellow;
  }
  .hide {
    width: 50%;
    height: 20%;
  }
  </style>
</head>
 
<body>
  <div class="parent">
    <div class="hide"></div>
    <div class="child"></div>
  </div>
</body>
 
</html>

(6)absolute + transform
在父元素中设置相对定位position: relative,子元素设置绝对定位 position: absolute;top和left相对父元素的50%,与其搭配的 transformse: translate(-50% , -50%)表示X轴和Y轴方向水平居中。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>CSS垂直居中</title>
  <style>
    .parent{
      width: 200px;
      height: 200px;
      background:#ddd;
      position: relative;
   }
    .child{
      width: 50%;
      height: 50%;
      background:yellow;
      
      position: absolute;
      top: 50%;
      left:50%;
      transform: translate(-50% , -50%);
    }
  </style>
</head>
 
<body>
  <div class="parent">
    <div class="child"></div>
  </div>
</body>
 
</html>

(7)设置绝对定位
子元素绝对定位position:absolute,父元素相对定位position: relative,将上下左右的数值都设置为0,同时margin:auto。绝对定位是会脱离文档流的,这点要注意一下。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>CSS垂直居中</title>
  <style>
    .parent{
    width:200px;
    height: 200px;
    border:1px solid blue;   
    position: relative;
  }
  .child{
    width:50%;
      height: 50%;
      background:yellow;
      position: absolute;
      top:0;
      left:0;
      right:0;
      bottom:0;
      margin:auto;
  }
  </style>
</head>
 
<body>
  <div class="parent">
    <div class="child"></div>
  </div>
</body>
 
</html>

(8)设置行高line-height
父容器高度和子元素line-height一样的数值,内容中的行内元素就会垂直居中。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>CSS垂直居中</title>
  <style>
    .parent{
      width:200px;
      height:200px;
      border:1px solid blue;
    }
    .child{
      width:200px;
      line-height: 200px;   
      text-align: center; 
      display: inline-block;
   }
  </style>
</head>
<body>
  <div class="parent">
    <div class="child">你好</div>
  </div>
</body>
</html>

(9)calc 属性动态计算
父元素position定位为relative,子元素position定位为absolute。水平居中同理。calc居中要减多少要结合到自己的宽高设置多少再进行计算。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>CSS垂直居中</title>
  <style>
    .parent{
      width: 200px;
      height: 200px;
      border:1px solid blue;
      position: relative;
    }
    .child{
      width: 100px;
      height: 50px;
      background:yellow;
      position: absolute;
      left:calc(50% - 50px); /*水平居中 */
      top: calc(50% - 25px); /*垂直居中  calc(“50%的外框高度- 50%的 div 高度”)*/
    }
  </style>
</head>
 
<body>
  <div class="parent">
    <div class="child"></div>
  </div>
</body>
 
</html>

6、水平方向布局

一个元素在父元素中,水平布局满足以下等式:
margin-left + border-left + padding-left + width + padding-right + border-right + margin-right = 父元素内容区的 width
以上等式必须满足,如果相加结果使等式不成立,则称为过渡约束

7、垂直方向布局

子元素是在父元素的内容区中排列的,如果子元素的大小超过了父元素,则子元素会从父元素中溢出
使用 overflow / overflow-x / overflow-y 属性来设置父元素如何处理溢出的子元素

  • overflow:overflow-x/overflow-y:
  • visible(默认值) 会溢出,在父元素外部显示
  • hidden 溢出的内容会被裁剪,不会显示
  • scroll 生成滚动条
  • auto 根据需要生成滚动条

8、CSS 常见的选择器有哪些?

CSS的选择器其实大类的话可以分为三类,即id选择器、class选择器、标签选择器

(1)id选择器

 #id名 { 属性名:属性值; }

(2)class选择器

 .class名 { 属性名:属性值; }

(3)标签选择器

标签名 { 属性名:属性值; }

(4)后代选择器

div p { 属性名:属性值; }

(5)子代选择器

div>p { 属性名:属性值; }

(6)相邻兄弟选择器

div+p{ 属性名:属性值; }

(7)兄弟选择器(所有的兄弟)

ul~h1 { 属性名:属性值; }

(8)群组选择器

#name1, .name2, #name div { 属性名:属性值; }

(9)伪类选择器

.name:hover

(10)伪元素选择器

a::after 元素的结束位置 
a::before 元素的开始位置

(11)通用(通配符)选择器

* { 属性名: 属性值; }……

(12)属性选择器

input[type=checkbox]{ margin-left: 10px;}
[属性名] 选择含有指定属性的元素 
[属性名=属性值] 选择含有指定属性和指定值的元素

9、CSS 的优先级如何计算?

!important > 内联样式 > ID选择器 > 类选择器 = 属性选择器 = 伪类选择器 > 标签选择器 = 伪元素选择器 > 通配符 >> 继承 >浏览器默认属性

!important,作用是提高指定样式的应用优先权

10、长度单位 px、em 和 rem,rpx,vw,vh 的区别是什么?

px:相对长度单位。像素 px 是相对于显示器屏幕分辨率而言的。
em :相对与父元素的 font-size 来计算的
rem:相对于根元素 html 的 font-size
rpx:小程序独有的,论大小屏幕,规定屏幕宽为 750rpx
vw:相对于浏览器视口宽度
vh:相对于浏览器视口高度

11、讲一下 flex 弹性盒布局?

二、JavaScript

1、说一说JS数据类型有哪些,区别是什么?

(1)基本类型:String,Number,Boolean,Null,Undefined,Symbol,BigInt
(2)引用类型:Object(普通对象,数组,正则,日期,Math数学函数都属于Object)
(3)区别:

  • 基本类型存储在栈中,空间小,操作频繁 ;
  • 引用类型存储在堆中,空间大,在栈中存储了指针,指向在堆中的起始地址

(4)Symbol、BigInt是ES6新出的数据类型,Symbol的特点就是没有重复的数据,不可枚举,使用getOwnPropertySymbols获取。BigInt就是数据涵盖的范围大,能够解决超出普通数据类型范围报错的问题。

2、说一说你对闭包的理解?

(1)形成的原理:作用域链,当前作用域可以访问上级作用域中的变量。
(2) 解决的问题:能够让函数作用域中的变量在函数执行结束之后不被销毁,同时也能在函数外部可以访问函数内部的局部变量。
(3) 带来的问题:由于垃圾回收器不会将闭包中变量销毁,于是就造成了*内存泄露**,内存泄露积累多了就容易导致内存溢出
(4)闭包的应用:防抖节流,能够模仿块级作用域,能够实现柯里化,在构造函数中定义特权方法、Vue中数据响应式Observer中使用闭包等。

3、说一说promise是什么与使用方法?

(1)概念:异步编程的一种解决方案,解决了地狱回调(异步多层嵌套回调)的问题
(2)使用方法:使用Promise构造函数new一个实例,Promise构造函数接收一个函数作为参数,这个函数有两个参数,分别是两个函数 resolverejectresolve将Promise的状态由等待变为成功,将异步操作的结果作为参数传递过去;reject则将状态由等待转变为失败,在异步操作失败时调用,将异步操作报出的错误作为参数传递过去。
new Promise((resolve,reject) => { resolve(); reject(); })里面有多个resovle或者reject只执行第一个。如果第一个是resolve的话后面可以接.then查看成功消息。如果第一个是reject的话,.catch查看错误消息。
(3)特点: ①、对象的状态不受外界影响。②、一旦状态改变,就不会再变。

三、Vue

1、Vuex的使用方法。

Vuex 是一个专门为 vue.js 设计的集中式状态管理架构
Vuex 的五个核心:state,getter,mutations,actions,module

1)state(数据源):定义我们所需要管理的数组、对象、字符串等等 ;
2)getter(过滤数据):可以对 state 中的成员加工后传递给外界 ;
3)mutations(处理同步事件):mutations 是操作 state 数据的方法的集合,比如对该数据的修改、增加、删除等等;
4)actions(处理异步事件):由于直接在 mutation 方法中进行异步操作,将会引起数据失效。所以提供了 actions 来专门进行异步操作,最终提交 mutation 方法;
5)modules(模块): 当项目庞大,状态非常多时,可以采用模块化管理模式。Vuex 允许我们将 store 分割成模块。

2、mvc 和 mvvm 区别是什么?

四、工程化

1、webpack性能优化有哪些方法?

五、性能优化

1、前端页面性能如何优化?

六、安全

1、网络攻击有哪些?如何防御?

七、计算机基础

1、进程与线程区别是什么?

八、网络通信

1、说一说cookie sessionStorage localStorage 区别?

(1)共同点:都是存储在浏览器本地的
(2)区别:
①、cookie是由服务器端写入的,而SessionStorage、 LocalStorage都是由前端写入的;
②、cookie的生命周期是由服务器端在写入的时候就设置好的,SessionStorage是页面关闭的时候就会自动清除,LocalStorage是写入就一直存在,除非手动清除
③、cookie的存储空间比较,大概4KB,SessionStorage、 LocalStorage存储空间比较,大概5M;
④、它们的数据共享都遵循同源原则,SessionStorage还限制必须是同一个页面
⑤、在前端给后端发送请求的时候会自动携带Cookie中的数据,但是SessionStorage、 LocalStorage不携带。
⑥、加分回答:由于以上区别,所以它们的应用场景也不同,Cookie一般用于存储登录验证信息SessionID或者token;SessionStorage可以用来检测用户是否是刷新进入页面,如音乐播放器恢复播放进度条的功能;LocalStorage常用于存储不易变动的数据,减轻服务器的压力。

2、说一说跨域是什么?如何解决跨域问题?

(1)跨域就是违反了浏览器的同源策略造成的,当前页面中的某个接口请求的地址和当前页面的地址,如果协议、域名、端口其中有一项不同,就说该接口跨域了。
(2)解决方案:
①、后端 可以设置 cors 允许跨域实现;

res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader("Access-Control-Allow-Methods", "GET, PUT, OPTIONS, POST");

②、JSONPscript标签不受同源策略影响:script标签可以跨域请求资源,将回调函数作为参数拼接在url中。后端收到请求,调用该回调函数,并将数据作为参数返回去,注意设置响应头返回文档类型,应该设置成javascript。
③、前端配置一个代理服务器proxy代替浏览器去发送请求:因为服务器与服务器之间是可以通信的不受同源策略的影响。
④、使用node中间件nginx反向代理:让请求发给代理服务器,静态页面和代理服务器是同源的,然后代理服务器再向后端服务器发请求,服务器和服务器之间不存在同源限制。
⑤、postmessage:H5新增API,通过发送和接收API实现跨域通信。
(3)跨域场景:前后端分离式开发、调用第三方接口

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值