谈谈baidu基础面试题
浅聊一下大厂面试题的小细节
一、手风琴
这道题主要是考css对弹性布局的理解,话不多说先上个图:
相信大家要做出一个这样的样式是很简单的,但我们需要的是注意里面的细节。
在这之前介绍一个工具给大家:
stylus
Stylus是一种CSS预处理器,它允许前端开发者以更简洁、模块化的方式编写CSS代码,并提供了变量、嵌套规则、运算符等高级功能,提高了代码的可维护性和可扩展性。
通过npm i -g stylus
这个指令安装,然后通过这个stylus --version
指令看安装的是什么版本判断是否安装成功。
然后可以安装这个插件可以方便我们在styl文件编译:
使用stylus common.styl -o common.css
这个命令使styl文件转变成css文件;使用stylus -w common.styl -o common.css
命令可以监听styl然后同步更新css文件。
css
接下来就来完成我们的代码吧:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>手风琴</title>
<link rel="stylesheet" href="common.css">
</head>
<body>
<ul class="accordion">
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
</body>
</html>
先通li创建6个列表项当作盒子来装我们那6个琴键,然后来完成css吧:
*
margin 0
padding 0
box-sizing border-box
ul,li
list-style none
.accordion
display flex
width 600px
height 200px
li
flex 1
cursor pointer
line-height 200px
color white
transition: flex .5s
&:nth-child(1)
background-color #f66
&:nth-child(2)
background-color #66f
&:nth-child(3)
background-color #f90
&:nth-child(4)
background-color #09f
&:nth-child(5)
background-color #9c3
&:nth-child(6)
background-color #3c9
&:hover
flex 2
我们来扣一下上面代码的细节吧:在* 中我们加入box-sizing border-box
使元素的宽度和高度会包括内容、边框和内边距的总和。ul,li中用list-style none
来移除列表项(<li>
元素)前面的小圆点,然后使用弹性布局让六个琴键布局在同一行,先在父类中display flex
,再在子类li中flex 1
让子类中的六个琴键平分父类这个盒子的宽度;再使用&:nth-child()
来给六个琴键做不同的样式,当鼠标移到一个琴键上在 &:hover
用flex 2
来反馈效果,最后加个transition: flex .5s
反馈时间让其看起来更丝滑。这就是以上小细节了。把上面styl文件转换成css文件就是这样了:
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
ul,
li {
list-style: none;
}
.accordion {
display: flex;
width: 600px;
height: 200px;
}
.accordion li {
flex: 1;
cursor: pointer;
line-height: 200px;
color: #fff;
transition: flex 0.5s;
}
.accordion li:nth-child(1) {
background-color: #f66;
}
.accordion li:nth-child(2) {
background-color: #66f;
}
.accordion li:nth-child(3) {
background-color: #f90;
}
.accordion li:nth-child(4) {
background-color: #09f;
}
.accordion li:nth-child(5) {
background-color: #9c3;
}
.accordion li:nth-child(6) {
background-color: #3c9;
}
.accordion li:hover {
flex: 2;
}
二、展平数组
将一个const arr=[1,[2,[3,4]]]
这样套娃又套娃的数组给展平变成一个正常的[1,2,3,4]
这样的数组,这里给大家使用三种方法
一、递归
function flatten(arr) {
let result=[]
for(let i=0,len=arr.length;i<len;i++){
// 数组,递归
if(Array.isArray(arr[i])){
result=result.concat(flatten(arr[i]))
}
// 否则 加入数组
else{
result.push(arr[i])
}
}
return result
}
提一个细节在for循环中使用len=arr.length
是因为arr是对象,读取.length会耗时,把它赋给len就不用每次循环都要读取.length。这个方法呢可行但递归比较麻烦耗内存还容易爆栈。
二、转字符串在转数字存入数组
function flatten(arr) {
var strArr=arr.toString() // , 隔开的字符串
var numArr=strArr.split(',')
var result=[]
for(var i=0,len=numArr.length;i<len;i++){
result.push(+numArr[i]);
}
return result
}
这里把字符串转换为数字还有两种方法:parseInt()``Number()
这两种都是显式类型转换,而用+是隐式类型转换,+号的作用 一是拼接字符串,二是数值计算,三是类型转换,在这它旁边只有一个元素所以他的作用是第三种。
三、map()
function flatten(arr) {
return arr.toString().split(',').map(function(item){
return +item
})
}
这也算最简单的了,用map()依次遍历。
ok以上就是我对这些基础面试题的了解了,欢迎大佬指导!!!
转载自:https://juejin.cn/post/7374783392674185242