前端每日一问,全面提升技术认知<第一周汇总>

5,704 阅读9分钟

介绍一下我最近主导的开源项目————前端每日一问,针对前端的领域知识进行针对性的整理,包含HTML5、CSS3基础,JavaScript原理、设计模式、框架原理、工程化原理、浏览器原理以及经典算法进行系统整理,虽然是每日一问,时间碎片化,但内容完整而系统,源于面试,又高于面试。适合初级前端向上进阶,逐渐深入原理,理解框架背后的设计思想,旨在以碎片的时间积累前端核心知识,在逐渐复杂的前端世界里挥洒自如。

前面几周是关于HTML、CSS基础的内容,下面是第一周的整理。

也可以前往github地址,查看相应vuepress博客。

001: HTML5和HTML4究竟有哪些不同?

声明方面

  1. HTML5 文件类型声明(<!DOCTYPE>)变成下面的形式:
<!DOCTYPE html>

标准方面

  1. HTML5的文档解析不再基于SGML(Standard Generalized Markup Language)标准,而是形成了自己的一套标准。

标签方面

  1. 新增语义标签,其中包括
<header><footer><section><article><nav><hgroup><aside><figure>
  1. 废除一些网页美化方面的标签,使样式与结构分离更加彻底, 包括
<big><u><font><basefont><center><s><tt>
  1. 通过增加了<audio>、<video>两个标签来实现对多媒体中的音频、视频使用的支持。

属性方面

  1. 增加了一些表单属性, 主要是其中的input属性的增强
<!-- 此类型要求输入格式正确的email地址 -->
<input type=email >
<!-- 要求输入格式正确的URL地址  -->
<input type=url >
<!-- 要求输入格式数字,默认会有上下两个按钮 -->
<input type=number >
<!-- 时间系列,但目前只有 Opera和Chrome支持 -->
<input type=date >
<input type=time >
<input type=datetime >
<input type=datetime-local >
<input type=month >
<input type=week >
<!-- 默认占位文字 -->
<input type=text placeholder="your message" >
<!-- 默认聚焦属性 -->
<input type=text autofacus="true" >
  1. 其他标签新增了一些属性,
<!-- meta标签增加charset属性 -->
<meta charset="utf-8">
<!-- script标签增加async属性 -->
<script async></script>
  1. 使部分属性名默认具有boolean属性
<!-- 只写属性名默认为true -->
<input type="checkbox"  checked/>
<!-- 属性名="属性名"也为true -->
<input type="checkbox"  checked="checked"/>

存储方面

  1. 新增WebStorage, 包括localStorage和sessionStorage

  2. 引入了IndexedDB和Web SQL,允许在浏览器端创建数据库表并存储数据, 两者的区别在于IndexedDB更像是一个NoSQL数据库,而WebSQL更像是关系型数据库。W3C已经不再支持WebSQL。

  3. 引入了应用程序缓存器(application cache),可对web进行缓存,在没有网络的情况下使用,通过创建cache manifest文件,创建应用缓存,为PWA(Progressive Web App)提供了底层的技术支持。

总结:对于HTML5与HTML4的区别,这些基本的概念是要有印象的,也许现在还比较粗略,但后面会一步步追问细节,慢慢深入,达到知其然也其所以然的效果。

002: meta标签属性有哪些?

简介: 常用于定义页面的说明,关键 字,最后修改日期,和其它的元数据。这些元数据将服务于浏览器(如何布局或重载页 面),搜索引擎和其它网络服务。

charset属性

<!-- 定义网页文档的字符集 -->
<meta charset="utf-8" />

name + content属性

<!-- 网页作者 -->
<meta name="author" content="开源技术团队"/>
<!-- 网页地址 -->
<meta name="website" content="https://sanyuan0704.github.io/frontend_daily_question/"/>
<!-- 网页版权信息 -->
 <meta name="copyright" content="2018-2019 demo.com"/>
<!-- 网页关键字, 用于SEO -->
<meta name="keywords" content="meta,html"/>
<!-- 网页描述 -->
<meta name="description" content="网页描述"/>
<!-- 搜索引擎索引方式,一般为all,不用深究 -->
<meta name="robots" content="all" />
<!-- 移动端常用视口设置 -->
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0, user-scalable=no"/>
<!-- 
  viewport参数详解:
  width:宽度(数值 / device-width)(默认为980 像素)
  height:高度(数值 / device-height)
  initial-scale:初始的缩放比例 (范围从>0 到10)
  minimum-scale:允许用户缩放到的最小比例
  maximum-scale:允许用户缩放到的最大比例
  user-scalable:用户是否可以手动缩 (no,yes)
 -->

http-equiv属性

<!-- expires指定网页的过期时间。一旦网页过期,必须从服务器上下载。 -->
<meta http-equiv="expires" content="Fri, 12 Jan 2020 18:18:18 GMT"/>
<!-- 等待一定的时间刷新或跳转到其他url。下面1表示1秒 -->
<meta http-equiv="refresh" content="1; url=https://www.baidu.com"/>
<!-- 禁止浏览器从本地缓存中读取网页,即浏览器一旦离开网页在无法连接网络的情况下就无法访问到页面。 -->
<meta http-equiv="pragma" content="no-cache"/>
<!-- 也是设置cookie的一种方式,并且可以指定过期时间 -->
<meta http-equiv="set-cookie" content="name=value expires=Fri, 12 Jan 2001 18:18:18 GMT,path=/"/>
<!-- 使用浏览器版本 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<!-- 针对WebApp全屏模式,隐藏状态栏/设置状态栏颜色,content的值为default | black | black-translucent -->
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />

003: src和href的区别是什么?

定义

href是Hypertext Reference的简写,表示超文本引用,指向网络资源所在位置。

常见场景:

<a href="http://www.baidu.com"></a> 
<link type="text/css" rel="stylesheet" href="common.css"> 

src是source的简写,目的是要把文件下载到html页面中去。

常见场景:

<img src="img/girl.jpg"> 
<iframe src="top.html"> 
<script src="show.js"> 

作用结果

  1. href 用于在当前文档和引用资源之间确立联系
  2. src 用于替换当前内容

浏览器解析方式

  1. 当浏览器遇到href会并行下载资源并且不会停止对当前文档的处理。(同时也是为什么建议使用 link 方式加载 CSS,而不是使用 @import 方式)
  2. 当浏览器解析到src ,会暂停其他资源的下载和处理,直到将该资源加载或执行完毕。(这也是script标签为什么放在底部而不是头部的原因)

004: script标签中defer和async的区别是什么?

默认情况下,脚本的下载和执行将会按照文档的先后顺序同步进行。当脚本下载和执行的时候,文档解析就会被阻塞,在脚本下载和执行完成之后文档才能往下继续进行解析。

下面是async和defer两者区别:

  • 当script中有defer属性时,脚本的加载过程和文档加载是异步发生的,等到文档解析完(DOMContentLoaded事件发生)脚本才开始执行。

  • 当script有async属性时,脚本的加载过程和文档加载也是异步发生的。但脚本下载完成后会停止HTML解析,执行脚本,脚本解析完继续HTML解析。

  • 当script同时有async和defer属性时,执行效果和async一致。

005: 让一个元素水平垂直居中,到底有多少种方案?

水平居中

  • 对于行内元素: text-align: center;

  • 对于确定宽度的块级元素:

  1. width和margin实现。margin: 0 auto;

  2. 绝对定位和margin-left: -width/2, 前提是父元素position: relative

  • 对于宽度未知的块级元素
  1. table标签配合margin左右auto实现水平居中。使用table标签(或直接将块级元素设值为display:table),再通过给该标签添加左右margin为auto。

  2. inline-block实现水平居中方法。display:inline-block;(或display:inline)和text-align:center;实现水平居中。

  3. 绝对定位+transform,translateX可以移动本身元素的50%。

  4. flex布局使用justify-content:center

垂直居中

  1. 利用line-height实现居中,这种方法适合纯文字类

  2. 通过设置父容器相对定位,子级设置绝对定位,标签通过margin实现自适应居中

  3. 弹性布局flex:父级设置display: flex; 子级设置margin为auto实现自适应居中

  4. 父级设置相对定位,子级设置绝对定位,并且通过位移transform实现

  5. table布局,父级通过转换成表格形式,然后子级设置vertical-align实现。(需要注意的是:vertical-align: middle使用的前提条件是内联元素以及display值为table-cell的元素)。

006: 浮动布局的优点?有什么缺点?清除浮动有哪些方式?

浮动布局简介:当元素浮动以后可以向左或向右移动,直到它的外边缘碰到包含它的框或者另外一个浮动元素的边框为止。元素浮动以后会脱离正常的文档流,所以文档的普通流中的框就变现的好像浮动元素不存在一样。

优点

这样做的优点就是在图文混排的时候可以很好的使文字环绕在图片周围。另外当元素浮动了起来之后,它有着块级元素的一些性质例如可以设置宽高等,但它与inline-block还是有一些区别的,第一个就是关于横向排序的时候,float可以设置方向而inline-block方向是固定的;还有一个就是inline-block在使用时有时会有空白间隙的问题

缺点

最明显的缺点就是浮动元素一旦脱离了文档流,就无法撑起父元素,会造成父级元素的高度塌陷。

清除浮动的方式

  1. 添加额外标签
<div class="parent">
    //添加额外标签并且添加clear属性
    <div style="clear:both"></div>
    //也可以加一个br标签
</div>
  1. 父级添加overflow属性,或者设置高度
<div class="parent" style="overflow:hidden">//auto 也可以
    //将父元素的overflow设置为hidden
    <div class="f"></div>
</div>
  1. 建立伪类选择器清除浮动(推荐)
//在css中添加:after伪元素
.parent:after{
    /* 设置添加子元素的内容是空 */
      content: '';  
      /* 设置添加子元素为块级元素 */
      display: block;
      /* 设置添加的子元素的高度0 */
      height: 0;
      /* 设置添加子元素看不见 */
      visibility: hidden;
      /* 设置clear:both */
      clear: both;
}
<div class="parent">
    <div class="f"></div>
</div>

第一周内容汇总到此结束,希望对你有所启发,下周再见!