[搞定一面] 快速搞定一面~技术面

本文详细梳理了前端面试中常见的HTML、CSS和JavaScript知识点,包括HTML语义化、CSS盒模型、BFC、浮动布局、Flex布局、响应式设计、CSS3动画、DOM操作、BOM以及JS基础模块等内容。重点介绍了BFC的概念、创建条件、应用,以及如何利用BFC解决CSS布局问题。此外,还涵盖了Vue和React的相关面试题,如组件通信、生命周期、虚拟DOM等,帮助读者快速准备前端面试。
摘要由CSDN通过智能技术生成

快速搞定一面~技术面

一、HTML模块

如何理解HTML语义化

HTML语义化:HTML本身就是标记语言,根据内容的结构化,选择合适的标签便于开发者阅读和写出更优雅的代码的同时让浏览器的爬虫和机器很好地解析

语义化的好处:

  1. 语义化增加代码可读性,便于团队开发和维护。
  2. 有利于SEO:和搜索引擎建立良好沟通,有助于爬虫抓取更多的有效信息:爬虫依赖于标签来确定上下文和各个关键字的权重
常见的块级元素和内联元素

display :block / table ;
有 div、h1、h2、table、ul、ol、p

dispaly :inline-block / inline
有 span、img、input、button、

二、CSS模块

CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括:外边距(margin)、边框(border)、内边距(padding)、实际内容(content)四个属性。

1. 盒模型宽度计算

box-sizing属性可以指定盒子模型种类

  • 默认,W3C(标准盒模型):box-sizing : content-boxwidth值不包括borderpadding
  • IE盒子模型(怪异盒模型):box-sizing : border-boxwidth值就包括了borderpadding,即真实的 width变小了

总结:

  • 一个元素的布局宽度,offsetWidth=(width+padding+border),无margin

请问 div 的offsetWidth是多大?

#div{
   
	width:100px;
	padding:10px;
	border:1px solid #ccc;
	margin:10px;
}

首先offsetWidth =(width+padding+border),无margin
所以offsetWidth = 100px+10px*2+1px*2=122px

在这里插入图片描述
如果要使offsetWidth 为100px,需要加上box-sizing:border-box;,这时中间的width由100px变成了78px
在这里插入图片描述

2. margin 纵向重叠问题
  • 相邻元素的margin-topmargin-bottom 会发生重叠
  • 空白内容的<p></p>也会重叠

AAABBB之间的距离? 答案:15px在这里插入图片描述
在这里插入图片描述

中间三个空的P标签不渲染,AAA的下边距15px,BBB的上边距为10px,两者重叠,取最大的15px

3. inline-block中的元素之间的空格是什么引起的?

元素被当成行内元素排版的时候,元素之间的空白符(空格、回车换行等)都会被浏览器处理,根据white-space的处理方式(默认是normal,空白会被浏览器忽略),HTML代码中的回车换行被转成一个空白符,在字体不为0的情况下,空白符占据一定宽度,所以inline-block的元素之间就出现了空隙。

解决办法:

  1. 删除元素之间的空白符 <div class="box1">box1</div><div class="box2">box2</div>
  2. 在父元素中设置font-size: 0,在子元素上重新设置正确的font-size
  3. inline-block元素添加样式float:left
4. margin 负值问题
  • margin-topmargin-left 负值,元素会向上、向左移动
  • margin-right 负值,其右侧元素会左移,自身不受影响。
  • margin-bottom 负值,其下方元素上移,自身不受影响。
5. BFC概念?如何使用?

BFCBlock formatting context ,块级格式化上下文,如果一个元素符合了成为BFC的条件,该元素内部元素的布局和定位就和外部元素互不影响(除非内部的盒子建立了新的 BFC),是一个隔离了的独立容器,它涉及两个概念:

Formatting context

属于 W3C CSS2.1 ,它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。

  • Block fomatting context (BFC)
  • Inline formatting context (IFC)
Box

Box 是 CSS 布局的对象和基本单位, 一个页面是由很多个 Box 组成的。元素的类型和 display 属性,决定了这个 Box 的类型。

  • block-level boxdisplay:block|list-item|table,会生成 block-level box,并且参与 block fomatting context;
  • inline-level boxdisplay:inline|inline-block|inline-table,会生成 inline-level box,并且参与 inline formatting context;
  • run-in box: css3中才有, 这儿先不讲了
1. BFC的布局规则
  • BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之也如此。

  • 内部的Box会在垂直方向,一个接一个地放置

  • Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠(margin-top、margin-bottom为什么会重叠)。

  • 每个盒子(块盒与行盒)的margin box的左边,与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。

  • BFC的区域不会与float box重叠(清除浮动)。

  • 计算BFC的高度时,浮动元素也参与计算。

2. 如何创建BFC,形成BFC的条件
  • 浮动元素,float除了none之外的值
  • 绝对定位元素,position(absolute、fixed)
  • overflow 除了visible之外的值(hidden、auto、scroll)
  • display的值是inline-block、table-cell、flex、table-caption或者inline-flex
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>BFC</title>
</head>
<style>
    *{
   
        margin: 0;
        padding: 0;
    }
    body {
   
        width: 100%;
        position: relative;
    }

    .left {
   
        width: 100px;
        height: 150px;
        float: left;  /* 1.设置浮动 */
        background: rgb(139, 214, 78);
        text-align: center;
        line-height: 150px;
        font-size: 20px;
    }

    .right {
   
        overflow: hidden;    /* 2.触发BFC */
        height: 300px;
        background: rgb(170, 54, 236);
        text-align: center;
        line-height: 300px;
        font-size: 40px;
    }
</style>
<body>
    <div class="left">LEFT</div>
    <div class="right">RIGHT</div>
</body>
</html>

3. BFC常见的应用
  • 清除浮动,外层div设置overflow:hidden;
  • 防止垂直 margin 上下重叠:给其中一个元素外面套上一个div,把这个div变成BFC
  • 自适应两栏布局:侧边栏浮动,重要内容区域变成BFC
手写clearfix
.clearfix:after{
   
	content:'';
	display:table;
	clear:both; 
}
6. float布局

在这里插入图片描述

圣杯布局

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>圣杯布局实现</title>
  <style>
    #header{
   
      background-color: #fa1717;
      height:100px;
    } 
    .column{
   
      float: left;  /*第一步,设置左浮动*/
    }
    #left{
   
      background-color: #ee8037;
      width: 200px;
      height:100px;
      /* 第三步,利用margin-left: -100% 使得left与center在同一行 负值使left 向左移动100% */
      margin-left: -100%;
    }
    #right{
   
     /* 第四步,利用相对定位将right 移到右边*/
      position: relative;
      right: 150px;
      background-color: #377dee;
      width: 150px;
      height:100px;
      margin-right:-150px;
    }
    #center{
   
      background-color: #999;
      width: 100%;
      height:100px;
      text-align: center;
    }
    #footer{
   
      clear: both;  /* 第二步清除 footer的浮动 */
      background-color: palevioletred;
      height:100px;
    }
  </style>
</head>
<body>
  <div>
    <div id="header">  header</div>
    <div id="container">
      <div id="center" class="column">center</div>
      <div id="left" class="column">left</div>
      <div id="right" class="column">right</div>
    </div>
    <div id="footer">footer</div>
  </div>
</body>
</html>

在这里插入图片描述

双飞翼布局
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>双飞翼布局</title>
  <style>
    body{
   
      min-width: 500px;
    }
    .column{
   
      float: left;/* 第一步 设置浮动 */
    }
    #main{
   
      background-color: #999;
      width: 100%;
      height:200px;
    }
    #main-warp{
   
      /* 第二步,设置外边距 */
      margin: 0 200px 0 200px;
    }
    #left{
   
      background-color: #ee8037;
      width: 200px;
      height:200px;
      /* 第三步,设置margin-left,使左边放到main 的左边  */
      margin-left: -100%;
   }
    #right{
   
      width: 200px;
      height:200px;
      background-color: #377dee;
      /* 第四步,设置right到对应的位置 */
      margin-left: -200px;
    }
  </style>
</head>
<body>
  <div>

    <div id="main" class="column">
      <div id="main-warp">main</div>
    </div>
    <div id="left" class="column">left</div>
    <div id="right" class="column">right</div>
  </div>
</body>
</html>

在这里插入图片描述

7. flex 布局
  • flex-direction
  • justify-content
  • align-items
  • flex-warp
  • align-self

常见问题: flex:1 0 auto 代表什么?

flex: [ flex-grow ] [ flex-shrink ] [ flex-basis ]

flex-grow:定义了项目的放大比例,默认为0,即如果存在剩余空间,也不放大
flex-shrink:定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。
flex-basis:定义了在分配多余空间之前,项目占据的主轴空间(main
size),浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小
在这里插入图片描述

8. absolute、relative定位(子绝父相)
  • relative 相对定位,相对于自身定位
  • absolute 绝对定位,依据最近一层的定位元素定位
9. 使元素水平居中对齐
  • inline元素 :text-align:center
  • block元素: margin:auto
  • absolute元素:left:50%;margin-left 负值(-宽度/2)
10.使元素垂直居中对齐
  • inline 元素 :line-height 值 = height 值
  • absolute元素:top:50%;margin-top 负值(-高度/2)
  • absolute元素:transform:translate(-50%,-50%)
  • absolute元素:top、left、bottom、right=0 ; margin:auto
11. 让未知宽高的Div垂直水平居中
  • flex
  • transform
  • table-cell
  1. 父容器设置 display:flex;
display: flex; 
justify-content: space-around; 
align-items: center;
  1. 父容器设置 position: relative;,子容器如下
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
  1. 父容器设置dispaly:table-cell;
display: table-cell;
text-align: center;
vertical-align: middle;

子容器设置 vertical-align: middle;

12. line-height 继承问题

如下代码,p的行高将会是多少?

body{
   
	font-size:20px;
	line-height:200%;  
} 
p{
   
	font-size:16px;
}

答案是40px

  • line-height 为具体数值,如line-height:30px,则直接继承为30px
  • line-height 为比例时,如 line-height:1.5,则继承该比例,即16px1.5=24px ,用自身的字体大小比例
  • line-height 为百分比时,如line-height:200%,则继承父标签计算20px*200%=40px的结果

10. 响应式布局

  • px :绝对长度单位
  • em:相对长度单位,相对于父元素
  • rem : 相对长度单位,相对于根元素(html),常用与响应式布局
1. 用 @media 和 rem 实现的
@media only screen and (max-width:374px){
    /**/ iphone 5 及更小尺寸
}

@media only screen and (min-width:375px) and (max-width:413px){
   
  /*iPhone 678 、iPhone  X*/
}
@media only screen and (min-width:414px) {
   
  /*iPhone 6P 或更大尺寸*/
}

rem 的弊端,“阶梯”性

2. 用vh\vw

先来看下三个概念

  • window.screen.height 手机屏幕高度,手机型号不同,高度不一致
  • window.innerHeight 可视窗口高度,去掉浏览器头尾,不同浏览器的header和footer不一致
  • document.body.height body 的高度,取决于整体内容的高度

vh 网页视口高度的1/100
vw 网页视口高度的1/100

vmax 取两者最大值,vmin 取两者最小值
当手机竖着,vmaxvhvminvw
当手机横屏,vmaxvwvminvh

div{
   
	width:10vmax;
	height:20vmin
} 

11. CSS3 动画

/*  定义动画  */
@keyframes example{
   
	from {
   background-color:red}
	to {
   background-color:blue}
}

div{
   
	width:100px;
	height:100px;
	background-color:red;
	animation-name:example;
	animation-duration:4s;

} 

animation 属性是一个简写属性,用于设置六个动画属性:
默认:animation :none 0 ease 0 1 normal

  • animation-name 规定需要绑定到选择器的 keyframe 名称。。
  • animation-duration 规定完成动画所花费的时间,以秒或毫秒计。
  • animation-timing-function 规定动画的速度曲线。
  • animation-delay 规定在动画开始之前的延迟。
  • animation-iteration-count 规定动画应该播放的次数。
  • animation-direction 规定是否应该轮流反向播放动画。
Vue中scoped原理? 怎么穿透scoped?

Vue在编译的时候通过在DOM元素以及css样式上加上唯一标记,实现样式私有化,不污染全局样式

穿透scoped:深度选择器

  • >>>
  • /deep/
  • ::v-deep

12. DOM

1. DOM是什么?

DOM(document Object Model )即文档对象模型,它允许脚本(js)控制Web页面、窗口和文档,是HTML和XML文档的编程接口API

W3C(万维网联盟)把DOM标准分为三个部分:

  • 核心 DOM,针对任何结构化文档的标准模型
  • XML DOM,针对XML文档的标准模型
  • HTML DOM,针对HTML文档的标准模型
2. DOM有什么用?

DOM把一份文档(HTML为例),表示为一棵树,文档是由各种节点构成的集合,而节点有不同的类型,常说的就是HTML DOM树 ,由不同的节点组成的,比如文档节点、元素节点、属性节点、文本节点、注释节点,DOM可以操作HTML中的元素
在这里插入图片描述
111

3. DOM基本功能?
  1. 查询某个元素,元素集合
  2. 查询某个元素的祖先、兄弟以及后代元素
  3. 获取、修改元素的属性
  4. 获取、修改元素的内容
  5. 创建、插入、删除元素
const div=document.getELementById('div')//获取元素
const divList=document.getElementsByTagName('div')//获取div元素列表
console.log(divList[0])

const pList=doument.querySelectorAll('p')//集合
const p1=pList[0];
//property 形式,对DOM元素的js变量进行修改,修改对象属性,不会体现在html结构中
p1.style.width='100px';//修改高度属性
console.log(p1.className)//获取class
p1.className='red';//修改 class 

//获取nodeName、nodeType
console.log(p1.nodeName)//获取nodeName ,打印 p
console.log(p1.nodeType)//获取nodeType , 打印 1
//attribute形式,对DOM节点属性进行修改,修改html属性,会改变html结构
p1.getAttribute('data-name')
p1.setAttribute('data-name','hh')
p1.getAttribute('style')
p1.setAttribute('style','font-size:30px')

两者都有可能引起DOM重新渲染

const newP=decument.createElement('p')// 创建元素
newP.innerHTML='this is newP'

div1.appendChild(newP)//插入节点

//移动现有的节点
const p1=document.getElementByID('P1')
div2.appendChild(p1)

//获取父元素
console.log(p1.parentNode)

//获取子元素列表
const div1ChildNodes=div1.childNodes;
const div1ChildNodesP=Array.prototype.slice.call(div1ChildNodes).filter(child=>{
   
	if(child.nodeType===1){
   
		return true
	}
	return fasle
})

console.log(div1ChildNodesP)

const child=document.getElementById('div1').childNodes
div1.removeChild(child[0])//删除节点
4. DOM与JS的关系

使用JS对网页进行的操作,是通过DOM来进行的

5. 优化DOM渲染
  1. DOM查询做缓存 (const div=document.getElementById('mydiv'))
  2. 将频繁操作改为一次性操作(appendChild
    在这里插入图片描述
    在这里插入图片描述

13. BOM

http://c.biancheng.net/js/bom/

1. 什么是BOM?

BOM(Browser Object Model) 是指浏览器对象模型,是用于描述这种对象与对象之间层次关系的模型,浏览器对象模型提供了独立于内容的、可以与浏览器窗口进行互动的对象结构。

BOM由多个对象组成,其中代表浏览器窗口的Window对象是BOM的顶层对象,其他对象都是该对象的子对象。

  • window:客户端 JavaScript 顶层对象。每当 <body> <frameset> 标签出现时,window 对象就会被自动创建。
  • navigator:包含客户端有关浏览器信息。
  • screen:包含客户端屏幕的信息。
  • history:包含浏览器窗口访问过的 URL 信息。
  • location:包含当前网页文档的 URL 信息。
  • document:包含整个 HTML 文档,可被用来访问文档内容及其所有页面元素
2. Window对象
  • 所有浏览器都支持 window 对象,它表示浏览器窗口
  • 所有 JavaScript 全局对象、函数以及变量均自动成为 window 对象的成员
  • 全局变量是 window 对象的属性,全局函数是 window 对象的方法,甚至 HTML DOM 的 document 也是 window 对象的属性之一
window尺寸

window.innerHeight - 浏览器窗口的内部高度(包括滚动条)
window.innerWidth - 浏览器窗口的内部宽度(包括滚动条)

window方法

window.open() - 打开新窗口
window.close() - 关闭当前窗口
window.moveTo() - 移动当前窗口
window.resizeTo() - 调整当前窗口的尺寸

3. navigator对象

navigator 对象存储了与浏览器相关的基本信息,如名称、版本和系统等。通过 window.navigator 可以引用该对象,并利用它的属性来读取客户端基本信息。

navigator.userAgent

BOM 在 navigator 对象中定义了 userAgent 属性,利用该属性可以捕获客户端 user-agent 字符串信息。

var s = window.navigator.userAgent; 
// var s = navigator.userAgent;//简写方法

console.log(s); //返回类似信息:Mozilla/5.0 (Windows NT 10.0; Win64;x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36

user-agent 字符串包含了 Web 浏览器的大量信息,如浏览器的名称和版本。

4. screen对象

screen 对象存储了客户端屏幕信息,这些信息可以用来探测客户端硬件配置。利用 screen 对象可以优化程序的设计,提升用户体验。

不同浏览器在解析 screen 对象的 width 和 height 属性时存在差异。

screen.width
screen.height
5. location对象

location 对象存储了当前文档位置(URL)相关的信息,简单地说就是网页地址字符串。

举例说明:
http://www.123.cn:80/news/index.asp?id=123&name=location#top

console.log(location.href) //url地址 http://www.123.cn:80/news/index.asp?id=123&name=location#top
console.log(location.protocol) //协议 http:
console.log(location.host) //主机及端口 www.123.cn:80
console.log(location.hostname) //主机名称 www.123.cn
console.log(location.port) //端口 80
console.log(location.pathname) // URL的路径部分 /news/index.asp
console.log(location.search) // URL 的查询部分,包括前导问号(?) ?id=123&name=location
console.log(location.hash) // URL 中锚部分,包括前导符(#) 
### 回答1: JavaScript作为一种强大的脚本语言,可以快速搞定前端技术。在前端开发中,JavaScript可以用来实现交互效果、动画效果、表单验证、页布局等各种功能。同时,JavaScript也可以与HTML、CSS紧密结合,使页功能更加丰富。 为了快速搞定前端技术,需要熟练掌握JavaScript的基本语法和常用API,例如DOM操作、事件处理、定时器、Ajax等。掌握这些知识不仅可以提高开发效率,还能够让你在前端开发中发挥更大的创造性。 除了学习JavaScript的基本语法和API之外,还要多进行实战练习,掌握实际应用技巧。可以参考优秀的前端开源项目和博客,了解不同的开发思路和技术实现方法,同时也可以积累更多的经验。 最后,在进行前端开发的过程中,可以使用比较成熟的JavaScript框架和库,比如jQuery、AngularJS、React等,能够更好地提高开发效率,并且有助于让你的应用达到较好的性能和用户体验。 总之,通过深入学习JavaScript,结合实际开发实践,应用成熟的JavaScript框架和库,可以快速搞定前端技术,使自己更加成为一名优秀的前端开发工程师。 ### 回答2: JavaScript是一种高级编程语言,用于在网页上创建交互式效果。它可以被用于快速搞定前端技术JavaScript的主要优点之一是它易于学习和使用。它被广泛使用,因为它不仅简单易懂,更可以用于许多场景。JavaScript可以用于DOM操作、事件处理、动画、表单验证等多种场景,这些都是前端技术中的核心部分。 对于想要迅速入门前端技术的人来说,建议从JavaScript开始学习。有很多在线资源,比如MDN文档,可以帮助你开始认识JavaScript的基础知识和语法。同时,有很多JavaScript框架,如React、Vue、Angular等,可以让你更有效地构建大型应用程序。 另外,要想在前端技术领域获得成功,还需要学习HTML和CSS。它们是构建网页的基础。但是,通过JavaScript,你可以使这些基础更加强大。例如,你可以使用JavaScript操作HTML元素,并对其添加样式,使网页更加交互和美观。 因此,如果你想快速搞定前端技术,请开始学习JavaScript吧。你会发现这是一门动态、有趣且实用的编程语言,可以帮助你构建高度可交互的网页体验。 ### 回答3: JavaScript是一门运行在浏览器端的编程语言,是前端开发必备的技术之一。在JavaScript中,可以使用HTML和CSS来操作和控制页的交互和显示效果,同时也可以通过JavaScript来实现一些复杂的功能和逻辑操作。 要快速搞定前端技术中的JavaScript,需要掌握以下几个方: 1. 基础语法:JavaScript的基础语法包括变量、数据类型、运算符、流程控制语句等,需要掌握这些基本概念,才能编写出简单的程序。 2. DOM操作:DOM是文档对象模型的缩写,用于操作HTML和CSS。掌握DOM操作能够使前端开发更为得心应手,可以快速处理页的展示效果。 3. AJAX:AJAX是异步JavaScript和XML的缩写,是一种用于创建快速动态网页的技术。它可以通过JavaScript异步请求数据,可以将页刷新的时间和流量大大降低。 4. 框架和库:JavaScript拥有众多框架和库,这些工具包可以帮助前端开发者更快速地完成开发工作。例如,React、Vue.js等框架可以将前端开发极大地简化,加速前端开发效率。 总而言之,想要快速搞定前端技术中的JavaScript,需要不断学习掌握基础语法、DOM操作、AJAX等技术,同时了解一些常用的库和框架,这样便可以更好地适应前端开发的需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值