HTML链接和HTML替换型元素(整理)

1. HTML链接

链接是HTML中的一种机制,是HTML文档和其他文档或资源的连接关系。
HTML中链接有两种类型:超链接型标签外部资源链接
a 标签、area标签、link标签

1-1. a 标签

与link标签相同的类型

以下类型的a标签 与对应类型的link语义相同,不同的是 a标签产生的链接会实际显示在网页中,link标签仅仅是元信息
alternate
prev
next
author
help
license
search

a 标签独有的rel

tag 本网页所属的标签
bookmark 到上级章节的链接

辅助的rel

用于提示浏览器或搜索引擎 去做一些处理

nofollow 此链接不会被搜索引擎索引
noopener 此链接打开的网页无法使用opener来获得当前页面的窗口
noreferrer 此链接打开的网页无法使用 referrer来获得当前页面url
opener 打开的网页 可以使用window.opener来访问当前页面的window对象 (a标签的默认行为)
opener

1-2. area 标签

与a标签相比,area不是文本型链接,是区域型链接,它支持的rel类型与a完全一样。
area 需与img和map标签配合使用
例子来自 html 标准:

<p>
  <!-- usemap指定name或id为shapes的map ,map的name和id最好都写上-->
 <img src="shapes.png" usemap="#shapes" alt="area测试图形">
 <map name="shapes">
  <!-- rect 矩形, coords 左上角和右下角坐标-->
  <area shape="rect" coords="25,25,125,125" href="red.html" alt="Red box.">
  <!-- circle 圆形, coords 圆心和半径-->
  <area shape="circle" coords="200,75,50" href="green.html" alt="Green circle.">
 <!-- 不规则图形, coords 图形边缘路径上的各个点,依次连接成此多边形-->
  <area shape="poly" coords="325,25,262,125,388,125" href="blue.html" alt="Blue triangle."> 
 </map>
</p>

1-3. link 标签

link标签中的rel属性的值 决定了link标签的类型。

  • 超链接型link标签
    • canonical 提示页面的主URL
    • alternate 提示页面的变形形式
    • prev 前一项
    • next 后一项
    • 其他超链接型
      • author
      • help
      • license
      • search
  • 外部资源型link标签
    • icon
    • stylesheet
    • modulepreload
    • pingback
    • 预处理类link
      • dns-prefetch
      • preconnect
      • prefetch
      • preload
      • prerender

超链接型link标签

一些link标签会生成超链接,这些超链接不会像a标签那样显示在网页中 。
超链接型link标签是一种被动型链接,在用户不操作的情况下,不会被主动下载。
canonical 型link
多个链接都指向一个页面时(搜索引擎访问这类页面时会去掉重复的页面),此link告诉搜索引擎保留哪个url

<link rel="canonical" href="xxx">

alternate 型link
表示页面的变形形式(变形可能是当前页面内容的不同格式、不同语言或为不同设备设计的版本),同城提供给搜索引擎使用。
典型的应用场景是,页面提供rss订阅时,可以用这样的link引入:

<link rel="alternate" type="application/rss+xml" title="RSS" href="xxx">

prev 型link 和 next 型link
告诉搜索引擎或浏览器,页面的前一项和后一项,有助于页面的批量展示。
HTML 标准建议对next型link做预处理。
其他超链接类的link
其他超链接类的link标签都表示一个跟当前文档相关联的信息,可以将这样的link标签视为一种带链接功能的meta标签

<!-- 页面作者 -->
<link rel="author" href="mailto:authormail@xx.com">
<!-- 本页版权信息页 -->
<link rel="license" href="https://xxx/license.html">
<!-- 本页帮助页 -->
<link rel="help" href="https://xxx/help.html">
<!-- 本页搜索页(一般是站内提供搜索时使用) -->
<link rel="search" href="https://xxx/search.html">

外部资源类link标签

外部资源型link标签会主动下载,并且根据rel类型做相应的处理。
icon 型link
多数浏览器会读取icon型link,并将页面icon展示出来。
icon型link是唯一一个外部资源类的元信息link,其他元信息类link都是超链接。
若没有指定这样的link(建议放在head中,若在body中指定 有的浏览器不会识别),多数浏览器会使用域名根目录下的favicon.ico

<!-- tab上的icon -->
<link rel="icon" sizes="360x640" href="./test_icon_2.png">
<!-- ios保存至桌面上时使用的图标 -->
<link rel="apple-touch-icon" href="image/icon-store-on.png">

stylesheet 型link

<!-- 普通的引入外部样式表的用法,type属性可以不写 -->
<link rel="stylesheet" type="text/css" href="xxx.css">
<!-- 为页面创建一份变体样式,部分浏览器,支持从浏览器菜单中切换这些样式 -->
<link rel="alternate stylesheet" title="theme-light-blue" href="xxx2.css"> 

modulepreload 型link
用于预先加载(下载并放入内存,不会执行)一个JavaScript模块,可以保证JS模块不必等到执行时才加载。
tips:这些JS模块何时执行,如何使用呢?
var preloadedScript = document.createElement("script"); preloadedScript.src = "./test/test.js"; document.body.appendChild(preloadedScript);

<link rel="modulepreload" href="a.js">
<link rel="modulepreload" href="b.js">
<script type="module" src="c.js">

pingback 型link
表示本网页被引用时 应使用pingback地址。此机制是一个独立的标准,遵守pingback的协议的网站在引用本页面时会向这个pingback url发送一个消息 (自动引用通知)

预处理 型link
从在浏览器输入网址到看到页面,需要经过dns解析、建立链接、传输数据、加载进内存、渲染等一系列步骤。
预处理类link标签运行我们控制浏览器,提前针对一些资源去做这些操作以提高性能(用的不好 反而会降低性能)

  • dns-prefetch 提前对一个域名做dns查询(这样的link中的href实际只有域名有意义)
  • preconnect 提前对服务器建立tcp链接
  • prefetch 提前取href指定的url的内容
  • preload 提前加载href指定的url
  • prerender 提前渲染href指定的url
    tips:prefetch和preload还有之前的modulepreload有什么区别?

    tips:prerender如何提前渲染?

2. HTML替换型元素

本文章节1中的链接是HTML一种引入文件的方式,还有一种引入文件的方式——替换型元素(把文件的内容引入,替换掉自身位置的一类标签)

2-1 script

script是为数不多的既可以作为替换型标签,又可以不作为替换型标签的元素。
凡是替换型元素,都是用src属性引用文件的,链接型元素是使用href标签。

2-2 img

两种方式,src写图片地址,或data uri

<img src="https://xxx.xxx.com/img/xxx.png">
<img src="data:image/png;base64,xxxxx">

 <img src='data:image/svg+xml;charset=utf8,<svg version="1.1" xmlns="http://www.w3.org/2000/svg"><rect width="300" height="100" style="fill:rgb(0,0,255);stroke-width:1;stroke:rgb(0,0,0)"/></svg>'/>

 <img src='data:image/svg+xml;charset=utf8,<svg width="600" height="400" version="1.1"
xmlns="http://www.w3.org/2000/svg"><ellipse cx="300" cy="150" rx="200" ry="80"
style="fill:rgb(200,100,50);
stroke:rgb(0,0,100);stroke-width:2"/></svg>' width="100"/>

img标签还有两个重要的属性:srcset和sizes,在不同的屏幕大小和特性下,使用不同的图片源。[1]

<!-- 此规则只是对浏览器的建议,各浏览器选择图片的算法可能有差异。-->
<!-- 
设备dpr为1时,可视区域宽度小于等于600px则使用30px的图片,选择srcset中大于等于30px的最接近的图片,即为small.png;可视区域宽度大于1200px时使用120px的图,找到了large.png;
设备dpr为2时,可视区域宽度小于等于600px则使用30px的图片,选择srcset中大于等于2*30px的最接近的图片,即为middle.png;可视区域宽度大于1200px时使用120px的图,找到了最大的large.png;
-->
<img srcset="small.png 30w, middle.png 60w, large.png 120w" sizes="(max-width:600px) 30px, (max-width:900px) 60px, (max-width:1200px) 90px, 120px" src="default.png" alt="不支持srcset的浏览器会展示src的内容">
<!-- 
设备dpr为1时,使用small.png;设备dpr为2时,使用middle.png;
-->
<img srcset="small.png 1x, middle.png 2x, large.png 3x"  src="default.png" alt="不支持srcset的浏览器会展示src的内容">

srcset提供了根据屏幕条件选取图片的能力,但更好的方法是使用picture

2-3 picture

picture元素的设计与audio和video保持了一致,使用source元素指定图片源,并且支持多个。
此处media属性是media query,与css的@media规则一致

<!-- 基于媒体查询 -->
<picture>
  <source media="(min-width:900px)" srcset="large.png">
  <source media="(min-width:600px)" srcset="middle.png">
  <img src="small.png" alt="不支持picture的浏览器会展示img的内容">
</picture>
<!-- 基于图片格式 -->
<picture>
  <source type="image/vnd.ms-photo" src="img.jxr">
  <source type="image/jp2" src="img.jp2">
  <source type="image/webp" src="img.webp">
  <img src="img.png" alt="新的图片格式某些浏览器可能不支持">
</picture>

2-4 video

<!-- 之前的写法 -->
<video controls="controls" src="video_source.ogg">
<!-- 兼容性高,支持各种视频格式的写法 -->
<video>
  <source src="movie.webm" type="video/webm" >
  <source src="movie.ogg" type="video/ogg" >
  <source src="movie.mp4" type="video/mp4">
  浏览器不支持video标签时显示的内容
</video>

video中还支持一种标签——track,与播放时序相关,最常见的用途是字幕,属性srclang用于指定语言,属性kind (subtitles 字幕、captions 报幕内容、descriptions 视频描述信息、chapters 用于浏览器视频内容、metadata 给代码提供的元信息 普通用户不可见)

2-5 audio

audio标签与picture和video标签一样,用source元素指定源文件

<audio controls>
  <source src="song.mp3" type="audio/mpeg">
  <source src="song.ogg" type="audio/ogg">
  <p>You browser does not support audio.</p>
</audio>

2-6 iframe

新标准中,iframe多了sandbox模式和srcdoc属性

<!-- sandbox的值为空时会应用所有的限制 
    srcdoc内容是html,若浏览器不支持则展示src中的内容
-->
<iframe sandbox srcdoc="<p>Yeah, you can see it <a href="/gallery?mode=cover&amp;amp;page=1">in my gallery</a>."></iframe>

现在不推荐使用iframe,window.opener、window.parent.document、css的opacity等都可能存在漏洞[2]

参考文章


  1. 响应式图像之srcset和sizes属性

  2. XSS传染基础——JavaScript中的opener、iframe

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357