DOM中的高度、宽度与距离

HTMLElement/Element 属性

offset

HTMLElement.offsetWidth 属性表示元素的布局宽度。该属性包括元素的内容宽度(content-width)、竖直方向滚动条宽度(scrollbar-width)(如果存在的话)、水平方向的内边距(padding-left padding-right)以及水平方向的边框(border-left-width border-right-width)。

HTMLElement.offsetHeight 属性表示元素的布局高度。该属性包括元素的内容高度(content-height)、水平方向滚动条高度(scrollbar-height)(如果存在的话)、竖直方向的内边距(padding-top padding-bottom)以及竖直方向的边框(border-top-width border-bottom-width)。

offsetWidth = 水平方向content-width + 左右padding + 左右border + 竖直方向滚动条scrollbar-width(如果存在的话)
offsetHeight = 竖直方向content-height + 上下padding + 上下border + 水平方向滚动条scrollbar-height(如果存在的话)

offset_inner

offsetWidth 和 offsetHeight 可以理解为一个 边框盒(border box) 的 width 和 height。

HTMLElement.offsetTop 属性表示元素的左上角相对于其 offsetParent 元素的顶部边框的距离。
HTMLElement.offsetLeft 属性表示元素左上角相对于其 offsetParent 元素的左边框的距离。

HTMLElement.offsetParent 返回一个指向最近的(指包含层级上的最近)包含该元素的定位元素或者最近的 table,td,th,body 元素。当元素的 style.display 设置为 “none” 时,或者该元素的 style.position 被设为 “fixed” 时,offsetParent 返回 null

client

Element.clientWidth 属性表示元素的内部宽度。该属性包括元素的内容宽度(content-width)和内边距(padding),但不包括竖直方向滚动条宽度(scrollbar-width)(如果存在的话),边框(border)和外边距(margin)。

Element.clientHeight 属性表示元素的内部高度。该属性包括元素的内容宽度(content-width)和内边距(padding),但不包括水平方向滚动条高度(scrollbar-height)(如果存在的话),边框(border)和外边距(margin)。

clientWidth = 水平方向content-width + 左右padding
clientHeight = 竖直方向content-height + 上下padding

client_inner

offsetWidth 和 offsetHeight 可以理解为一个 内边距盒(padding box) 的 width 和 height。
padding-box 并不是一个标准的盒模型选项,这里只是为了方便理解

Element.clientTop 属性表示元素顶部边框的宽度。该属性仅包括元素的顶部边框宽度
(border-top-width)。

Element.clientLeft 属性表示元素的左边框宽度。该属性包括元素的左边框 (border-left-width),如果元素的文本方向是从右向左(RTL, right-to-left),并且由于内容溢出导致左边出现了一个垂直滚动条,则该属性包括滚动条的宽度。

scroll

Element.scrollWidth 属性表示元素在不使用滚动条的情况下适合视口中的所有内容所需的最小宽度。scrollWidth 的测量方式与 clientWidth 相同:包含元素的内边距(padding),但不包括边框(border),外边距(margin)或垂直滚动条(如果存在)。scrollWidth 也包括伪元素的宽度,例如 ::before 或 ::after 。如果元素的内容可以正常展示而不需要水平滚动条,则其 scrollWidth 等于 clientWidth 。

Element.scrollHeight 属性表示元素在不使用滚动条的情况下为了适应视口中所用内容所需的最小高度。scrollHeight 的测量方式与 clientHeight 相同:包括元素的内边距(padding),但不包括元素的边框(border)和外边距(margin)。scrollHeight 也包括 ::before 和 ::after 这样的伪元素的高度。 如果元素的内容不需要垂直滚动条就可以正常展示,则其 scrollHeight 等于 clientHeight。

scroll-height_inner

Element.scrollTop 属性可以获取或设置(和前面的属性不同,scrollTop 是一个可读写的属性)元素的顶部到可视内容顶部的距离。如果一个元素的内容没有产生垂直方向的滚动条,那么它的 scrollTop 值为 0 。

Element.scrollLeft 属性可以获取或设置元素的左边到可视内容左边的距离。如果一个元素的内容没有产生水平方向的滚动条,那么它的 scrollLeft 值为 0 。

style 属性

通过 HTMLElement.style 可以获取或设置元素的样式属性。但大部分时候,样式并不是直接存在于元素上而是通过继承等原因体现到的。我们可以通过 window.getComputedStyle(element, [pseudoElt]) 获取到已经解析的 CSS 样式,该方法返回一个 CSSStyleDeclaration 对象,当元素的样式更改时,它会自动更新。

HTMLElement.style.{top|left|right|bottom} 属性定义了定位元素的外边距边界与其包含块边界或正常位置之间的距离,非定位元素设置此属性无效。

以 top 为例,top 的效果取决于元素的 position 属性:

  • 当 position 设置为 absolute 或 fixed 时,top 属性指定了定位元素上外边距边界与其包含块上边界之间的偏移。
  • 当 position 设置为 relative 时,top 属性指定了元素的上边界离开其正常位置的偏移。
  • 当 position 设置为 sticky 时,如果元素在 viewport 里面,top 属性的效果和 position 为 relative 等同;如果元素在 viewport 外面,top 属性的效果和 position 为 fixed 等同。
  • 当 position 设置为 static 时,top 属性无效。

HTMLElement.style.margin{Left|Top|Right|Bottom} 属性定义了元素的外边距
HTMLElement.style.padding{Left|Top|Right|Bottom} 属性定义了元素的内边距
HTMLElement.style.border{Left|Top|Right|Bottom}Width 属性定义了元素边框的宽度

getBoundingClientRect 方法

Element.getBoundingClientRect() 方法返回一个 DOMRect 对象,其提供了元素的大小及其相对于视口的位置。值得注意的是,以上像 offsetWidth 等只读属性返回的都是四舍五入(round)之后的整数数值,getBoundingClientRect 可以返回精确的小数数值。

该方法返回的 DOMRect 对象中的 widthheight 属性是包含了 paddingborder-width 的,而不仅仅是内容部分的宽度和高度。在 content-box 模型中,这两个属性值分别与元素的 width/height + padding + border-width 相等。而如果是 border-box,两个属性则直接与元素的 width 或 height 相等。

element-box_inner

getClientRects 方法

Element.getClientRects() 方法返回一个 DOMRect 集合,其包括元素内所有
边框盒(border box)的边界矩形(bounding rectangles)。大多数元素只有一个边框盒(border box),但是诸如一个多行的内联元素(例如多行的 span 元素)每行都有一个边框盒(border box)。

window 属性

window.innerWidth 属性表示以像素为单位的窗口的视口(viewport)宽度。如果垂直滚动条存在,则这个属性将包括它的宽度。

window.innerHeight 属性表示以像素为单位的窗口的视口(viewport)高度。如果水平滚动条存在,则这个属性将包括它的高度。

window.outerWidth 属性表示整个浏览器外部窗口的宽度。包括侧边栏(如果存在)、窗口镶边和调整窗口大小的边框。

window.outerHeight 属性表示整个浏览器外部窗口的高度。包括工具栏(如果存在)、窗口镶边和调整窗口大小的边框。

inner-outer_inner

一个显著的区分 inner 和 outer 的例子就是打开浏览器的 开发者工具,outerHeight 将会计算上开发者工具的高度,而 innerHeight 不会。

screen 属性

window.screen.width 属性表示屏幕的宽度。

window.screen.height 属性表示屏幕的高度。

window.screen.availWidth 属性表示浏览器窗口在屏幕上可占用的最大宽度。

window.screen.availHeight 属性表示浏览器窗口在屏幕上可占用的最大高度。小工具(Widgets),如任务栏或其他特殊的程序窗口,可能会减少浏览器窗口和其他应用程序能够利用的空间。

document 属性

document.documentElement 返回的是整个 html 文档
document.body 返回的是 body 元素

html 文档 与 body 元素都是有效的 HTMLElement , 所以,他们的属性也符合对应属性的定义:

document.documentElement.clientWidth 浏览器窗口可视区宽度(不包括浏览器控制台、菜单栏、工具栏、滚动条)
document.documentElement.clientHeight 浏览器窗口可视区高度(不包括浏览器控制台、菜单栏、工具栏、滚动条)

document.documentElement.offsetHeight 获取整个文档的高度(包含 body 的 margin )
document.documentElement.offsetWidth 获取整个文档的宽度(包含 body 的 margin )

document.documentElement.scrollTop 返回文档的滚动 top 方向的距离(当窗口发生滚动时值改变)
document.documentElement.scrollLeft 返回文档的滚动 left 方向的距离(当窗口发生滚动时值改变)

document.body.offsetHeight 获取整个 body 的高度(不包含 body 的 margin )
document.body.offsetWidth 获取整个 body 的宽度(不包含 body 的 margin )

distance_inner

png、jpg、bmp、gif、tif图片的区别

BMP

BMP(Bitmap)位图,是 Windows 操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB)。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选1bit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。由于BMP文件格式是 Windows 环境中交换与图有关的数据的一种标准,因此在 Windows 环境中运行的图形图像软件都支持BMP图像格式。

阅读更多

浏览器会话历史 history API

History API

History 接口允许操作浏览器的会话历史记录。

History API 的方法和属性

属性 是否只读 类型 作用
history.length 只读 整数 history 堆栈中会话的数量
history.state 只读 object 返回一个表示历史堆栈顶部的状态的值
history.scrollRestoration auto|manual (string) 允许Web应用程序在历史导航上显式地设置默认滚动恢复行为
方法 作用
history.back() 在浏览器历史记录里前往上一页, 用户可点击浏览器左上角的返回按钮模拟此方法. 等价于 history.go(-1)
history.forward() 在浏览器历史记录里前往下一页,用户可点击浏览器左上角的前进按钮模拟此方法. 等价于 history.go(1)
history.go() 入参为整数,通过当前页面的相对位置从浏览器历史记录加载页面。
history.pushState(state, title[, url]) 按指定的名称和URL(如果提供该参数)将数据 push 进会话历史栈,数据被 DOM 进行不透明处理;可以指定任何可以被序列化的 javascript 对象。
history.replaceState(state, title[, url]) 按指定的数据,名称和URL(如果提供该参数),更新历史栈上最新的入口。这个数据被 DOM 进行了不透明处理。你可以指定任何可以被序列化的 javascript 对象。

History API 用法

History API 最常见的用法是通过 pushState() 方法添加浏览器url历史(浏览器不会加载该 url ,甚至不会检查 url 是否真的存在),这样,在回退的时候就会加载 history 堆栈中的页面。在某种意义上,调用 pushState() 与 设置 window.location = "#foo" 类似,二者都会在当前页面创建并激活新的历史记录。但 pushState() 具有如下几条特点:

  • 新的 URL 可以是与当前 URL 同源的任意 URL 。相反,只有在修改哈希时,设置 window.location 才能是同一个 document。
  • 如果你不想改 URL ,就不用改。相反,设置 window.location = "#foo"; 在当前哈希不是 #foo 时,才能创建新的历史记录项。
  • 你可以将任意数据和新的历史记录项相关联。而基于哈希的方式,要把所有相关数据编码为短字符串。
  • 如果 标题(title 随后还会被浏览器所用到,那么这个数据是可以被使用的(哈希则不是)。
  • pushState() 不会触发 hashchange 事件,即使新的 URL 与旧的 URL 仅哈希不同也是如此

每当活动的历史记录项发生变化时, popstate 事件都会被传递给 window 对象。如果当前活动的历史记录项是被 pushState() 创建的,或者是由 replaceState() 改变的,那么 popstate 事件的状态属性 state 会包含一个当前历史记录状态对象的拷贝。

参考: https://developer.mozilla.org/zh-CN/docs/Web/API/History

DOM中的事件 Event

DOM中的事件 Event

Event 接口表示在 DOM 中出现的事件。

Event(事件)可以由三种方式触发:

  • 由用户触发动作,例如鼠标或键盘事件
  • 由 API 生成,例如指示动画已经完成运行的事件,视频已被暂停等
  • 通过脚本代码触发,例如对元素调用 HTMLElement.click() 方法,或者定义一些自定义事件,再使用 EventTarget.dispatchEvent() 方法将自定义事件派发往指定的目标(target)

有许多不同类型的事件,其中一些使用基于 Event 主接口的二次接口。Event 本身包含适用于所有事件的属性和方法。

很多DOM元素可以被设计接收(或者监听) 这些事件, 并且执行代码去响应(或者处理)它们。通过 EventTarget.addEventListener() 方法可以将事件处理函数绑定到不同的HTML elements上 (比如<button>, <div>, <span>等等) 。这种绑定事件处理函数的方式基本替换了老版本中使用 HTML event handler attributes(例如 HTMLElement.onclick = ... ) 来绑定事件处理函数的方式。除此之外,通过正确使用 removeEventListener() 方法,这些事件处理函数也能被移除。

阅读更多

脱离文档流的方法

正常文档布局流

正常文档布局流(normal document layout flow)是指在没有改变默认布局规则情况下的页面元素布局方式。如果你未曾应用任何CSS规则来改变它们的展现方式,网页上的元素将会按照正常布局流来组织布局。
首先说一下独立元素的布局。元素的内容被放在一个独立的元素盒子中,然后在其周边加上内边距(padding)、边框(border)和外边距(margin) — 就是我们所说的盒子模型(box model)。默认情况下,一个块级元素(典型如div)的内容宽度是其父元素的100%,其高度与其内容高度一致。内联元素(典型如span)的高度、宽度与内容一致。你可以通过设置 display: blockdisplay: inline 来将一个元素变为块级元素或内联元素。
元素之间又是如何相互影响的呢?块级元素默认会按照基于其父元素的书写顺序(writing-mode: horizontal-tb)的块流动方向(block flow direction)放置 — 每个块级元素会在上一个元素下面另起一行,它们会被设置好的外边距(margin)分隔。在英语,或者其他水平书写、自上而下模式里,块级元素是垂直组织的。内联元素的表现有所不同 — 它们不会另起一行;只要在其父级块级元素的宽度内有足够的空间,它们与其他内联元素、相邻的文本内容(或者被包裹的)被安排在同一行。如果空间不够,溢出的文本或元素将移到新的一行。

阅读更多

HTML5特性

HTML5 是定义 HTML 标准的最新的版本。WHATWG 致力于 web 表单和应用程序,而 W3C 专注于 XHTML 2.0。在 2006 年,双方决定进行合作,来创建一个新版本的 HTML,这就是HTML5。

阅读更多

HTML 行内元素&块状元素

行内元素与块状元素有什么区别?

行内元素:会在水平方向排列,不能包含块级元素,设置width无效,height无效(可以设置line-height),margin上下无效,padding上下无效
块级元素:各占据一行,垂直方向排列。从新行开始结束接着一个断行

列举常用行内与块状元素

块级元素:div, p, h1-h5, form, ul, li
行内元素:span, a, label, input, img, strong, em

HTML html5常用标签

html5新增的常用标签有哪些

header 定义一个页面或一个区域的头部
footer 定义一个页面或一个区域的底部
nav 定义导航链接
aside 定义页面内容部分的侧边栏
artical 定义一篇文章
section 定义一个区域
hgroup 定义文件中一个区块的相关信息
figure 定义一组媒体内容以及它们的标题
dialog 定义一个对话框(会话框)类似微信
audio 定义声音内容
video 定义视频内容
canvas 定义图形
embed 定义外部交互内容或插件
mark 定义有记号的文本

HTML 语义化

语义化

语义化就是根据内容选择标签。

语义化的好处

语义化的好处是使代码结构清晰,便于阅读,同时充分利用了SEO。

HTML 事件绑定&事件委托

如何给一个元素绑定事件,分别有几种方式?各有什么好处?

  1. 监听方法绑定方式
    事件冒泡 事件捕获
    js事件流是先由 window->document->body->div->(text) 触发一遍捕获 capture ,
    再由(text)->div->body->document->window触发一遍冒泡bubbling

element.addEventListener(type, listener, useCapture);
type:事件类型
listener:监听方法
useCapture:是否捕获,默认false,即在冒泡时触发

listener的入参event可以获取到event.target event.currentTarget
其中,target是真正发生事件的DOM元素,而currentTarget是当前事件发生在哪个DOM元素上。

阅读更多

页面渲染html的过程

浏览器渲染页面的一般过程:

1.浏览器解析html源码,然后创建一个 DOM树。并行请求 css/image/js 在DOM树中,每一个HTML标签都有一个对应的节点,并且每一个文本也都会有一个对应的文本节点。DOM树的根节点就是 documentElement,对应的是 html 标签。

2.浏览器解析CSS代码,计算出最终的样式数据。构建CSSOM树。对CSS代码中非法的语法它会直接忽略掉。解析CSS的时候会按照如下顺序来定义优先级:浏览器默认设置 < 用户设置 < 外链样式 < 内联样式 < html中的style。

3.DOM Tree + CSSOM –> 渲染树(rendering tree)。渲染树和DOM树有点像,但是是有区别的。

DOM树完全和html标签一一对应,但是渲染树会忽略掉不需要渲染的元素,比如 head、display:none 的元素等。而且一大段文本中的每一个行在渲染树中都是独立的一个节点。渲染树中的每一个节点都存储有对应的css属性。

4.一旦渲染树创建好了,浏览器就可以根据渲染树直接把页面绘制到屏幕上。

以上四个步骤并不是一次性顺序完成的。如果DOM或者CSSOM被修改,以上过程会被重复执行。实际上, CSS 和 JavaScript 往往会多次修改 DOM 或者 CSSOM 。

head中的meta

meta指的是html元素中存在与head中的meta元素
它长这样

1
<meta charset="utf-8">

meta的含义

HTML 元素表示那些不能由其它HTML元相关元素 (<base>, <link>, <script>, <style> 或 <title>) 之一表示的任何元数据信息.

meta的属性

charset

此特性声明当前文档所使用的字符编码,但该声明可以被任何一个元素(通常是html)的 lang 特性的值覆盖。此特性的值必须是一个符合由IANA所定义的字符编码首选MIME 名称(preferred MIME name )之一。

有几点需要注意:

  1. 推荐使用 UTF-8;
  2. 元素必须包含在 元素中并且在HTML代码的前1024个字节内,因为某些浏览器在选择编码之前只查看前面这些字节。
  3. meta charset元素并不能决定字符集,网页采用何种字符是由 网页字符算法 决定的
  4. 强烈建议使用该属性定义字符编码. 如果未定义,某些跨脚本技术可能危害网页, 例如 UTF-7 降级XSS攻击

http-equiv

这个枚举属性定义了能改变服务器和用户引擎行为的编译行为。值使用 content 来定义,如下:

含义
content-security-policy 它允许页面作者定义当前页的内容策略。 内容策略主要指定允许的服务器源和脚本端点,这有助于防止跨站点脚本攻击。
default-style 这个属性指定了在页面上使用的首选样式表. content属性必须包含 <link> 元素的标题, href属性链接到CSS样式表或包含CSS样式表的 <style> 元素的标题.
refresh 这个属性规定了重新载入页面或跳转到指定链接的时间间隔(正整数)

name & content

全局属性 name 在 元素中具有特殊的语义;
另外, 在同一个 标签中,name、http-equiv 或者 charset 三者中任何一个属性存在时,itemprop 属性不能被使用。

定义文档级元数据的名称 与 内容

含义
application-name 定义正运行在该网页上的网络应用名称
author 这个文档的作者名称
description 其中包含页面内容的简短和精确的描述。 一些浏览器,如Firefox和Opera,将其用作书签页面的默认描述
generator 包含生成页面的软件的标识符
keywords 包含与逗号分隔的页面内容相关的单词(关键词)
referrer 控制所有从该文档发出的 HTTP 请求中HTTP Referer 首部的内容

name 为 referrer 时 content 的可选值

含义
no-referrer 不要发送 HTTP Referer 首部
origin 发送当前文档的 origin。
no-referrer-when-downgrade 当目的地是先验安全的(https->https)则发送 origin 作为 referrer ,但是当目的地是较不安全的 (https->http)时则不发送 referrer 。这个是默认的行为。
origin-when-crossorigin 在同源请求下,发送完整的URL (不含查询参数) ,其他情况下则仅发送当前文档的 origin。
unsafe-URL 在同源请求下,发送完整的URL (不含查询参数)。

有些name虽然没有被正式承认,但是也被广泛使用,这个网站 列举了所有存在的meta值。以下列举一些常用的。

含义
creator 文档的创建者
publisher 文档的发布者
robots 定义了合理的被允许的爬虫行为,注意只有搜索引擎爬虫会遵循此规则所以并不能阻止个人的爬虫程序,而且爬虫能读取到该属性说明已经在读取此网页了,所以最好使用robots.txt来阻止搜索引擎爬虫
viewport 视口,提供有关视口初始大小的提示,仅供移动设备使用,虽然目前标准化程度不高,还处于草案(work in progress)的进度,但由于事实上的几个浏览器的支配地位,大多数移动浏览器都尊重这一声明,更多有关viewport的解释参见文档

有关viewport的相关内容,参见 浅谈viewport

viewport

viewport来源

通常为了使得网页能够成为响应式的,我们需要在head内声名有关viewport的meta。
它长这样

1
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no"/>

viewport的设计是由于pc互联网向移动互联网的过渡。在过去,多数文档被设计用来在pc上进行阅读,而pc的设备通常比较宽,同样的网页不进行任何改变放到移动端的话,内容就会变得无法辨认。

阅读更多

链接a标签的用法

样式

<a> 标签定义超链接,用于从一张页面链接到另一张页面。

在所有浏览器中,链接的默认外观是:

  • 未被访问的链接带有下划线而且是蓝色的
  • 活动链接带有下划线而且是红色的
  • 已被访问的链接带有下划线而且是紫色的

链接默认样式

1
2
3
4
a:link {color: blue;text-decoration: underline;}    /* 未访问的链接 */
a:hover {color: blue;text-decoration: underline;} /* 鼠标移动到链接上 */
a:active {color: red;text-decoration: underline;} /* 鼠标按下但还未收起时的链接 */
a:visited {color: purple;text-decoration: underline;} /* 已访问的链接 */

<a>不能自闭合,必须有开始标识与结束标识。

阅读更多