百度面试官真宠我,给我出这两题!
手风琴
手风琴效果是一种用户界面设计中的交互模式,常见于网页或应用程序中,表现为一系列可展开和收起的内容区域。当用户点击或触摸其中一个标题或按钮时,与之相关联的内容区域会展开,同时其他已经展开的内容区域会自动收起,整个过程类似于手风琴的伸缩动作,因此得名“手风琴效果”。
要做出手风琴效果
首先我们要先创建六个单位,所以我们在<body>
里面创建六个列表项
<ul class="accordion">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
</ul>
此时我们得到了以下结果:
- 1
- 2
- 3
- 4
- 5
- 6
接下来我们要把这6个数字并到一排,并把他们变成一个一个方块,并给他们涂上颜色
我们将所有元素的外边距和内边距设为0,并且设置盒模型为border-box
。这意味着元素的宽度和高度会包括内边距和边框,但不包括外边距。使用Flexbox布局,让列表项水平排列。
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
ul,
li {
list-style: none;
}
.accordion {
display: flex;
width: 600px;
height: 200px;
line-height: 200px;
text-align: center;
color: #fff;
}
.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: #01f;
}
.accordion li:nth-child(6) {
background-color: #3c9;
}
我们得到这样的效果
可以看到这个图形太小了,完全不是我们的理想型,我们使用flex:1
将它变大
我们使用
flex:1
是因为目的是让所有列表项在父容器(.accordion
)中均匀分配空间,无论是容器有多余空间还是刚好够用。这对于创建手风琴的基础布局非常有用,
.accordion li {
flex: 1;
cursor: pointer;//将鼠标指针变为手形,提示用户这些项可点击
}
现在,我们的手风琴就看得很舒服了,接下来我们来到最关键的部分:我们指针停留时,方块展开。
.accordion li:hover {
flex: 2;
}
当鼠标悬停在列表项上时,将其flex
值设为2,这会使得该列表项相对于其他项变宽,这样我们就可以得到开头那个git一样的手风琴效果,是不是能简单呢?快去试试吧
数组展开
当面试官给你一个[1,[2,[3,[4]]]]数组,你该如何将它转成[1,2,3,4]呢,你先思考一分钟,看看能想到几种方法。
方法一:递归
const arr = [1,[2,[3,[4]]]];
function flatten(arr){
let result = []//定义一个空数组 result,它将用于存储最终展平后的数组元素。
for(var i = 0 , len = arr.length ; i<len ; i++){
//此处有一个小细节,我们令len=arr.length,这样len缓存了arr.length,这样就不用反复调用arr.length,这样就可以减少耗时
if(Array.isArray(aii[i])){
result = result.concat(flatten(arr[i]))
//首先检查当前元素arr[i]是否为数组(使用Array.isArray()方法)。如果是,则对这个子数组递归调用flatten函数,并将返回的结果(一个展平后的数组)与result数组使用concat()方法合并。
}else{
result.push(arr[i])
}
//否则加入数组
}
return result
}
console.log(flatten(arr)); // 应输出: [1, 2, 3, 4]
方法二:转为字符串
//数组对象 toString一下,转成了字符串
console.log([1,[2,[3,[4,[5,[6]]]]]].toString(),typeof[1,[2,[3,4]]].toString())
var arr = [1,[2,[3,[4,[5,[6]]]]]]
//扁平化
function flatten(arr){
var strArr = arr.toString();//以,隔开的字符串
var numArr = strArr.split(',');
var result = []
for(var i = 0,len= result.length;i <len;i++){
//numArr[i]字符串,js可以强制类型转换(Number()显示类型转换)
//+ 和 Number()是一样的,+ 一是拼接字符串,二是数值计算,三是类型转换 隐式类型转换
result.push(+numArr[i])
}
//console.log(numArr);
return result
}
console.log(flatten(arr))
方法三:ES6语法
var arr = [1,[2,[3,[4,[5,[6]]]]]]
function flatten(arr){
// ['1','2','3']
//map
return arr.toString().split(',').map(function(item){
//console.log(item);
return +item
})
}
console.log(flatten(arr));
-
首先,使用
toString()
将数组转换为字符串,再用split(',')
按照逗号分割字符串,得到一个字符串数组。 -
接着,使用
map()
方法遍历这个字符串数组。对于数组中的每个元素(即每个字符串项): -
通过箭头函数
(item) => +item
,对每个字符串元素应用一元加号+
进行隐式类型转换,将其转换为数字。 -
map()
方法会创建一个新的数组,其中的元素是原数组每个元素转换后的结果。
这三种你想到了吗,如果有新的方法欢迎分享到评论区
好的,这次的内容就分享到这了,如果小友觉得整的还不错的,可以留下一个小小的赞帮助俺找回自己的脑子,谢谢啦!!!
转载自:https://juejin.cn/post/7376177615441248310