当前位置:首页 » 《资源分享》 » 正文

【八股】前端(CSS、JavaScript)

29 人参与  2024年12月07日 16:00  分类 : 《资源分享》  评论

点击全文阅读


文章目录

一、CSS1.CSS盒模型2.CSS选择器的优先级3.隐藏元素的方法4.px和rem的区别5.重绘和重排的区别6.让一个元素水平垂直居中的方式有哪些?7.CSS的哪些属性哪些可以继承?哪些不可以继承?8.预处理器9.布局引擎 二、JavaSscipt1.JS由哪三部分组成?2.JS有哪些内置对象?3.操作数组的方法4.JS对数据类的检测方式有哪些?5.闭包,闭包有什么特点?6.前端的内存泄漏怎么理解?7.事件委托8.基本数据类型和引用数据类型的区别?9.原型链。10.new操作符具体做了什么?

一、CSS

1.CSS盒模型

在HTML页面中的所有元素都可以看成是一个盒子。

盒子的组成:内容content、内边距padding、边框border、外边距margin

盒模型的类型:

标准盒模型:margin + border + padding + contentIE盒模型:margin + content(border + padding)

标准盒的宽高为content,IE盒模型的宽高为content + border + padding

控制盒模型的模式:box-sizing:content-box(默认值,标准盒模型)、border-box(IE盒模型)

<!DOTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>CSS盒模型</title>    <style>        *{            margin: 0;            padding: 0;        }        .box{            padding: 10px;            width: 200px;            height: 200px;            border: 3px solid;            background-color: red;            margin: 0 auto;            <!-- content-box的content为174*174(content174+padding10*2+border3*2=200) border-box的content为200*200  -->            box-sizing: content-box;        }    </style></head><body>    <div class="box">盒模型</div></body></html>

2.CSS选择器的优先级

CSS的特性:继承性、层叠性、优先级

优先级:写CSS样式的时候,会给同一个元素添加多个样式,此时谁的权重高就显示谁的样式

标签、类/伪类/属性、全局选择器、行内样式、id、!important

!important > 行内样式 > id > 类/伪类/属性 > 标签 > 全局选择器

3.隐藏元素的方法

display:none; 元素在页面上消失,不占据空间,不可交互
opacity:0; 设置了元素的透明度为0,元素不可见,占据空间位置,视情况可能可交互。
visibility:hidden; 让元素消失,占据空间位置,一种不可见的状态,不可交互
position:absolute; 配合负的 left 或 top 属性:元素会被移出视口,不可见,不占据空间,不可交互。
clip-path;

4.px和rem的区别

px是像素,显示器上给我们呈现画面的像素,每个像素的大小是一样,绝对单位长度

rem,相对单位 ,相对于html根节点的font-size的值,font-size默认16px,直接给html节点的font-size:62.5%;
1rem = 10px; (16px*62.5%=10px)

<!DOTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>        .box{            font-size: 18px;        }        html{            font-size: 62.5%;        }        .boxs{            font-size: 1rem;        }    </style></head><body>    <!-- 大小为18px -->    <div class="box">像素的单位</div>    <!-- 大小为16*62.5%*1=10px -->    <div class="boxs">像素的单位</div></body></html>

5.重绘和重排的区别

重排(回流):布局引擎会根据所有的样式计算出盒模型在页面上的位置和大小

重绘:计算好盒模型的位置、大小和其他一些属性之后,浏览器就会根据每个盒模型的特性进行绘制

对DOM的大小、位置进行修改后,浏览器需要重新计算元素的这些几何属性,就叫重排

对DOM的样式进行修改,比如color和background-color,浏览器不需要重新计算几何属性的时候,直接绘制了该元素的新样式,那么这里就只触发了重绘

重排一定触发重绘,重绘不一定触发重排

6.让一个元素水平垂直居中的方式有哪些?

定位+margin定位+transformflex布局grid布局table布局
<!DOTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>        *{            margin: 0;            padding: 0;        }        /* 定位+margin:父元素为相对位置,子元素为绝对位置,margin为0 auto */        /* .father{            width: 400px;            height: 400px;            border: 1px solid;            position: relative;        }        .son{            position: absolute;            width: 200px;            height: 200px;            background-color: red;            top: 0;            right: 0;            bottom: 0;            left: 0;            margin: 0 auto;        } */        /* 定位+transform:top: 50%; left: 50%;将元素的左上角移动到容器的中心。        然后transform: translate(-50%, -50%);将元素向上和向左移动其自身宽度和高度的一半,从而实现了居中。*/        /* .father{            width: 400px;            height: 400px;            border: 1px solid;            position: relative;        }        .son{            position: absolute;            width: 200px;            height: 200px;            background-color: blue;            top: 50%;            left: 50%;            transform: translate(-50%,-50%);        } *//* flex/grid布局: display:flex justify-content:center; 水平居中 align-item:center; 垂直居中 place-items: center; 水平和垂直居中*/        .father{            display: flex;            justify-content: center;            align-items: center;            width: 400px;            height: 400px;            border: 1px solid;        }        .son{            width: 200px;            height: 200px;            background-color: green;        }/* table布局 */.table-wrapper {  display: table;  width: 100%; /* 或者具体的宽度 */  height: 100vh; /* 视图高度 */} .table-cell {  display: table-cell; /* 单元格 */  text-align: center; /*文本居中 */  vertical-align: middle;}    </style></head><body>    <div class="father">        <div class="son"></div>    </div><div class="table-wrapper">  <div class="table-cell">      居中内容  </div></div></body></html>

7.CSS的哪些属性哪些可以继承?哪些不可以继承?

子元素可以继承父类元素的样式

字体的一些属性:font文本的一些属性:line-height元素的可见性:visibility:hidden表格布局的属性:border-spacing列表的属性:list-style页面样式属性:page声音的样式属性

8.预处理器

预处理语言增加了变量、函数、混入等强大的功能
SASS LESS

9.布局引擎

布局引擎在浏览器中起着关键作用,‌负责解析HTML和CSS代码、‌构建布局树、‌计算布局、‌绘制网页元素,‌以及处理重绘和回流等变化。‌

布局引擎是一种用于渲染和布局网页元素的核心技术,‌它的主要任务是计算网页元素的大小、‌位置和层次关系,‌以便将它们正确地显示在屏幕上。‌具体来说,‌布局引擎的工作原理包括以下几个步骤:‌

解析HTML和CSS:‌浏览器首先解析HTML和CSS代码,‌以确定网页的结构和样式。‌这包括创建DOM(‌文档对象模型)‌树和CSSOM(‌CSS对象模型)‌树。‌构建布局树:‌根据DOM树和CSSOM树,‌浏览器会构建一棵布局树,‌包含了屏幕上可见元素的所有信息,‌包括它们的大小、‌位置和层次关系。‌计算布局:‌布局引擎会遍历布局树,‌为每个元素计算确切的位置和尺寸。‌这包括处理盒模型、‌相对定位、‌绝对定位等布局方式。‌绘制:‌在计算完布局后,‌浏览器会将网页元素绘制到屏幕上。‌这包括创建图形上下文、‌处理背景、‌边框、‌颜色等样式,‌以及绘制文本、‌图像等内容。‌重绘和回流:‌在网页的生命周期中,‌可能会发生一些变化,‌如用户滚动页面、‌改变窗口大小、‌动态添加元素等。‌这些变化可能导致重绘和回流,‌从而影响性能。‌重绘是对已有内容的更改,‌而回流是指对页面布局进行的更改。‌优化:‌为了提高性能,‌浏览器会对布局引擎进行一些优化,‌例如批量处理多个重绘和回流操作、‌使用硬件加速等。‌

二、JavaSscipt

1.JS由哪三部分组成?

ECMAScript:JS的核心内容,描述了语言的基础语法,比如var,for,数据类型(数组、字符串)

文档对象模型(DOM):DOM把整个HTML页面规划为元素构成的文档

浏览器对象模型(BOM):对浏览器窗口进行访问和操作

2.JS有哪些内置对象?

String Boolean Number Array Object Function Math Date RegExp(正则)…

Math:abs() sqrt() max() min() round() pow()

Date:

new Date():‌无参数时,‌返回当前日期和时间。‌ newDate(milliseconds):‌接受一个表示自1970年1月1日00:00:00 UTC以来的毫秒数,‌并返回对应的日期和时间。‌new Date(dateString):‌接受一个日期字符串(‌如"2023-07-25")‌并返回对应的日期和时间。‌ newDate(year, month, day, hours, minutes, seconds,milliseconds):‌接受年、‌月、‌日、‌小时、‌分钟、‌秒和毫秒作为参数,‌并返回对应的日期和时间。‌注意,‌月份是从0开始计数的,‌即0表示一月,‌11表示十二月。‌getFullYear():‌返回四位数的年份。‌getMonth():‌返回月份(‌从0开始计数)‌,‌通常通过加1来得到人类可读的月份。‌ getDate():‌返回月份中的第几天。‌getDay():‌返回星期几(‌0代表星期日,‌6代表星期六)‌。‌getHours()、‌getMinutes()、‌getSeconds()、‌getMilliseconds():‌分别返回小时、‌分钟、‌秒和毫秒。‌

String:

length:‌获取字符串的字符长度。‌slice():‌提取字符串的一部分。‌substring():‌类似于slice(),‌但不会接受负值索引。‌indexOf():‌查找某个字符或子字符串在字符串中首次出现的位置。‌lastIndexOf():‌从后向前搜索字符串,‌并返回字符串最后出现的位置。‌charAt():‌返回指定位置的字符。‌toUpperCase() 和 toLowerCase():‌分别用于将字符串转换为大写或小写。‌trim():‌去除字符串两端的空白字符,‌包括空格、‌制表符、‌换行符等。‌concat():‌连接两个或多个字符串,‌并返回一个新的字符串。‌ replace() 和replaceAll():‌在字符串中查找匹配的子串,‌并替换与正则表达式匹配的子串。‌split():‌通过指定的分隔符将字符串分割成数组。‌ includes():‌检查字符串是否包含指定的子字符串。‌startsWith() 和 endsWith():‌分别检查字符串是否以指定的子字符串开头或结尾。‌

3.操作数组的方法

concat():‌用于连接两个或多个数组。‌它不会改变现有的数组,‌仅返回被连接数组的一个副本。‌

join():‌将数组中的所有元素转换为一个字符串。‌元素通过指定的分隔符进行分隔,‌默认使用逗号作为分隔符。‌

push():‌向数组的末尾添加一个或多个元素,‌并返回新的长度。‌

pop():用于删除并返回数组的最后一个元素

shift():‌把数组的第一个元素从其中删除,‌并返回第一个元素的值。‌

unshift():‌向数组的开头添加一个或更多元素,‌并返回新的长度。‌

splice():删除并返回指定的元素

sort():‌对数组的元素进行排序,‌并返回排序后的数组。‌

reverse():‌将数组中的元素进行倒序排列。‌

filter():‌创建一个新的数组,‌其包含通过测试函数的所有元素。‌

forEach():‌对数组的每个元素执行一次提供的函数。‌

map():‌创建一个新数组,‌其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。‌

slice():‌返回一个新的数组对象,‌这个对象是一个由开始到结束(‌不包括结束)‌选择的、‌由原数组的浅拷贝。‌

indexOf():‌返回在数组中可以找到给定元素的第一个索引,‌如果不存在,‌则返回-1。‌

lastIndexOf():‌从尾部开始向前搜索,‌返回指定元素在数组中最后出现的位置的索引。‌ reduce() 和

reduceRight():‌对累加器和数组中的每个元素(‌从左到右或从右到左)‌应用一个函数(‌处理函数)‌,‌将其减少为单个值。‌

哪些方法会改变原数组:push() pop() unshift() shift() sort() reverse() splice()

4.JS对数据类的检测方式有哪些?

typeof():输出数据的基本数据类型(number、boolean、string、object、undefined、function、symbol),若为引用数据类型,返回Object。

<script>console.log(typeof() 666) //number</script>

instanceof():判断是否为指定的引用数据类型(String、Number、Boolean、Undefined、Null、Symbol),无法判断基本数据类型

<script>console.log([] instanceof(Array)) //true</script>

constructor:几乎可以判断基本数据类型和引用数据类型

<script>console.log(([]).constructor() === Array) //true</script>

Object.prototype.toString.call():所有数据类型均可判断

<script>var gettype = Object.prototype.toString  gettype.call('aaaa') //输出 [object String] gettype.call(2222) //输出 [object Number] gettype.call(true) //输出 [object Boolean] gettype.call(undefined) //输出 [object Undefined] gettype.call(null) //输出 [object Null] gettype.call({}) //输出 [object Object] gettype.call([]) //输出 [object Array] gettype.call(function(){}) //输出 [object Function]</script>

5.闭包,闭包有什么特点?

函数嵌套函数,内部函数被外部函数返回并保存下来时,就会产生闭包

<!DOTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title></head><body>    <script>    function fn(a){        return function(){            console.log(a)        }    }    var fo = fn('abcd')    fo()</script></body></html>

特点:可以重复利用变量,并且这个变量不会污染全局的一种机制;这个变量是一直保存再内存中,不会被垃圾回收机制回收

缺点:闭包较多的时候,会消耗内存,导致页面的性能下降,在IE浏览器中才会导致内存泄漏

解决:

及时释放外部变量:‌确保在不再需要使用闭包中的外部变量时,‌将其释放或设置为null,‌以便垃圾回收器可以正确回收内存。‌使用空函数或null来解除引用:‌当你确定不再需要闭包时,‌可以将闭包内的引用设置为null或一个空函数,‌这样垃圾回收器就可以回收外部函数的作用域。‌

使用场景:防抖,节流,函数嵌套函数避免全局污染的时候

6.前端的内存泄漏怎么理解?

JS里已经分配内存地址的对象,但是由于长时间没有释放或者没办法清除,造成长期占用内存的现象,会让内存资源大幅浪费,最终导致运行速度慢,甚至崩溃的情况。
垃圾回收机制
因素:一些为生命直接赋值的变量;一些未清空的定时器;过度的闭包;一些引用元素没有被清除。

7.事件委托

就是利用事件冒泡将内部的事件交给父元素来触发,可减少绑定次数(提高性能),可动态添加和删除(方便维护)
又叫事件代理,原理就是利用了事件冒泡的机制来实现,也就是说把子元素的事件绑定到了父元素的身上
如果子元素组织了事件冒泡,那么委托也就不成立
组织事件冒泡:event.stopPropagation()
addEventListener(‘click’,函数名,true/false) 默认是false(事件冒泡),true(事件捕获)

好处:提高性能,减少事件的绑定,也就减少了内存的占用。

8.基本数据类型和引用数据类型的区别?

基本数据类型:String Number Boolean undefined null
基本数据类型保存在栈内存当中,保存的就是一个具体的值

引用数据类型(复杂数据类型):Object Function Array
保存在堆内存当中,声明一个引用类型的变量,它保存的是引用类型数据的地址
假如声明两个引用类型同时指向了一个地址的时候,修改其中一个那么另外一个也会改变

9.原型链。

原型就是一个普通对象,它是为构造函数的实例共享属性和方法;所有实例中引用的原型都是同一个对象
使用prototype可以把方法挂在原型上,内存值保存一份
__proto__可以理解为指针,实例对象中的属性,指向了构造函数的原型(prototype)
实例对象和构造函数的__proto__指向构造函数原型,原型的__proto__指向父类原型
实例的隐式原型 === 构造函数的显式原型

10.new操作符具体做了什么?

1.先创建一个空对象
2.把空对象和构造函数通过原型链进行链接
3.把构造函数的this绑定到新的空对象身上
4.根据构建函数返回的类型判断,如果是值类型,则返回对象,如果是引用类型,就要返回这个引用类型


点击全文阅读


本文链接:http://zhangshiyu.com/post/197662.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1