[toc]

  • 检测媒体 @media 后可用的查询 window.matchMedia('print').addListener((res) => {});

浏览器解析文档过程

  1. 解析html文档,构建DOM树(遇到img标签就加载资源)
  2. 加载样式,解析样式,构建样式规则树
  3. 加载js,执行js代码
  4. 把DOM树与样式树匹配构建渲染树(加载背景tupian)
  5. 计算元素位置进行布局
  6. 渲染绘制

DOM树里包含了所有HTML标签,包括display:none隐藏,还有用JS动态添加的元素等

render tree不包含隐藏的节点 (比如display:none的节点,还有head节点),因为这些节点不会用于呈现,而且不会影响呈现的,所以就不会包含到 render tree中

重绘:render tree中的一些元素需要更新属性,而这些属性只是影响元素的外观,风格,而不会影响布局的,比如background-color

回流:render tree中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建


input 标签相关操作:

disabled='disabled' 可用于option标签和input标签

readonly='readonly'用于input标签,不能修改的。仍然可以使用 tab 键切换到该字段,还可以选中或拷贝其文本。

input 标签设置属性 autofocus 自动获取焦点

inputElement.focus()

checked 在标签上只要出现就会被勾选,如果是用js代码设置 checked 的值为 true 或 false 即正常;获取也用checked

enterkeyhint 属性可用于修改 手机键盘 enter 按钮的文字

form 和 input 等,可以设置 autocomplete 解决 背景 问题

/* 常规输入框用这个即可 */
input:-webkit-autofill {
    -webkit-box-shadow:0 0 0px 1000px #fff inset;
    -webkit-text-fill-color: #333; 
}
input:-internal-autofill-previewed,
input:-internal-autofill-selected {
    -webkit-text-fill-color: #fff; /* 选中时的颜色 */
    transition: background-color 50000s ease-out 10000s; /* 时间设置一定要长 */
}

或者设置如下属性 autocomplete="off" 关闭自动填充 autocomplete="new-password" 阻止密码字段的自动填充


p 标签中不能放块级元素,内联元素中不能放块级元素;


是用 img 来加载图片还是用背景图片:

  1. 页面会先加载img图片,若图片大会影响后面的内容的加载
  2. 如果用背景来加载图片的话,就不会影响到页面的显示效果
  3. 图片比较重要且资源小就用img
  4. alt属性有利于seo(搜索引擎优化);更好的有利于seo用a标签加css的背景;

&nbsp占位符

标签

HTML Entity 实体是一段以连字号(&)开头、以分号(;)结尾的文本(字符串)。

  • a
download: 添加该属性表示下载 href 内容而非导航,其值是下载文件的名称 
href: 可以是 http开头的地址也可以是  blob: URL(URL.createObjectURL创建) 或 data: URL(base64 的 URL) , tel: URLs, mailto URLs  等

  • table

  • 重置 table border(注意某些用到了单元合并的行可能会出现重复,要单独处理)

<table border="0">
    <thead> <tr><th>时间</th><th>ID</th><th>操作</th></tr></thead>
    <tbody>
        <tr><td>2015</td> <td>1001</td> <td><button>详情</button></td></tr>
    </tbody>
</table>
table{ border-collapse: collapse; }
th{ padding: 10px; background-color: red;color:#fff;}
tr:first-child td{border-top: 1px solid red;}
td{border-bottom: 1px solid red;border-right: 1px solid red;padding: 10px 0}
td:first-child, th:first-child{border-left: 1px solid red;}
th:last-child{ border-right: 1px solid red; }
tbody {
    display:block;
    height:50px;
    overflow:auto;
}
thead, tbody tr {
    display:table;
    width:100%;
    table-layout:fixed;
}
属性:
colspan= 2  占多少列;
rowspan=2  占多少行;
align=left;   
cellspacing="0":两个单元格之间空间的大小;
cellpadding="0":单元的内容和边框之间的空间; 
border="1px"

样式:
border-collapse: collapse; 去掉 table 中边框间间隔,合并边框

<colgroup> 标签用于对表格中的列进行组合,以便对其进行格式化,样式设计。table内,caption元素之后,thead之前(https://www.runoob.com/try/try.php?filename=tryhtml_colgroup_test)

可以利用该标签,设置可拖动表格宽度


<abbr title='people's republic of china'>PRC</abbr>

为浏览器拼写和检查和搜索引擎提供有用的信息。新增的结构标签:(由DIV派生出来)

section:页面中的一个内容区块(不用来布局,只用来划分网页)

article:定义页面独立的区域

aside:侧边栏内容

hgroup:对网页或是区块(section)的标题进行整合

footer:定义section或是文档的页脚

nav:导航

figure:独立的流内容,图片等

mark:标记

progress:进度条(支持性不好)

time:定义公历的时间(24 小时制)或日期,时间和时区偏移是可选的。它的标注是给搜索引擎用的,方便搜索引擎生成更智能的的搜索结果。

(属性datetime='2013-10-18T09:00Z',pubdate 告诉搜索引擎这是该文档或是文章的创建时间。)

T是分隔符Z表示UTC格式;

<details> <!-- 以树形结构显示 -->
    <summary>总结</summary><p>kkk</p>
</details>

<input id='myCar' list='car'/><!-- 用于输入时,提示预先存储的值。 -->
<datalist id='car'><option value='12'></option></datalist>

<pre></pre>: 定义预格式化的文本(保留文本中的空格和换行符)和 white-space:pre 类似;通常用来包含代码


video 和 audio

<video width="320" height="240" controls> 
    <source src="movie.mp4" type="video/mp4">
    <source src="movie.ogg" type="video/ogg">
    您的浏览器不支持 video 标签。
    <!-- Ogg、MPEG4、WebM -->
</video>
  • timeupdate 事件在音频/视频(audio/video)的播放位置发生改变时触发
  • play 事件在音频/视频(audio/video)点击播放时时触发
  • 设置播放时间点 document.getElementById("xxx").currentTime = 5;

label

<label>Do you like peas? <input type="checkbox" name="peas"></label> <!-- 包含 -->
<label for="username">Click me</label> <input type="text" id="username"> <!-- 利用 for 和 id 结合 -->

属性

<html manifest= 'XX X.X X X'> 缓存网页

<!-- 
    rel='shortcut icon' 是历史标准 不应该使用了 
    图像通常可以使用任何被浏览器支持的图像格式
    type:gif,png,ico(image/vnd.microsoft.icon)
    favicon.ico类型的图标所有桌面浏览器都支持,推荐把16×16, 32×32 以及 48×48这几个尺寸的图标整合在favicon.ico中
    现代桌面浏览器,推荐使用PNG图标作为favicon
-->
<link rel='icon' type='images/png' href='images/delete.png'/>
<!-- 防止页面 默认去获取 icon -->
<link rel="icon" href="data:image/png;base64,">

<link rel='dns-prefetch' href='//g.tbcdn.cn'>
在加载网页时对网页中的域名进行解析缓存,这样在你单击当前网页中的连接时就无需进行DNS的解析

<base href = 'http ://www.w3school.com.cn/i/' />
<base target='_blank' />
会在所有的URL(img link a...)前面加上base的href内容,并且跳转方式会用base的target值

  • 列表
<!-- 描述说明性质的列表 -->
<dl> <dt>Name 类似标题</dt> <dd>Warren 这里会缩进</dd> <dl/>
<!-- 属性 type = 1,a,A,i,I 显示的序号类型-->
<!-- 属性 start = 2 表示从2开始 -->
<!-- 属性 reversed = true 表示是否反序显示 -->
<!-- li 中的 value 属性 重新定义序号的值 -->
<ol reversed="true" start='5' type='I'><li value="2"></li></ol>


<input type='file' multiple(多选文件)/> 获取元素的files属性则是一个FileList对象, 该对象是一个类数组对象,一个file对象就是一个Blob。有name,type,size(files[0].name)是火狐的标准+谷歌也可以。 size 是大小乘以 1024 比如不超过 10M => 10*1024*1024 当没有加multiple时 只有一个文件也是用files[0]来获取, change事件用 e.target.files

Filereader对象,图片预览等

返回的值在 r.target.result中

accept: MIME类型,多个之间用逗号隔开 accept="audio/*,video/*,image/*"


全局属性:

data-*:自定义属性;

hidden='hidden'隐藏元素;

spellcheck='true/false'检查有无拼写错误;

tableindex='1'设置按tab键的时候跳转顺序;

contentEditable=true用contentEditable来让元素的内容可以编辑,还提供了一个javascript方法,window.document.designMode='on/off'让所有的内容是否可以修改。react 开发环境会包warring

meta

全屏< meta name="apple-mobile-web-app-capable" content="yes" >

如果content设置为yes,Web应用会以全屏模式运行,反之,则不会。你可以通过只读属性window.navigator.standalone来确定网页是否以全屏模式显示。

兼容性: iOS 2.1 +

< meta name='apple-mobile-web-app-status-bar-style' content='blank'>

除非你先使用apple-mobile-web-app-capable指定全屏模式,否则这个meta标签不会起任何作用。

如果content设置为default,则状态栏正常显示。如果设置为blank,则状态栏会有一个黑色的背景。如果设置为blank-translucent,则状态栏显示为黑色半透明。如果设置为default或blank,则页面显示在状态栏的下方,即状态栏占据上方部分,页面占据下方部分,二者没有遮挡对方或被遮挡。如果设置为blank-translucent,则页面会充满屏幕,其中页面顶部会被状态栏遮盖住(会覆盖页面20px高度,而iphone4和itouch4的Retina屏幕为40px)。默认值default。

兼容性:iOS 2.1 +


<meta http-equiv='Pragma'content='no-cache'>禁止浏览器从本地计算机的缓存中访问该页面
<meta charset="UTF-8"> 大小写都可以
<meta http-equiv="refresh" content="3;url='http://ww.baidu.com">
<meta name="viewport" content="width=device-width, initial-scale=1 user-scalable=no, minimum-scale=1, maximum-scale=1" >
<meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1' />  
IE=edge告诉IE使用最新的引擎渲染网页,chrome=1则可以激活Chrome Frame ;
所以使用X-UA-Compatible标签强制IE8采用低版本方式渲染。 有些因素会自动触发兼容性文档视图,这个时候设置X-UA-Compatible就可以防止这个自动触发的行为。

embed

AllowScriptAccess:naver/aways 参数可以防止从一个域中承载的 SWF文件访问来自另一个域的 HTML页面中的脚本。

allowNetworking:

all: SWF 文件中允许使用所有网络API;

internal: SWF 文件可能不调用浏览器导航或浏览器交互API,但是它会调用任何其它网络API.

none: SWF 文件可能不调用浏览器导航或浏览器交互API,并且它无法使用任何SWF 到 SWF 通信 API

与 dom 操作相关

MDN DOMopen in new window

以下接口都从 Node 继承其方法和属性:

Document, Element, Attr, CharacterData (which Text, Comment, and CDATASection inherit), ProcessingInstruction, DocumentFragment, DocumentType, Notation, Entit

htmlElement 继承自父接口Element和 GlobalEventHandlers的属性


htmlElement.dataset.name = 'hew' 给元素添加自定义属性 data-name="hew"

  • 元素的插入
parentElement.insertBefore(Element, 在父元素中的某个子元素); // 在元素插入到指定元素前面

Element.appendChild(Element); // 在元素内部最后插入元素

ParentNode.prepend(Node,DOMString,...); // 在元素内部第一个元素前插入节点 IE不支持所以建议用 insertBefore 替代
if(parentNode.prepend) {
    parentNode.prepend(Element);
} else {
    var firstNode = parentNode.childNodes[1];
    parentNode.insertBefore(Element, firstNode);
}

  • node.nodeType 1 元素节点 2属性节点(被废弃) 3文本节点

  • node.parentElement 返回当前节点的父元素节点

  • node.parentNode 指定节点的父节点 返回值可能是一个元素(Element )节点,也可能是一个文档(Document )节点,或者是个文档碎片(DocumentFragment)节点



  • 移除元素 node.parentNode.removeChild(node) 兼容性好

  • document.querySelector('#id').cloneNode(true) true表示子节点也clone,返回新 Node

  • 获取原始图片的真实宽高,非css样式修改后的宽高

// 注意是要在 onload 加载后才能调用
var width = htmlImageElement.naturalWidth  
var height = htmlImageElement.naturalHeight
// htmlImageElement 可以是 document.querySelector 等类似方法获取的 img 元素 也可以是 new Image() 创建的元素

元素宽高,与滑动条

  • 获取 img 标签宽高:htmlImageElement.width | height htmlImageElement 提供了特别的属性和方法

  • window.innerWidth | innerHeight 只能通过window调用获取当前显示区域宽高,如果是在iframe中则获取当前所在iframe的显示区域宽高 (都兼容)

  • htmlElement.clientWidth | clientHeight 包括内边距(兼容性好)

  • htmlElement.offsetWidth | offsetHeight 包括内边距和边框的宽度

  • 返回元素相对于父元素的位置,element.offsetLeft 和 offsetTop,用了position更精确。

  • window.screen.width 获取电脑屏幕宽度 (兼容ie10,有问题)

  • htmlElement.scrollHeight 所有内容包括未被滚动到的 没有滚动条时 scrollHeight 和 clientHeight 相同

  • js原生,让元素滚动到可见区域

element.scrollIntoView({ behavior: "smooth"}); 
  • element.scrollLeft/scrollTop 来设置或获取滑动条的位置; 只能作用于元素上,window上无效

  • pageXOffset(scrollX)/pageYOffset(scrollY) 只能作用于 window 上, 推荐 pageXOffset,兼容ie9;只读属性

  • 谷歌的页面滚动是用的body,火狐是用的html;

  • 谷歌:当 scrollTop 的值小于1时会直接返回0,所以用y=1除以a的x次方指数函数来趋近0来由快到慢的滑动。

  • window.scroll() 和 window.scrollTo() 用法一致 参数为两种形式(1)配置对象 (2)(x,y) 值

  • Element.getBoundingClientRect() 元素的大小及其相对于视口的位置(当页面滑动后,值会更改) 兼容良好

x: 推荐用left
y: 推荐用top
top: 距视口顶部距离
left: 距视口左边距离
width: 元素宽度
height: 元素高度
right: 元素右边距离视口左边的距离
bottom: 元素底部距离视口顶部的距离

querySelector

  • 注意选择符中的 # . 关键字 会被识别未 id、 类 querySelectorAll 返回的是 Static Node List(是一次对文档的快照,若是该快照下对文档有什么更改不会影响本次操作);
    document.querySelectorAll('选择符'):返回匹配元素集合。
    document.querySelector ('选择符'):返回匹配第一个元素。
    而 getElementsBy 系列的返回的是 Live Node List:
var ul = document.getElementsByTagName('ul')[0],  
    lis = ul.getElementsByTagName("li");  
for(var i = 0; i < lis.length ; i++){   //这里就是lis.length在一直变化  
    ul.appendChild(document.createElement("li"));  
}  

每一次调用lis都会去遍历一下文档,最终会无限循环。

  • 相同: HTMLCollection 和 NodeList 十分相似,都是一个动态的元素集合,每次访问都需要重新对文档进行查询。

  • 不同: HTMLCollection 是属于 Document Object Model HTML 规范,而 NodeList 属于 Document Object Model Core 规范。 所以在现代浏览器中,querySelectorAll 的返回值是一个静态的 NodeList(包含:entries forEach item keys length) 对象 而 getElementsBy 系列的返回值实际上是一个 HTMLCollection (包含 item length nameItem) 对象

  • NodeList 高版本浏览器可以用 forEach


iframe

  • window.parent 当使用了多个 .parent 超出了实际层级,会返回最后一个层级,不会报错

  • 全局作用域下打印 length console.log(length); 不会报 is not defined 会返回 iframe 的个数

  • 子页面获取父窗口及其元素 window.parent.document.getElementById() 在chrome中window.parent.document 要在服务器上才能使用。

  • 获取当前的内嵌页面url,就直接在该页面使用window.location.href即可

  • 父页面查找子页面的元素:

// 跨域会有问题
// 注意要放入 onload 中  等待子页面加载完成才能获取
document.getElementById('iframeId').contentWindow.[document||document.body||document.getElementById('子页面ID')]
  • 不同域可以在两个页面都设置document.domain='主域名'

  • 父子窗口传递消息

// 父窗口
document.getElementById('iframeId').contentWindow.postmessage('')
// 子窗口iframe中使用
window.onmessage=function(e){e.data}
  • 允许子页面 video 全屏 设置 allowfullscreen

http 请求返回完整的 html 怎么预览

将html注入到 localStorage

/* page1 */
localStorage.removeItem('displayHtmlText')
localStorage.setItem('displayHtmlText', '这是一个后端返回的完整html文件字符串')
window.open('page2')

/* page2 */
// 在打开页面将 localStorage 中的html显示出来
// 打开一个文档,以便写入数据 
document.open();
// 写入文档内容
document.write(localStorage.getItem('preview'))
// 关闭文档
document.close();

Html5 消息通知

Notification(首字母大写) 或 刷新title

谷歌测试时,要启用本地服务的方式

Notification.requestPermission(function(permission){}),方法要用onclick等用户操作方法来调用。

在手机上只有火狐的实现了

预览pdf

<!-- 方式一 -->
<embed src="./pdf.pdf" type="application/pdf" width="100%" height="100%" internalinstanceid="81" />
            
<!-- 方式二 -->
<iframe src="./pdf.pdf" width="100%" height="100%">
    当前浏览器不支持在线预览PDF,请<a href="./pdf.pdf">下载 PDF</a>
</iframe>


<!-- 方式三 -->
<object data="./pdf.pdf" type="application/pdf" width="100%" height="100%">
    当前浏览器不支持在线预览PDF,请<a href="./pdf.pdf">下载 PDF</a>
</object>
Last Updated:
Contributors: Warren