- HTML并不简单:Web前端开发精进秘籍
- 张鑫旭
- 1017字
- 2024-07-24 13:21:53
2.1.6 href属性的背后也有细节知识
长话短说,讲三个你可能不知道的关于href属性的细节知识。
1.自动绝对地址
如何使用JavaScript代码将一个相对地址转换为绝对地址?
方法一是使用new URL()方法,语法示意:
![](https://epubservercos.yuewen.com/BADDE0/30121580904729906/epubprivate/OEBPS/Images/48048_36_1.jpg?sign=1739063068-BdXNlK1ZZ7mi4XnzMZDjANMIhPUgYHYl-0-356aed053d618afa0b701af3fab9afad)
设置base参数为你希望的域名,此时就会自动返回绝对地址,例如:
![](https://epubservercos.yuewen.com/BADDE0/30121580904729906/epubprivate/OEBPS/Images/48048_36_2.jpg?sign=1739063068-8NhWi7TUEQiU5McHV9nNG0ow3p2pqQYY-0-d7e24c247986dc5cbd96cfb9d4a415c7)
不过此方法只能用在不需要考虑IE浏览器的产品中。
方法二是使用<a>元素的href属性(<form>元素的action属性亦可)。
代码示意:
![](https://epubservercos.yuewen.com/BADDE0/30121580904729906/epubprivate/OEBPS/Images/48048_36_3.jpg?sign=1739063068-umv9GNmp6mker776Y81EiQoIARJCwyIB-0-2d2245f942be09fb34a4f00deef012a5)
运行结果如图2-10所示。
![](https://epubservercos.yuewen.com/BADDE0/30121580904729906/epubprivate/OEBPS/Images/48048_36_4.jpg?sign=1739063068-MUpGiyqzszI6qXzu8NLughJ0Vi76jKKZ-0-a71ba7d47cdef462d6ae9f68ca952b64)
图2-10 href属性直接返回绝对地址运行结果
也就是说,当href属性值直接访问的时候,浏览器会自动将其转换为绝对地址。
但上面的实现有一个不足之处,就是补全的域名只能是当前页面所在的域名地址,如果希望指定域名,怎么办呢?
可以使用<base>元素临时指定,代码实现示意:
![](https://epubservercos.yuewen.com/BADDE0/30121580904729906/epubprivate/OEBPS/Images/48048_36_5.jpg?sign=1739063068-pvSpvZkBcPnToyF7x8Sjf0FPRiVK7wuP-0-a71f300ff9aff7e174e3f70de55fb28c)
上面的代码,无论在哪个网站运行,其输出结果都是稳定的。
href方法的优点就是兼容性非常好,哪怕是IE8浏览器也是支持的,以及href方法不用担心解析报错(非法的url字符串使用newURL()方法解析的时候,会报Uncaught TypeError错误)。
另外,想要了解更多<base>元素的知识,可以阅读下一节的内容。
2.锚点定位
锚点定位的本质是页面滚动,而与滚动相关的CSS特性非常多,若要深究,篇幅定会冗长,所以这里不做展开,只讲和href属性相关的那点知识。
href的属性值如果以“#”开头,则点击此链接就会触发锚点定位。
例如:
![](https://epubservercos.yuewen.com/BADDE0/30121580904729906/epubprivate/OEBPS/Images/48048_37_1.jpg?sign=1739063068-qWZxjGpIBStiYtcyFnhnr6nlc5EP6IOz-0-d796b01323846c654e287c5822396368)
点击“查看案例”字样的链接,浏览器会自动查询页面中有没有id属性值是'example'的元素(在过去,还会匹配name属性值是'example'的链接元素)。如果有,则会通过改变滚动距离的方式,让该元素定位到浏览器的上边缘(默认位置,可以通过CSS属性修改为下边缘或垂直居中);如果没有匹配,则不会有锚点定位,唯一的变化是浏览器的URL地址的hash值会变成#example。
但我想讲的内容不是上面这个前端开发人员都知道的知识,而是下面的内容:
![](https://epubservercos.yuewen.com/BADDE0/30121580904729906/epubprivate/OEBPS/Images/48048_37_2.jpg?sign=1739063068-OyPg4LIlNKIZcEUyvZ7eMTzozaSRUfOl-0-2727d4b82ce40f4b84c15f1a36a8d1ef)
当href属性值是#top的时候,点击该链接会让页面滚动到顶部,其效果等同于href="#",这是个很有趣的细节知识。
当然,如果页面中存在id="top"的元素,那么此时还是优先定位这个元素,而不是滚动到顶部。
3.无障碍访问
<a>元素自带多个无障碍访问特性,例如,能够使用Tab键聚焦,可以按回车键触发点击行为。
但很多人并不知道,这些无障碍访问行为的存在,全部都是因为有href属性。
一个链接元素,如果没有href属性,那么,这个元素是不能被键盘访问的,也不能匹配像:any-link这样的CSS选择器,此时,其行为表现本质上和<span>一样,就是个普通的内联元素。
因此,在日常开发中,当<a>元素被当作按钮使用的时候,会有如下所示的href属性值设置:
![](https://epubservercos.yuewen.com/BADDE0/30121580904729906/epubprivate/OEBPS/Images/48048_38_1.jpg?sign=1739063068-9kI5kf3fkj3AcB09iz0hPgNDh1YqF3ms-0-edb13790c82da039780f84018fa8ae8a)
href="javascript:"看起来不参与任何行为,实际上保留了当前元素的可访问性,是不能删除的。