❤️html+css基础面试题(持续更新中~~~)(代码片段)

咖啡壶子 咖啡壶子     2023-01-04     233

关键词:

HTML+CSS面试题

01-对HTML语义化标签的理解

什么是语义化?
就是用合理、正确的标签来展示内容,比如h1~h6定义标题。
语义化优点:
易于用户阅读,样式丢失的时候能让页面呈现清晰的结构。
有利于SEO,搜索引擎根据标签来确定上下文和各个关键字的权重。
方便其他设备解析,如盲人阅读器根据语义渲染网页
有利于开发和维护,语义化更具可读性,代码更好维护,与CSS3关系更和谐。

02-HTML5新增的元素

语义化标签

  1. <header>:头部标签
  2. <nav>:导航标签
  3. <article>:内容标签
  4. <section>:块级标签
  5. <aside>:侧边栏标签
  6. <footer>:尾部标签
  7. 音频:<audio>
  8. 视频:<video>
  9. 新增input表单

03-css的选择器有哪些,优先级

选择器类型:

  1. ID  #id
  2. class  .class
  3. 标签  p
  4. 通用  *
  5. 属性  [type=“text”]
  6. 伪类 :hover
  7. 伪元素 ::first-line
  8. 子选择器、相邻选择器

权重计算规则:

  1. 第一等:代表内联样式,如: style=””,权值为1000。

  2. 第二等:代表ID选择器,如:#content,权值为0100。

  3. 第三等:代表类,伪类和属性选择器,如.content,权值为0010。

  4. 第四等:代表类型选择器和伪元素选择器,如div p,权值为0001。

  5. 通配符、子选择器、相邻选择器等的。如*、>、+,权值为0000。

  6. 继承的样式没有权值。

04-::before 和:after 中双冒号和单冒号有什么区别?解释一下这 2 个伪元素的作用

在css3中使用单冒号来表示伪类,用双冒号来表示伪元素。但是为了兼容已有的伪元素的写法,在一些浏览器中也可以使用单冒号
来表示伪元素。

伪类一般匹配的是元素的一些特殊状态,如hover、link等,而伪元素一般匹配的特殊的位置,比如after、before等。

05-CSS 中哪些属性可以继承?

  1. 字体系列属性
    font、font-family、font-weight、font-size、font-style、font-variant、font-stretch、font-size-adjust
  2. 文本系列属性
    text-indent、text-align、text-shadow、line-height、word-spacing、letter-spacing、 text-transform、direction、color
  3. 表格布局属性 caption-side border-collapse empty-cells
  4. 列表属性 list-style-type、list-style-image、list-style-position、list-style
  5. 光标属性 cursor

06-CSS 优先级算法如何计算?

  • ID选择器的特殊性值,加0,1,0,0。
  • 类选择器、属性选择器或伪类,加0,0,1,0。
  • 元素和伪元素,加0,0,0,1。
  • 通配选择器*对特殊性没有贡献,即0,0,0,0。
  • 最后比较特殊的一个标志!important(权重),它没有特殊性值,但它的优先级是最高的,为了方便记忆,可以认为它的特殊性值为1,0,0,0,0。

07-介绍一下标准盒子模型?低版本的IE盒子模型有什么不同?

  • 盒子模型是由四部分组成的,分别是margin,padding,boder,content。
  • IE盒子模型和标准盒子模型的区别在于设置width和height时所对应的范围不同,标准盒子模型的width和height属性的范围只包含了content,而IE盒子模型的width和height属性的范围包含content,boder,padding.
  • 一般来说,我们可通过box-sizing属性来改变元素的和模型。

08-position属性有哪些?说一下每个属性的区别

  • static :默认值,无特殊定位,对象遵循正常文档流。top,right,bottom,left等属性不会被应用,默认值。
  • relative:相对定位,对象遵循正常文档流,相对于自身原本位置进行偏移
  • absolute:绝对定位,相对于最近一个有定位的父元素偏移(若其父元素没有定位则逐层上找,直到document——页面文档对象)
  • fixed:固定定位,相对于浏览器窗口进行定位
  • sticky 粘性定位,该定位基于用户滚动的位置。
  • inherit规定从父元素继承position属性的值。

09-display 有哪些值?说明他们的作用。

  • block 块类型。默认宽度为父元素宽度,可设置宽高,换行显示。
  • none 元素不显示,并从文档流中移除。
  • inline 行内元素类型。默认宽度为内容宽度,不可设置宽高,同行显示。
  • inline-block 默认宽度为内容宽度,可以设置宽高,同行显示。
  • list-item 像块类型元素一样显示,并添加样式列表标记。
  • table 此元素会作为块级表格来显示。
  • inherit 规定应该从父元素继承display属性的值。

10-请解释一下 CSS3 的 Flex box(弹性盒布局模型),以及适用场景?

  1. flex布局是CSS3新增的一种布局方式,我们可以通过将一个元素的display属性值设置为flex从而使它成为一个flex
    容器,它的所有子元素都会成为它的项目。

  2. 一个容器默认有两条轴,一个是水平的主轴,一个是与主轴垂直的交叉轴。我们可以使用flex-direction来指定主轴的方向。

  3. 我们可以使用justify-content来指定元素在主轴上的排列方式,使用align-items来指定元素在交叉轴上的排列方式。还可以使用flex-wrap来规定当一行排列不下时的换行方式。

  4. 对于容器中的项目,我们可以使用order属性来指定项目的排列顺序,还可以使用flex-grow来指定当排列空间有剩余的时候,
    项目的放大比例。还可以使用flex-shrink来指定当排列空间不足时,项目的缩小比例。

以下6个属性设置在容器上。

  1. flex-direction属性决定主轴的方向(即项目的排列方向)。
  2. flex-wrap属性定义,如果一条轴线排不下,如何换行。
  3. flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap。
  4. justify-content属性定义了项目在主轴上的对齐方式。
  5. align-items属性定义项目在交叉轴上如何对齐。
  6. align-content属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。

以下6个属性设置在项目上。

  1. order属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。
  2. flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。
  3. flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。
  4. flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间。浏览器根据这个属性,计算主轴是否有多余空间。它的默认 值为auto,即项目的本来大小。
  5. flex属性是flex-grow,flex-shrink和flex-basis的简写,默认值为0 1 auto。
  6. align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。

11-如何画一个三角形

 <style>
        div 
            width: 0;
            height: 0;
            border: 50px solid transparent;
            border-top-color: red;
        
 </style>
 <body>
    <div></div>
</body>

12-li 与 li 之间有看不见的空白间隔是什么原因引起的?有什么解决办法?

浏览器会把inline元素间的空白字符(空格、换行、Tab等)渲染成一个空格。而为了美观。我们通常是一个<li>放在一行,
这导致<li>换行后产生换行字符,它变成一个空格,占用了一个字符的宽度。

解决办法:

(1)为<li>设置float:left。不足:有些容器是不能设置浮动,如左右切换的焦点图等。

(2)将所有<li>写在同一行。不足:代码不美观。

(3)将<ul>内的字符尺寸直接设为0,即font-size:0。不足:

  • 中的其他字符尺寸也被设为0,需要额外重新设定其他
    字符尺寸,且在Safari浏览器依然会出现空白间隔。

(4)消除

  • 的字符间隔letter-spacing:-8px,不足:这也设置了<li>内的字符间隔,因此需要将<li>内的字符
    间隔设为默认letter-spacing:normal。

13-为什么要初始化CSS样式。

因为浏览器的兼容的问题,不同浏览器有些标签的默认值是不同的,如果没有CSS初始化往往会出现浏览器之间的页面显示差异。

14-display:none和visibility:hidden的区别?

dispaly:none 设置该属性后,该元素下的元素都会隐藏,占据的空间消失

visibility:hidden 设置该元素后,元素虽然不可见了,但是依然占据空间的位置

区别

  1. visibility 具有继承性,其子元素也会继承此属性,若设置 visibility:visible,则子元素会显示
  2. visibility 不会影响计数器的计算,虽然隐藏掉了,但是计数器依然继续运行着。
  3. 在 CSS3 的 transition 中支持 visibility 属性,但是不支持 display,因为 transition
    可以延迟执行,因此配合 visibility 使用纯 CSS 实现 hover 延时显示效果可以提高用户体验
  4. display:none 会引起回流(重排)和重绘 visibility:hidden 会引起重绘

15-margin 重叠问题的理解。

块级元素的上外边距(margin-top)与下外边距(margin-bottom)有时会合并为单个外边距,这样的现象称为“margin合并”。

产生折叠的必备条件:margin必须是邻接的!

而根据w3c规范,两个margin是邻接的必须满足以下条件:

  1. 必须是处于常规文档流(非float和绝对定位)的块级盒子,并且处于同一个BFC当中。
  2. 没有线盒,没有空隙,没有padding和border将他们分隔开
  3. 都属于垂直方向上相邻的外边距,可以是下面任意一种情况
    ① 元素的margin-top与其第一个常规文档流的子元素的margin-top
    ②元素的margin-bottom与其下一个常规文档流的兄弟元素的margin-top
    ③ height为auto的元素的margin-bottom与其最后一个常规文档流的子元素的margin-bottom
    ④高度为0并且最小高度也为0,不包含常规文档流的子元素,并且自身没有建立新的BFC的元素的margin-top和margin-bottom

margin合并的3种场景:

(1)相邻兄弟元素margin合并。

解决办法:设置块状格式化上下文元素(BFC)

(2)父级和第一个/最后一个子元素的margin合并。

解决办法:

对于margin-top合并,可以进行如下操作(满足一个条件即可):

  • 父元素设置为块状格式化上下文元素;
  • 父元素设置border-top值;
  • 父元素设置padding-top值;
  • 父元素和第一个子元素之间添加内联元素进行分隔。

对于margin-bottom合并,可以进行如下操作(满足一个条件即可):

  • 父元素设置为块状格式化上下文元素;
  • 父元素设置border-bottom值;
  • 父元素设置padding-bottom值;
  • 父元素和最后一个子元素之间添加内联元素进行分隔;
  • 父元素设置height、min-height或max-height。

(3)空块级元素的margin合并。

解决办法:

  • 设置垂直方向的border;
  • 设置垂直方向的padding;
  • 里面添加内联元素(直接Space键空格是没用的);
  • 设置height或者min-height。

16-说一下什么是BFC

BFC 全称:Block Formatting Context, 名为 “块级格式化上下文”。

简单来说就是,BFC是一个完全独立的空间(布局环境),让空间里的子元素不会影响到外面的布局。那么怎么使用BFC呢,BFC可以看做是一个CSS元素属性
怎样触发BFC
这里简单列举几个触发BFC使用的CSS属性

  • overflow: hidden
  • display: inline-block
  • position: absolute
  • position: fixed
  • display: table-cell
  • display: flex

BFC的规则
BFC就是一个块级元素,块级元素会在垂直方向一个接一个的排列
BFC就是页面中的一个隔离的独立容器,容器里的标签不会影响到外部标签
垂直方向的距离由margin决定, 属于同一个BFC的两个相邻的标签外边距会发生重叠
计算BFC的高度时,浮动元素也参与计算

17-清除浮动的方法

  1. 额外标签法也称为隔墙法,是 W3C 推荐的做法。
    就是在最后一个浮动的子元素后面添加一个额外标签, 添加 清除浮动样式。例如 <div style=”clear:both”></div>,或者其他标签(如<br />等)注意: 要求这个新的空标签必须是块级元素。
  2. 父级添加 overflow 属性
    将其属性值设置为 hidden、 auto 或 scroll 。
  3. 父级添加after伪元素
    .clearfix:after
    content: “”;
    display: block;
    height: 0;
    clear: both;
    visibility: hidden;

    .clearfix /* IE6、7 专有 */
    *zoom: 1;
  4. 父级添加双伪元素
    .clearfix:before,.clearfix:after
    content:"";
    display:table;

    .clearfix:after
    clear:both;
    .clearfix
    *zoom:1;

18-margin 和 padding 分别适合什么场景使用?

margin是用来隔开元素与元素的间距;padding是用来隔开元素与内容的间隔。
margin用于布局分开元素使元素与元素互不相干。
padding用于元素与内容之间的间隔,让内容(文字)与(包裹)元素之间有一段距离。

何时应当使用margin:

  • 需要在border外侧添加空白时。
  • 空白处不需要背景(色)时。
  • 上下相连的两个盒子之间的空白,需要相互抵消时。如15px+20px的margin,将得到20px的空白。

何时应当时用padding:

  • 需要在border内测添加空白时。
  • 空白处需要背景(色)时。
  • 上下相连的两个盒子之间的空白,希望等于两者之和时。如15px+20px的padding,将得到35px的空白。

19-为什么不建议使用统配符初始化 css 样式。

  1. 采用*padding:0;margin:0;这样的写法好处是写起来很简单,但是是通配符,需要把所有的标签都遍历一遍,当网站较大时,样式比较多,这样写就大大的加强了网站运行的负载,会使网站加载的时候需要很长一段时间,因此一般大型的网站都有分层次的一套初始化样式。
  2. 出于性能的考虑,并不是所有标签都会有padding和margin,因此对常见的具有默认padding和margin的元素初始化即可,并不需使用通配符*来初始化。

20-什么是响应式设计?响应式设计的基本原理是什么?

响应式网站设计是一个网站能够兼容多个终端,而不是为每一个终端做一个特定的版本。基本原理是通过媒体查询检测不同的设备屏
幕尺寸做处理。页面头部必须有meta声明的viewport。

21-怎么让 Chrome 支持小于 12px 的文字?

在谷歌下css设置字体大小为12px及以下时,显示都是一样大小,都是默认12px。

解决办法:

  1. 可以使用Webkit的内核的-webkit-text-size-adjust的私有CSS属性来解决,只要加了-webkit-text-size-adjust:none;字体大小就不受限制了。但是chrome更新到27版本之后就不可以用了。所以高版本chrome谷歌浏览器 已经不再支持-webkit-text-size-adjust样式,所以要使用时候慎用。
  2. 还可以使用css3的transform缩放属性-webkit-transform:scale(0.5);注意-webkit-transform:scale(0.75);收缩的是整个元素的大小,这时候,如果是内联元素,必须要将内联元素转换成块元素,可以使用display:block/inline-block/…;
  3. 使用图片:如果是内容固定不变情况下,使用将小于12px文字内容切出做图片,这样不影响兼容也不影响美观。

22-png、jpg、gif,webp 这些图片格式解释一下,分别什么时候用?

  1. 第一种是BMP格式,它是无损压缩的,支持索引色和直接色的点阵图。由于它基本上没有进行压缩,因此它的文件体积一般比 较大。
  2. 第二种是GIF格式,它是无损压缩的使用索引色的点阵图。由于使用了LZW压缩方法,因此文件的体积很小。并且GIF还支持动画和透明度。但因为它使用的是索引色,所以它适用于一些对颜色要求不高且需要文件体积小的场景。
  3. 第三种是JPEG格式,它是有损压缩的使用直接色的点阵图。由于使用了直接色,色彩较为丰富,一般适用于来存储照片。但由于使用的是直接色,可能文件的体积相对于GIF格式来说更大。
  4. 第四种是PNG-8格式,它是无损压缩的使用索引色的点阵图。它是GIF的一种很好的替代格式,它也支持透明度的调整,并且文件的体积相对于GIF格式更小。一般来说如果不是需要动画的情况,我们都可以使用PNG-8格式代替GIF格式。
  5. 第五种是PNG-24格式,它是无损压缩的使用直接色的点阵图。PNG-24的优点是它使用了压缩算法,所以它的体积比BMP格式的文件要小得多,但是相对于其他的几种格式,还是要大一些。
  6. 第六种格式是svg格式,它是矢量图,它记录的图片的绘制方式,因此对矢量图进行放大和缩小不会产生锯齿和失真。它一般适合于用来制作一些网站logo或者图标之类的图片。
  7. 第七种格式是webp格式,它是支持有损和无损两种压缩方式的使用直接色的点阵图。使用webp格式的最大的优点是,在相同质量的文件下,它拥有更小的文件体积。因此它非常适合于网络图片的传输,因为图片体积的减少,意味着请求时间的减小,这样会提高用户的体验。这是谷歌开发的一种新的图片格式,目前在兼容性上还不是太好。

23-如何实现一条0.5px的border

  • 使用transform:scale(0.5,0.5)的方式
  • 采用meta viewport的方式
  • 采用border-image的方式

24-什么是基线和 x-height?

字母x的下边缘(线)就是我们的基线。

x-height指的就是小写字母x的高度,术语描述就是基线和等分线(meanline)(也称作中线,midline)之间的距离。在C
SS世界中,middle指的是基线往上1/2x-height高度。我们可以近似理解为字母x交叉点那个位置。

ex是CSS中的一个相对单位,指的是小写字母x的高度,没错,就是指x-height。ex的价值就在其副业上不受字体和字号影
响的内联元素的垂直居中对齐效果。内联元素默认是基线对齐的,而基线就是x的底部,而1ex就是一个x的高度。

25-什么是层叠上下文?

层叠上下文,英文称作stacking context,是HTML中的一个三维的概念。如果一个元素含有层叠上下文,我们可以理解为这个元
素在z轴上就“高人一等”。

层叠上下文元素有如下特性:

(1)层叠上下文的层叠水平要比普通元素高(原因后面会说明)。
(2)层叠上下文可以阻断元素的混合模式。
(3)层叠上下文可以嵌套,内部层叠上下文及其所有子元素均受制于外部的“层叠上下文”。
(4)每个层叠上下文和兄弟元素独立,也就是说,当进行层叠变化或渲染的时候,只需要考虑后代元素。
(5)每个层叠上下文是自成体系的,当元素发生层叠的时候,整个元素被认为是在父层叠上下文的层叠顺序中。

层叠上下文的创建:

(1)页面根元素天生具有层叠上下文,称为根层叠上下文。根层叠上下文指的是页面根元素,可以看成是元素。因此,页面中所有的元素一定处于至少一个“层叠结界”中。

(2)对于position值为relative/absolute以及Firefox/IE浏览器(不包括Chrome浏览器)下含有position:fixed声明的定位元素,当其z-index值不是auto的时候,会创建层叠上下文。Chrome等WebKit内核浏览器下,position:fixed元素天然层叠上下文元素,无须z-index为数值。根据我的测试,目前IE和Firefox仍是老套路。

(3)其他一些CSS3属性,比如元素的opacity值不是1。

26-说一下多行文本省略号是怎么实现的

单行文本溢出显示省略号

  1. 先强制一行内显示文本 white-space: nowrap; ( 默认 normal 自动换行)
  2. 超出的部分隐藏 overflow: hidden;
  3. 文字用省略号替代超出的部分 text-overflow: ellipsis;

多行文本溢出显示省略号
overflow: hidden;
/文字用省略号替代超出的部分/
text-overflow:ellipsis;
/* 弹性伸缩盒子模型显示 /
display: -webkit-box; /

限制在一个块元素显示的文本的行数
-webkit-line-clamp: 2;
/* 设置或检索伸缩盒对象的子元素的排列方式 */
-webkit-box-orient: vertical;

27-常见的元素隐藏方式?

(1)使用 display:none;隐藏元素,渲染树不会包含该渲染对象,因此该元素不会在页面中占据位置,也不会响应绑定的监听事件。

(2)使用 visibility:hidden;隐藏元素。元素在页面中仍占据空间,但是不会响应绑定的监听事件。

(3)使用 opacity:0;将元素的透明度设置为 0,以此来实现元素的隐藏。元素在页面中仍然占据空间,并且能够响应元素绑定的监听事件。

(4)通过使用绝对定位将元素移除可视区域内,以此来实现元素的隐藏。

(5)通过 z-index 负值,来使其他元素遮盖住该元素,以此来实现隐藏。

(6)通过 clip/clip-path 元素裁剪的方法来实现元素的隐藏,这种方法下,元素仍在页面中占据位置,但是不会响应绑定的监听事件。

(7)通过 transform:scale(0,0)来将元素缩放为 0,以此来实现元素的隐藏。这种方法下,元素仍在页面中占据位置,但是不会响应绑定的监听事件。

(8)设置height、width模型属性为0

将元素的margin,border,padding,height和width等影响元素盒模型的属性设置成0,如果元素内有子元素或内容,还应该设置其

overflow:hidden来隐藏其子元素

(9)position:absolute  将元素移出可视区域

特点:元素不可见,不影响页面布局

28-css 两栏布局的实现?

/*两栏布局一般指的是页面中一共两栏,左边固定,右边自适应的布局,一共有四种实现的方式。*/
/*以左边宽度固定为200px为例*/

/*(1)利用浮动,将左边元素宽度设置为200px,并且设置向左浮动。将右边元素的margin-left设置为200px,宽度设置为auto(默认为auto,撑满整个父元素)。*/
.outer 
  height: 100px;


.left 
  float: left;

  height: 100px;
  width: 200px;

  background: tomato;


.right 
  margin-left: 200px;

  width: auto;
  height: 100px;

  background: gold;


/*(2)第二种是利用flex布局,将左边元素的放大和缩小比例设置为0,基础大小设置为200px。将右边的元素的放大比例设置为1,缩小比例设置为1,基础大小设置为auto。*/
.outer 
  display: flex;

  height: 100px;


.left 
  flex-shrink: 0;
  flex-grow: 0;
  flex-basis: 200px;

  background: tomato;


.right 
  flex: auto;
  /*11auto*/

  background: gold;


/*(3)第三种是利用绝对定位布局的方式,将父级元素设置相对定位。左边元素设置为absolute定位,并且宽度设置为
200px。将右边元素的margin-left的值设置为200px。*/
.outer 
  position: relative;

  height: 100px;


.left 
  position: absolute;

  width: 200px;
  height: 100px;

  background: tomato;


.right 
  margin-left: 200px;
  height: 100px;

  background: gold;


/*(4)第四种还是利用绝对定位的方式,将父级元素设置为相对定位。左边元素宽度设置为200px,右边元素设置为绝对定位,左边定位为200px,其余方向定位为0。*/
.outer 
  position: relative;

  height: 100px;


.left 
  width: 200px;
  height: 100px;

  background: tomato;


.right 
  position: absolute;

  top: 0;
  right: 0;
  bottom: 0;
  left: 200px;

  background: gold;

29-一个自适应矩形,水平垂直居中,且宽高比为 2:1

/*实现原理参考自适应正方形和水平居中方式*/
.box 
  position: absolute;
  top: 0;
  right: 0;
  left: 0;
  bottom: 0;
  margin: auto;

  width: 10%;
  height: 0;
  padding-top: 20%;
  background: tomato;

30-实现一个宽高自适应的正方形

/*1.第一种方式是利用vw来实现*/
.square 
  width: 10%;
  height: 10vw;
  background: tomato;


/*2.第二种方式是利用元素的margin/padding百分比是相对父元素width的性质来实现*/
.square 
  width: 20%;
  height: 0;
  padding-top: 20%;
  background: orange;


/*3.第三种方式是利用子元素的margin-top的值来实现的*/
.square 
  width: 30%;
  overflow: hidden;
  background: yellow;


.square::after 
  content: '';
  display: block;
  margin-top: 100%;

31-css父级元素margin-top:20px;子元素margin-top:10px;最后显示结果margin值是多少?最好代码演示一下

对于两个嵌套关系(父子关系)的块元素,父元素有上外边距同时子元素也有上外边距,此时父元素会塌陷较大的外边距值
解决办法:
    1为父元素设置内边距padding。来代替给子元素设置margin-top 
    2为父元素设置边框border。 
    3为父元素设置 overflow: hidden 。

32-有一个width:300px,height:300px的盒子,怎么水平垂直都居中

1 子元素相对于父元素绝对定位,子元素top,left设置50%,子元素margin-top和margin-left减去各自宽高的一半。

2 子元素相对于父元素绝对定位,子元素上下左右全为0,然后设置子元素margin:auto。

3 子元素相对于父元素绝对定位,子元素top,left值为50%,transform:translate(-50%,-50%)。

4 父元素设置弹性盒子
display:flex;
justfy-content:center ;
align-item:center;

33-两个嵌套的div,position属性都是absolute,子div设置top属性,那么这个是相对于父元素的哪个位置定位的

margin的外边缘

34-href和src区别? title和alt

href用于建立当前页面与引用资源之间的关系(链接),遇到href,页面会并行加载后续内容;

src则会替换当前标签。遇到src,浏览器需要加载完毕src的内容才会继续往下走。

title :显示文本属性,鼠标移上去时显示文字。

alt:是替换文本属性,当图片没有加载时显示文字:

35-rem 和 em的区别

rem 是 CSS3 新增的一个相对单位(root em,根 em),使用 rem 为元素设定字

体大小时,仍然是相对大小,但相对的只是 HTML 根元素

em 是相对长度单位,相对于当前对象内文本的字体尺寸。如当前对行内文本的字

体尺寸未被人为设置,则相对于浏览器的默认字体尺寸。它会继承父级元素的字体大

小,因此并不是一个固定的值

36-从浏览器地址栏输入url到显示页面的步骤

基础版本

  • 浏览器根据请求的URL交给DNS域名解析,找到真实IP,向服务器发起请求;
  • 服务器交给后台处理完成后返回数据,浏览器接收文件(HTML、JS、CSS、图象等);
  • 浏览器对加载到的资源(HTML、JS、CSS等)进行语法解析,建立相应的内部数据结构(如HTMLDOM);
  • 载入解析到的资源文件,渲染页面,完成。

详细版

  1. 在浏览器地址栏输入URL
  2. 浏览器查看缓存如果请求资源在缓存中并且新鲜,跳转到转码步骤
    1. 如果资源未缓存,发起新请求
    2. 如果已缓存,检验是否足够新鲜,足够新鲜直接提供给客户端,否则与服务器进行验证。
    3. 检验新鲜通常有两个HTTP头进行控制ExpiresCache-Control
      • HTTP1.0提供Expires,值为一个绝对时间表示缓存新鲜日期
      • HTTP1.1增加了Cache-Control: max-age=,值为以秒为单位的最大新鲜时间
  3. 浏览器解析URL获取协议,主机,端口,path
  4. 浏览器组装一个HTTP(GET)请求报文
  5. 浏览器获取主机ip地址,过程如下:
    1. 浏览器缓存
    2. 本机缓存
    3. hosts文件
    4. 路由器缓存
    5. ISP DNS缓存
    6. DNS递归查询(可能存在负载均衡导致每次IP不一样)
  6. 打开一个socket与目标IP地址,端口建立TCP链接,三次握手下:
    1. 客户端发送一个TCP的SYN=1,Seq=X的包到服务器端口
    2. 服务器发回SYN=1, ACK=X+1, Seq=Y的响应包
    3. 客户端发送ACK=Y+1, Seq=Z
  7. TCP链接建立后发送HTTP请求
  8. 服务器接受请求并解析,将请求转发到服务程序,如虚拟主机使用HTTP Host头部判断请求的服务程序
  9. 服务器检查HTTP请求头是否包含缓存验证信息如果验证缓存新鲜,返回304等对应状态码
  10. 处理程序读取完整请求并准备HTTP响应,可能需要查询数据库等操作
  11. 服务器将响应报文通过TCP连接发送回浏览器
  12. 浏览器接收HTTP响应,然后根据情况选择关闭TCP连接或者保留重用,关闭TCP连接的四次握手如下
    1. 主动方发送Fin=1, Ack=Z, Seq= X报文
    2. 被动方发送ACK=X+1, Seq=Z报文
    3. 被动方发送Fin=1, ACK=X, Seq=Y报文
    4. 主动方发送ACK=Y, Seq=X报文
  13. 浏览器检查响应状态吗:是否为1XX,3XX, 4XX, 5XX,这些情况处理与2XX不同
  14. 如果资源可缓存,进行缓存
  15. 对响应进行解码(例如gzip压缩)
  16. 根据资源类型决定如何处理(假设资源为HTML文档)
  17. 解析HTML文档,构件DOM树,下载资源,构造CSSOM树,执行js脚本,这些操作没有严格的先后顺序,以下分别解释
  18. 构建DOM树
    1. Tokenizing:根据HTML规范将字符流解析为标记
    2. Lexing:词法分析将标记转换为对象并定义属性和规则
    3. DOM construction:根据HTML标记关系将对象组成DOM树
  19. 解析过程中遇到图片、样式表、js文件,启动下载
  20. 构建CSSOM树
    1. Tokenizing:字符流转换为标记流
    2. Node:根据标记创建节点
    3. CSSOM:节点创建CSSOM树
  21. 根据DOM树和CSSOM树构建渲染树
    1. 从DOM树的根节点遍历所有可见节点,不可见节点包括:1)script,meta这样本身不可见的标签。2)被css隐藏的节点,如display: none
    2. 对每一个可见节点,找到恰当的CSSOM规则并应用
    3. 发布可视节点的内容和计算样式
  22. js解析如下
    1. 浏览器创建Document对象并解析HTML,将解析到的元素和文本节点添加到文档中,此时document.readystate为loading
    2. HTML解析器遇到没有async和defer的script时,将他们添加到文档中,然后执行行内或外部脚本。这些脚本会同步执行,并且在脚本下载和执行时解析器会暂停。这样就可以用document.write()把文本插入到输入流中。同步脚本经常简单定义函数和注册事件处理程序,他们可以遍历和操作script和他们之前的文档内容
    3. 当解析器遇到设置了async属性的script时,开始下载脚本并继续解析文档。脚本会在它下载完成后尽快执行,但是解析器不会停下来等它下载。异步脚本禁止使用document.write(),它们可以访问自己script和之前的文档元素
    4. 当文档完成解析,document.readState变成interactive
    5. 所有defer脚本会按照在文档出现的顺序执行,延迟脚本能访问完整文档树,禁止使用document.write()
    6. 浏览器在Document对象上触发DOMContentLoaded事件
    7. 此时文档完全解析完成,浏览器可能还在等待如图片等内容加载,等这些内容完成载入并且所有异步脚本完成载入和执行,document.readState变为complete,window触发load事件
  23. 显示页面(HTML解析过程中会逐步显示页面)

详细简版

  1. 从浏览器接收url到开启网络请求线程(这一部分可以展开浏览器的机制以及进程与线程之间的关系)
  2. 开启网络线程到发出一个完整的HTTP请求(这一部分涉及到dns查询,TCP/IP请求,五层因特网协议栈等知识)
  3. 从服务器接收到请求到对应后台接收到请求(这一部分可能涉及到负载均衡,安全拦截以及后台内部的处理等等)
  4. 后台和前台的HTTP交互(这一部分包括HTTP头部、响应码、报文结构、cookie等知识,可以提下静态资源的cookie优化,以及编码解码,如gzip压缩等)
  5. 单独拎出来的缓存问题,HTTP的缓存(这部分包括http缓存头部,ETagcatch-control等)
  6. 浏览器接收到HTTP数据包后的解析流程(解析html-词法分析然后解析成dom树、解析css生成css规则树、合并成render树,然后layoutpainting渲染、复合图层的合成、GPU绘制、外链资源的处理、loadedDOMContentLoaded等)
  7. CSS的可视化格式模型(元素的渲染规则,如包含块,控制框,BFCIFC等概念)
  8. JS引擎解析过程(JS的解释阶段,预处理阶段,执行阶段生成执行上下文,VO,作用域链、回收机制等等)
  9. 其它(可以拓展不同的知识模块,如跨域,web安全,hybrid模式等等内容)

HTTP状态码及其含义

  • 1XX
    

    :信息状态码

    • 100 Continue 继续,一般在发送post请求时,已发送了http header之后服务端将返回此信息,表示确认,之后发送具体参数信息
  • 2XX
    

    :成功状态码

    • 200 OK 正常返回信息
    • 201 Created 请求成功并且服务器创建了新的资源
    • 202 Accepted 服务器已接受请求,但尚未处理
  • 3XX
    

    :重定向

    • 301 Moved Permanently 请求的网页已永久移动到新位置。
    • 302 Found 临时性重定向。
    • 303 See Other 临时性重定向,且总是使用 GET 请求新的 URI
    • 304 Not Modified 自从上次请求后,请求的网页未修改过。
  • 4XX
    

    :客户端错误

    • 400 Bad Request 服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求。
    • 401 Unauthorized 请求未授权。
    • 403 Forbidden 禁止访问。
    • 404 Not Found 找不到如何与 URI 相匹配的资源。
  • 5XX:
    

    服务器错误

    • 500 Internal Server Error 最常见的服务器端错误。
    • 503 Service Unavailable 服务器端暂时无法处理请求(可能是过载或维护)。

css面试题汇总(持续更新)(代码片段)

前言:这篇随笔是为了准备后面的面试而整理的,网上各种面试题太多了,但是我感觉很多太偏了,而且实际开发过程中并不会遇到,因此这里我整理一些比较常用的,或者是相对比较重要的知识点,每个知识点都会由浅入深,... 查看详情

java面试题⭐多线程篇⭐(万字总结,带答案,面试官问烂,跳槽必备,建议收藏)(代码片段)

...典列表(持续更新):序号内容链接地址1Java基础篇(点击跳转)java面试宝典-基础篇2Java集合框架篇(点击跳转)java面试宝典-集合框架篇3J 查看详情

java面试题⭐多线程篇⭐(万字总结,带答案,面试官问烂,跳槽必备,建议收藏)(代码片段)

...典列表(持续更新):序号内容链接地址1Java基础篇(点击跳转)java面试宝典-基础篇2Java集合框架篇(点击跳转)java面试宝典-集合框架篇3J 查看详情

干货!jvm基础面试题总结(持续更新)(代码片段)

...文章,这篇文章我花了几天时间给你汇总了一波JVM的基础知识和面试题,内容还不是很全,我还在连载中,这篇文章相当于是第一弹,废话不多说,走起!JVM的主要作用是什么?JVM就是Jav 查看详情

前端面试题汇总(持续更新...)

HTML:1.严格模式与混杂模式如何区分?如何触发这两种模式?2.html新特新,语义化的目的是什么?常用结构标签及其作用?谈谈对语义化的理解3.常用浏览器内核4.img的title和alt属性的区别5.src和href的区别6.<strong><em>和<b&... 查看详情

android面试题最全总结系列(持续更新中...)(代码片段)

...这个GitHub的repo想作为自己对于Android核心知识点以及一些面试题的总结,因为很多知识点理解的不够深刻,所以通过这个来强迫自己做总结,目前已经初具规模,我基本每天都会更新这个repo,后续还会持续更... 查看详情

2020年拼多多校招面试题及答案-最全最新-持续更新中

...菜和砍柴的程序员~@TOC最近有粉丝私信问有没有拼多多的面试真题,当然有啦,而且拼多多现在的福利待遇也是非常厉害啦,请看去年本科生的薪资:那好了,今天就更新一篇以后会持续更新,关注我就等于关注互利网公司面试... 查看详情

2020年腾讯实习生c++面试题&持续更新中

...家是否看过了,以后我计划每天都更新一些互联网公司的面试真题,后期搞一个合集。好了,接下来进入正题啦。腾讯2020年实习生面试题分享一面虚函数、C++内存模型、深拷贝(拷贝构造函数、拷贝赋值函数)C++98/11/14/17相关的... 查看详情

持续更新java面试题大全及解答

本篇是相对比较全的Java面试题汇总,包括Java基础、Java并发、JVM、MySQL、Redis、Spring、Dubbo、微服务、计算机网络、分布式等等,后期还会补充;绝大部分题目来自网络(文末放出链接,侵删),很多答... 查看详情

2020年腾讯c++面试题和答案持续更新中(11)

...不能落下咯~~更多学习资料,请到文末获取~2020年腾讯C++面试题第一面2020/3/20C++的malloc和new的区别虚函数的作用如何实现虚函数的Linux程序突然core掉,如何处理2020年腾讯C++面试题第二面2020/3/20vector实现原理链表和数组的区别C++内... 查看详情

北京某小公司面试题:spring基础

【对线面试官】系列一周两篇持续更新中!原创不易!!求三连!! 查看详情

操作系统面试题(史上最全持续更新)(代码片段)

...构师尼恩获取,发送“领取电子书”获取。操作系统基础篇在信息化时代,软件被称为计算机系统 查看详情

有空就来刷几道5g面试题系列|安全(最新更新11月17日,持续更新中)

...多大佬,计划开一系列的专题,分多个篇章将5G的基础知识通过“问答”的形式整理出来。欢迎各位技术大佬多多指点,丰 查看详情

2020年腾讯实习生c++面试题&持续更新中

...到面经后一定要做充分的准备,结合自己掌握的知识,把面试中的每一个问题都深入研究,找到面试官提问的重点,找面试管想要你回答的要点。并可以将自己整理的答案,整理处理,按照一定的逻辑分点作答。比如:Q:请你讲... 查看详情

前端面试题+持续更新中(代码片段)

一、谈一谈双向数据绑定就拿input输入框来举例子吧先将创造一个原始数据data,将他渲染到输入框再给输入框绑定input事件,如果输入框改变则改变data中的值再将新的data的值渲染到输入框里面在vue中可以用v-model相当于vue... 查看详情

2020年腾讯实习生c++面试题&持续更新中

...程的天天早早起床,早早给大家分享咯2020年腾讯C++实习面试真题一面:自我介绍自学过什么?写个算法题?单链表的相交?二叉树的公共父节点?说说拷贝构造函数?说说const?二面:有用过部门的产品吗?讲一讲团队项目?为... 查看详情

java线程池底层源码分享和相关面试题(持续更新)

线程池核心参数,常用线程池,拒绝策略,底层源码以及面试题1.线程池各个参数讲解publicThreadPoolExecutor(intcorePoolSize,//线程池核心工作线程数量,比如newFixedThreadPool中可以自定义的线程数量就是这个参数intmaximumPoolSize,//线程池所... 查看详情

每天一道面试题送你走进batm(持续更新......)

JAVA:泛型擦除Android:Android安全机制【Android】【面试题解析】handler.postdelayed方法中的延时,比如设置1000毫秒,程序会准确的在1000毫秒后执行吗? 查看详情