前端-HTML和css八股文篇

2,931 阅读16分钟

欢迎指出错误

1、background-size中的cover和contain的差别:

  • 在不设置的情况下,以原图的尺寸显示并且平铺
    
  • 在设置cover的情况下: 会使图片的短边拉伸至与元素想同大小(往大了拉).
    
  • 在设置contain的情况下: 会使图片的短边与元素相同大小(往小了拉)
    

2、元素的优先级计算方式:

  • 元素选择器: 0 0 0 0 1
    
  • 类|伪类|属性选择器:   0 0 0 1 0
    
  • ID选择器:   0 0 1 0 0
    
  • 行内样式:    0 1 0 0 0  
    
  • !important: 1 0 0 0 0
    
  • 选择器之间进行累加比较大小,并且不进位
    

3、伪类选择器(css3):

  • 选择是第一个子元素并且符合#ele的: #ele:first-child
    
  • 选择是第n个子元素并且符合#ele的: #ele:nth-child(n)
    
  • 选择在父元素下第n个为ele标签的元素:   ele:nth-of-type(n)
    
  • 选择前三个元素: ele:nth-child(-n+3)
    
  • 选择后三个元素: ele:nth-last-child(-n+3)
    
  • 选择其父元素下为偶数个的元素: ele:nth-child(even) || ele:nth-child(2n)
    
  • 选择其父元素下为奇数个的元素: ele:nth-child(odd) || ele:nth-child(2n+1)
    
  • 在nth-child中使用(n)时,n的为(0,1,2,3....)代入,并且表达式内<0的数会直接忽略
    

4、清除浮动的方式:

  • 1、使用overflow: hidden
    
  • 2、使用伪元素:after--- 
      .clearfix::after {
              content: "";
              display: block;
              height: 0;
              clear: both;
              visibility: hidden;
      }
    
  • 3、使用伪元素:after:before--- 			
      .clearfix::after,
      .clearfix::before {
              content: "";
              display: table;
      }
    
      .clearfix::after {
              clear: both;
      }
    
  • 4、在当前元素内的添加一个last-child并且设置clear: both;
    

5、a标签的四大伪类:

  • :link (默认状态下的样式为rgba(0, 0, 238))
    
  • :visited (当标签被访问过之后的颜色)
    
  • :hover (当鼠标move到标签上时的样式)
    
  • :active (当鼠标click标签时的样式)
    

6、设置仅在一行显示,溢出显示小数点

  • white-space: nowrap;
    
  • overflow: hidden;
    
  • text-overflow: ellipsis;
    

7、论述浏览器主要内核

  • Chrome的Blink(2013年以前使用Webkit)
    
  • Opera的Blink(2013年以前使用Presto)
    
  • Safari的Webkit
    
  • IE的trident(IE edge使用edgeHTML)
    
  • 其他浏览器(QQ,百度等)使用trident+Chromium
    

8、论述盒模型

  • W3C标准盒模型和怪异盒模型
    
  • 通过设置box-sizingborder-box(怪异盒模型)和content-box(标准盒模型)
    
  • 差异: 在标准盒模型下,width和height是不包含border和padding的.在怪异盒模型下,则是包含的
    

9、HTML文件顶部的的作用

  • 作用: 告诉浏览器html使用的规范
    
  • html4.0: 1、基于SGML(标准通用标记语言),
             2、有DTD(文档定义类型),
            3、拥有transition(过渡模式,可以使用废弃的标签)、frameset(框架模式)、strict(严格模式)
    
  • xhtml: 也拥有上述的三种模式
    
  • html5: 1、不基于SGML 2、没有DTD
    

10、src和href的区别:

  • src表示引入:常用于js脚本href表示引用:常用于css文件
    src会阻塞浏览器parse过程,可以设置async或者defer来异步执行
        defer会在DomcontentLoaded之前页面解析渲染完毕之后执行
        async会在脚本被加载完成之后就执行
    href是异步引入的不会阻塞浏览器的parse.(具体见下面)
        css和js会阻塞浏览器的渲染吗?
             脚本文件是会的,如果在浏览器parsehtml标签的时候,parse到了script,那么就会停止渲染去解析script,如果在脚本中获取到了标签的样式,那么就需要去解析css样式表,这时css也阻塞了浏览器的渲染.
    

11、textContent和innerHTML和innerText的区别? (JS内容)

  • innerHTML会解析被选中的所有内容,并且不会转义
    
  • textContent会解析被选中的所有的nodeType为text的元素,并且会转义
    
  • innerText会解析被选中的文本(去除换行),同时会忽略displaynone的文本内容
    

image.png

12、当页面中有大量的图片时,如何提高加载速度?

  • 1、使用懒加载技术,监听srcoll位置,对图片进行加载
    
  • 2、使用iconfont、spirit精灵图、base64等压缩图片
    
  • 3、可以在加载时使用模糊图片,在加载完成后使用清晰图片
    

13、列举css选择器

  • 1、元素选择器
    2、类选择器
    3、ID选择器
    4、兄弟选择器
    5、后代选择器
    6、并集选择器
    7、伪类选择器
    8、伪元素选择器
    

14、css Hack?

  • 针对不通过浏览器,或者相同浏览器的不同版本,相同的样式可能会存在差异,需要对这些差异进行css code
    
  • 1、条件注释hack
    2、类前缀hack
    3、选择器前缀hack
    

15、块级元素和行内元素的区别?

  • 1、块级元素独占一行,并且宽度默认为父元素的宽度
       行内元素由内容撑开,并且相邻的行内元素可以在同一行
       
    2、块级元素marginpadding都有效.
      行内元素margin左右有效 上下无效,padding左右有效,上下会影响background,但是不参与高度的计算,如图一
      
    3、块级元素可以嵌入行内元素或者块级元素.
       行内元素只能容纳行内元素或者行内块元素
    

图一 -- image.png

16、外边距合并问题?

  • 1、相邻的元素(兄弟元素之间设置了相对方向,父子元素设置了相同方向的marginTop),会出现合并效果.
    
  • 2、兄弟元素之间设置了相对方向的margin时,它们之间的margin会(margin同号时)取绝对值较大的那个,(margin异号时,取这两个margin相加的值)
    
  • 3、设置了marginTop的父元素和第一个子元素并且设置了marginTop的也会产生合并
    
  • 4、附加-- 被块级元素包裹的第一个子元素设置marginTop时,该属性会向上传递到父元素上 
    
  • 5、解决外边距合并问题: 
       兄弟元素: 1、只是用一个margin,或者使用padding代替margin.
                2、给其中一个元素添加一个父元素,然后参照父子元素
                
       父子元素: 1、给父元素添加一个小的border-top或者padding-top,如图三
                2、设置overflow: hidden(产生BFC)
    

-- 图二 image.png

-- 图三 image.png

17、rgba() opacity visible: hidden display:none 的区别?

1rgba()用于设置color或者background-color的颜色和透明度
2opacity设置的是整个元素的透明度,并且当前元素可以触发事件
3、visible设置hidden时,透明度为0,但是当前元素不会触发事件
4display: none不参与渲染,从render中摘除

18、css中设置垂直方向和水平方向重叠的属性

1、设置水平方向重叠的属性: leter-spacing(设置字符之间距离),word-spacing(设置文本、行内元素、行内块元素之间的水平距离),如图四
2、设置垂直方向重叠的属性: line-height = font-size + 行距,line-height会定义元素的之间的距离,当line-height < font-size时,字体会撑开line-height,与兄弟元素之间产生重叠,具体看这:[(https://blog.csdn.net/a2013126370/article/details/82786681)]

-- 图四 image.png

19、居中的方法?

  • 1、块级元素的水平居中(margin: 0 auto)
       行内元素的水平居中(text-align: center)  父元素设置垂直居中(line-height = height).
          行内块元素垂直居中需要加上(vertical-align: middle)因为它是基线对齐
    

垂直水平居中:

  • 2flex布局 对父元素设置display: flex; jusitfy-content: center; align-items: center(css3,IE9不支持)
    
  • 3flex布局 对父元素设置display: grid; 子元素设置jusitfy-self: center; align-self: center(css3,IE9不支持)
    
  • 4、定位布局: 父元素设置relative; 子元素设置absolute; 子元素设置top: 50%,left: 50%;
        4.1: 子元素设置 margin-left: -(一半自己的宽度), margin-top: -(一半自己的高度);
        4.2: 子元素设置 transform: translate3d(-50%,-50%, 0);(不用知道自己的宽高)
        4.3: 子元素设置 top:calc(50% - 一半自己的高度), left: calc(50% - 一半自己的宽度)
        4.4: 子元素设置 top: 0; left: 0; right: 0; bottom: 0; margin: auto;
    
  • 5、子元素设置为inline-block,父元素设置text-align: center; font-size: 父元素的(60%的高度),这个font-size是由于line-height默认为normal,会被font-size撑开,同时设置的font-size决定了基线的位置是靠近line-height的高度的,所有显示被居中了.
    
  • 6、父元素设置display: table-cell、text-align: center,vertical-align: middle(子元素为inline-block)
    
  • 7table表内的td设置 align: center v-align: middle;
    
  • 8、双层inline-block居中: 如图五(改变字体方向从而实现居中)
    

补充: 部分方式主要是体现发散性思维和知识面的广度,在业务中不适用 图五: image.png

20、px、em、rem、%、无单位的区别?

 1、px表示像素,是绝对单位
 2em是相对单位,a(em) = a*(当前元素字体大小) (px)
 3、rem是相对单位,a(rem) = a * (根结点html上的字体大小)(px)
 4、%: 1、表示宽高时: %相对于父元素的宽高
        2、表示偏移时: %相对于父包含块(见下)
        3、表示margin和padding时: %相对于父元素的宽度
 5、不设置单位时,当前设置会被忽略

21、display:none和visibility:hidden的区别?你还知道什么办法可以让元素消失?

 1、display:none不会参与渲染,在进行布局时,会被忽略,
 2、visible依然参与渲染,并且在标准流中,只是透明度设置为0了.(区分opacity和visible见22)
 3、可以让元素的width和height设置为0,让元素消失

22、CSS link和@import的区别?

  1link是html标签,@import是css提供的一种方式
  2、@import会在css加载完成后进行加载,link则是异步加载的
  3、dom可控性,可以通过 JS 操作 DOM ,插入`link`标签来改变样式;由于 DOM 方法是基于文档的,无法使用`@import`的方式插入样式。

23、论述什么是BFC?

  BFC(block formating context)表示块级格式化上下文,决定了与外部的位置关系和内部的排列方式
  1、BFC内的元素在垂直方向上排布
  2、相邻的元素之间由margin决定大小,margin之间会产生合并
  3、BFC区域不会和float元素重叠
  4、BFC大小的计算包含float
  5、BFC不会影响外部的元素,外部的元素也不会影响BFC区域的
  • 产生BFC的方式:
     1、overflow不为visiblede
     2、设置float不为none
     3、设置position为absolute或者fixed
     4、设置display为inline-block、table-cell、table-caption
     5、html就是一个BFC
    

24、display中的值的作用?

   1block: 常见标签: ul,ol,div,phxli标签
               可以设置宽高,独占一行,marginpadding有效
   2inline: 常见标签: spana.
               宽高由内容撑开,marginpadding左右有效,padding上下只影响background
   3inline-block: 常见标签: img,inputtd
              拥有inlineblock的特性、可以设置宽高、默认由内容撑开、相邻元素在同一行上

25、position中的值的作用?

    1static: 默认postion、可用于消除absolute
    2、relative: 常用于作为absloute的包含块、并且可以进行偏移、偏移不会影响标准流
    3、absolute: 不在标准流上、可以进行偏移、偏移基于父包含块.
    4fixed: 不在标准流上、可以进行偏移、偏移基于viewport,并且不随滚动条滚动
    补充: 在设置偏移时、top:0 和不设置top是有区别的,
         不设置时、默认在没有设置偏移时的位置、设置之后就会基于包含块偏移

26、描述“包含块”?

    包含块(context block css2.1)指的是要确定一个标签的位置和大小需要一个参照、这个参照就是包含块
    1、html根元素包含块: viewport视窗的大小
    2、position: static、relative的包含块为祖先的、最近的、块级盒子
    3、position: absolute的包含块为祖先的、最近的、position不为static的元素
    4、positon: fixed的包含块为html根元素包含块

27、为什么要清除浮动? 清除的方式?

    1、有些内容从后端获取到之后无法确定容纳content的盒子大小时,并且由使用了浮动、那么不清楚浮动就会使下面的内容上浮、影响布局
    方式: 见4

28、论述伪元素的使用方式?

    :after::after等通过设置content和diplay来向选中标签中插入元素

29、meta标签的使用?

    meta表示元信息、不会被显示,主要用于向浏览器提供作者信息、网页信息、修改时间等
    可以设置viewport的scale等以及charset字符集、可以优化SEO

30、什么是media query?

    media query用于做响应式布局、偶尔做兼容
    可以通过link外链样式表、也可以用在内部样式表中
    常见的有@media screen and (max-width: xxx(px))

31、box-sizing?

    x偏移量 | y偏移量 | 阴影模糊半径 | 阴影扩散半径 | 阴影颜色 | 内外阴影
    box-shadow: 2px 2px 2px 1px rgba(0, 0, 0, 0.2) inset;

32、flex布局?

flex- direction: 设置flex布局的主轴方向(默认为row)
flex-wrap: 确定flex布局的换行方式(默认为nowrap) (!!!换行的方式由主轴确定)
           设置wrap-reverse时,换行的方向会变为向上换行
flex-flow: flex-direction , flex-wrap
jusitify-content: 设置主轴排列方式, flex-start flex-end等
                  其中space-between表示两边紧贴,并且两边内的项目之间的距离相等
                  space-around表示所有项目之间的距离相等(包括第一个和最后一个项目)
                  所以第一个项目与左边框的距离+最后一个项目与右边框的距离=项目之间的距离
                  所以两边与边框的距离为中间项目之间的距离的一半
align-items: 设置副轴上的位置关系,默认为strech(表示会被拉升到父元素的尺寸)
align-content: 由于副轴上可能只有一个数据,也可能数据换行使副轴上有一个以上的数据
               该属性就是确定副轴上有多条交叉线时这些排列方式.
               默认为strech,这些轴线之间的距离等分排列
               所有它比align-items多space-around和space-between(align-items指定的是副轴上只有一条数据,所以不存在这两种排列方式)
order: 对flex-item指定,order大的会排在前面
flex-grow: 如果主轴上有多余的尺寸,确定每个item的等分尺寸(默认为0)
          等分方式为 (a+b+c)*a*剩余尺寸 = a在该行上的尺寸
flex-shrink: 当主轴上的尺寸容纳不下所有item的尺寸时,需要对item进行压缩(默认为1)
            仅当flex-wrap为nowrap时有效
flex-basis: 设置item,在flex布局代替width使用,默认为auto,flex-basis优先级是高于width的
           当同时设置flex-basis和width时,flex-basis会定义item的大小
flex: flex-grow, flex-shrink, flex-basis 默认为(0, 1, auto)

编程题:

33、画三角形?

image.png

34、css保持一个div长度比的1:1

image.png

35、写一个左中右布局、左右宽度200,中间自适应?

圣杯布局 image.png 双飞翼布局 image.png

h5+css3

36、H5的新特性?

1、新增标签: header(头部)、nav(导航栏)、section(主体内容)、aside(侧边栏)、article(文章)、footer(尾部)、
2figure(图片内容)、figcaption(图片标题)、mark(高亮内容)、progress(过程条)、
3、input新增的表单元素: number、date、month、range等..
4、video以及radio
5、新增属性: autocomplete、required、min-length、max-length、placeholder、draggable、step、hidden等
6、drag and drop API、Canvas API(位图画布)、navigator API、localStorage、sessionStorage、webworker、websocket、history API、location API、fileReader API、webSQL(浏览器端的结构化数据库,noSQL键值对保存)

37、css3的新特性?

border-radius(边框圆角)、box-shadow(盒阴影)、text-shadow(文本阴影)、gradient(线性渐变)、
媒体查询、border-image、transform、transition、animation
新增伪类: :nth-of-type:nth-first-type:checked(checkbox被选中是的样式)、
          :disabled:enabled
queryselect和queryselectAll API

38、 谈谈gradient?

通过设置background的-linear-gradient来设置颜色渐变(-webkit-gradient等是低版本的浏览器在做渐变时产生的,如果要兼容旧版本的浏览器就需要加上)
linear-gradient(方向(deg | left等)可选(默认是to bottom),(百分比) color,(百分比) color,(百分比) color),百分比表示在该方向上百分比时的bg-color
还有radial-gradient()等...  再问下去就摔门出去吧.😁

39、 谈谈boreder-radius?

border-radius是用来设置弧形角的、元素会找到四个角上距离四个角的斜45度并且以radius为两条底边的斜边(√2*radius)作为半价画弧、然后去掉多余的部分

40、cookie、localStorage、sessionStorage的区别?

cookie兼容性较好、但是大小只有4k、通常用于后端记录用户浏览状态,解决http协议的无状态缺陷(HTML篇不深入讲)
localStorage、sessionStorage通过setItem、removeItem、getItem、clear等获取
local...和session...区别在于localStorage会一直存在、sessionStorage在页面关闭时才会被清除
并且都具有同源限制(同源指的是同一端口、同一域名)

41、对语义话的理解?

语义话指的是使用更清晰的标签来表单当前html内容在全局的角色,对维护者更友好、同时对于SEO优化更有帮助

42、谈谈webWorker?

1、webWorker是一种浏览器后台技术、主要通过new Worker(url)来创建worker、通过onMessage和postMessage来发送和接受消息
2、由于浏览器是单线程的(blink和v8都在渲染进程的主线程上)、通过事件循环驱动,所以在执行脚本语句时会阻塞、这时就可以把耗时的任务交给worker去执行.
3、worker具有的特性: 不可以操作dom元素和window、全局对象不是主线程的window、可以使用setTimeout等、可以加载脚本(importScript)、可以使用XMLHttpRequest.

43、谈谈transition、transform、animation的区别?

1transform用于做平移、缩放、旋转、倾斜等效果
2transition用于做简单的动画过渡效果、无法对动画效果和关键帧等进行控制
3animation可以用于做复杂的动画效果、可以设置动画的关键帧,产生暂停、变速等效果
4transition能通过js或者hover等方式被动触发,animation可以主动触发

44、谈谈webSocket?

1、webSocket是一种支持双向通信的建立在TCP层之上的协议
2、webSocket兼容了http协议、通过upgrade实现了协议升级、默认使用80端口或者443端口
3、基于数据帧传输(http、tcp是基于数据流传输)、每一帧承载字符或者二进制数据
4、websocket是基于心跳机制保持长连接的(http长连接是基于简单的超时)(数据帧的9和A表示心跳ping和pong)
5、数据帧上有持续帧(保持前一帧:0)、非控制帧(文本:1,二进制:2,保留帧:3~7)、控制帧(8:关闭帧,9:ping,A:pong、B~F为控制帧保留)
6、如何证明握手被服务器所接受?
    在升级协议时,发送sec-websocket-key发送key、sec-websocket-accept进行hash加密(SHA1和BASE64)
    并把accept返回client证明连接成功
7、一条消息会被拆分成一个或者多个数据帧、代理服务器可以合并或者拆分消息
8、针对代理服务器的缓存污染攻击?
    恶意网页和恶意服务器建立websocket连接、然后伪造get请求(代理服务器误认为是两个http请求,但复用同一连接)
    get请求是针对被攻击服务器的、被缓存在代理服务器
    当正常页面在访问时、代理服务器直接返回恶意网页请求缓存的数据
    解决方法: client端发送一个frame-masking-key进行异或操作,让代理服务器不识别、从而无法缓存
9、梳理全过程:
    1、保持websocket处于open状态
    2、拆分消息为数据帧发送给server端
    3、client端发送必须基于掩码编码(防止缓存污染攻击)
    4、一旦发送或者接受关闭帧、连接处于CLOSING状态
        (接收到关闭帧: 不能接收任何消息,发送关闭帧: 不能发送任何消息)
        或者TCP连接意外断开
    5、当两端都接收到关闭帧、连接处于CLOSED状态
    6、TCP连接关闭后、websocket会被完全关闭