Web前端面试问题集锦

天坑专业转行开始找实习啦,自己水平不够,边看别人的面经边总结相关的知识吧。

一. HTML/5

二. CSS/3

2.1 有很多li标签且顺序不固定,怎么把最后一个class为b的li改为红色

<ul>
    <li class="a" />
    <li class="b" />
    <li class="b" />
    <li class="a" />
</ul>

思路1:使用伪类:last-child

:last-child  代表父元素的最后一个子元素。

li:last-child {
  background-color: xxx;
}

拓展1:还有哪些常用伪类

//a标签专属
:link /*超链接未访问时的状态  鼠标放上去的时候 */
:visited /*超链接访问过后的状态  点击后 */
:hover  /*鼠标悬停的状态  鼠标放上去的时候 */
:active /*激活状态,鼠标按下状态 点击的一瞬间 */
:focus  /* 元素获取焦点的时候触发 */

//其他伪类
:first-child //表示在一组兄弟元素中的第一个元素
:first-of-type //表示一组兄弟元素中指定类型的第一个元素
:last-child //表示在一组兄弟元素中的最后一个元素
:last-of-type //表示一组兄弟元素中指定类型的最后一个元素
:not(selector) //一个否定伪类,用于匹配不符合参数选择器的元素
:nth-child //这个 CSS 伪类首先会找到当前元素的兄弟元素,然后按照位置的先后顺序从1开始排序,选择的结果为第(an+b)个元素的集合(n=0,1,2,3...)。如果 an+b 为 0,无法选中任何元素
:nth-of-type //与 nth-child 相似,不同之处在于它是只匹配特定类型的元素
:nth-last-child(an+b) //与 nth-child 相似,它是从最后一个子元素开始计数的
:nth-last-of-type //与 nth-of-type 相似,不同之处在于它是从最后一个子元素开始计数的

//伪元素选择器
/* 向前面追加文本 content属性里面添加内容 */
::before {
            content: "before";
            color: teal;
            margin-right: 20px;
        } 
 /* 向后面追加文本 content属性里面添加内容 */       
::after {
            content: "123456";
            color: sienna;
        }
::first-letter //选中某块级元素第一行的第一个字母,并且文字所处的行之前没有其他内容
::first-line //在某块级元素的第一行应用样式。
::selection //用于文档中被用户高亮的部分

2.2 有一个类似表格的布局,每个单元格的border为1px,相邻单元格中间的border也为1px怎么实现?如何实现选择某一单元格高亮?

A:从第二列开始margin-left: -1px, 第二排开始maigin-top: -1px;加z-index = 999实现。

三. JavaScript/ECMAScript

3.1 在不改动原有api的前提下实现多参数加法

假如现在本地无法实现加法功能,有其他团队提供的api:

await asyncAdd = (a, b, (err, res) => {
    利用网络请求实现a+b, 结果成功返回res
})

现需要改进该api, 利用其实现一个add方法,使其能够实现多个数组相加。

思路1:利用arguments分解多传入的参数,用reduce将两两依次送入api中计算并返回结果。

function asyncAdd(a, b){
    return new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve(a+b)
    }, 1000)
})
}

async function add(){
    let arr = Array.prototype.slice.call(arguments)
    const res = await arr.reduce((s, v) => {return s.then((res) => asyncAdd(res, v))}
    , Promise.resolve(0))
    return res;
}

add(1, 2, 3).then((res) => {
    console.log(res)
})

四. 计网等基础知识

4.1 前端性能优化,(能实际实现的)

1.减少HTTP的请求次数和传输报文的大小:svg图,图片延迟(懒)加载,合并页面css/js文件。

2.设置各种缓存、预处理和长连接机制:建立DNS缓存,做CDN分布,使用HTTP2协议实现多TCP通道共存。

3.代码方面的性能优化:减少闭包,避免使用iframe,减少对DOM的直接操作,低耦合高内聚,使用事件委托,函数防抖节流,尽可能减少选择器的层级,尽可能减少table布局...

暂时来不及看,先存着。

Web前端性能优化,应该怎么做? - 知乎摘要:本文将分享一些前端性能优化的常用手段,包括减少请求次数、减小资源大小、各种缓存、预处理和长连接机制,以及代码方面的性能优化等方面。base64:尤其是在移动端,小图标可以base64(webpack),大图片慎…Web前端面试问题集锦https://zhuanlan.zhihu.com/p/181275749

函数防抖节流 :

例子:避免鼠标滚动条多次触发事件(防抖)和一定时间之后自动触发事件(节流)

https://segmentfault.com/a/1190000018428170Web前端面试问题集锦https://segmentfault.com/a/1190000018428170

4.2 用js操作dom,怎么判断DOM已经操作好了

思路1:HTML5新API

MutationObserver - Web API 接口参考 | MDNMutationObserver接口提供了监视对DOM树所做更改的能力。它被设计为旧的Mutation Events功能的替代品,该功能是DOM3 Events规范的一部分。Web前端面试问题集锦https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver

思路2:利用浏览器队列特性

如何监测DOM对象已加载完成_甘焕的博客-CSDN博客_vue如何判断dom加载完成在第三方插件的使用过程中,我们经常需要DOM在加载完成后执行一些操作,如果插件提供了这样的事件接口,那一切都较为简单,但在大部分的情况下,要么是设计者没有考虑到这样的问题,或者没有设计这样的接口,那这时应该怎么办呢?小组成员经常犯的一个错误是利用if判断,如下:let dom = document.getElementById('yiifaa')// dom加载完成后执行操作if(dom) {Web前端面试问题集锦https://blog.csdn.net/yiifaa/article/details/75040858

4.3 浏览器渲染原理与过程

浏览器渲染原理与过程 - 简书浏览器如何渲染网页 要了解浏览器渲染页面的过程,首先得知道一个名词——关键渲染路径。关键渲染路径是指浏览器从最初接收请求来的HTML、CSS、javascript等资源,然后...https://www.jianshu.com/p/e6252dc9be32

五. React, axios, koa2等框架相关

六. Node.js, sql, mongodb等后端和数据库相关

七. 算法与数据结构相关

八. Python相关(Django之类的?)

上一篇:CMake I 配置时生成源码


下一篇:30段极简Python代码,30秒学一个实用技巧