Blogger Information
Blog 100
fans 8
comment 2
visits 149882
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
html链接元素a、css定位与下拉菜单
lilove的博客
Original
1272 people have browsed it

认识<a>…</a>

a标签常见写法

<a href="...">...</a>

href的值可以是一个网址、一个文本文档、一个非文本文件路径,还可以实现一些功能。

当用户点击链接后各自有不同的意义:

  • #html元素id:跳转到指定id锚点,首页可直接用”#“。
  • 网址:在当前窗口或新窗口中打开链接。
  • 文本文档:打开文档查看内容。
  • 非文本文档路径:下载文件。
  • mailto:邮箱地址:调用本地程序发邮件。
  • tel:电话号码:调用本地程序拨打电话。

元素定位


html元素的定位在css样式中可以利用 position 来定义,例如:

  • position: static; 静态定位 默认定位。

  • position:fixed; 固定定位 将html元素在页面上固定且不随滚动条滚动。

  • position: absolute; 绝对定位 优先参照有定位属性的父级元素否则参照body。

  • position: relative; 相对定位 参照文档流定位。

导航条下拉菜单主要用到 absoluterelative


事件


来看一段获取html按钮内容代码片段:

  1. <button onclick="console.log(this.innerText)">button内容</button>
  • 其中 onclick="console.log(this.innerText)" 是以事件属性方式添加事件。

表示这个按钮被点击后的操作是获取按钮的文本内容。

  • 也可以javascript对象属性方式添加事件,例如:
  1. <script>
  2. document.querySelectorAll("#button-id")[0].onclick = function () {
  3. console.log("点击一次1");
  4. };
  5. document.querySelectorAll("#button-id")[0].onclick = function () {
  6. console.log("点击一次2");
  7. };
  8. </script>

注意:以javascript对象属性方式添加事件的元素只会生效最后一次事件。

  • 如果要同时触发一个元素上的多个事件,使用javascript事件监听器
  1. <script>
  2. const but3 = document.querySelectorAll("button")[2];
  3. but3.addEventListener("click", function () {
  4. console.log("全部按钮1");
  5. });
  6. but3.addEventListener("click", function () {
  7. console.log("全部按钮2");
  8. });
  9. but3.addEventListener("click", function () {
  10. console.log("全部按钮3");
  11. });
  12. <script>

点击按钮后浏览器控制台输出结果:


事件的触发阶段


  • 事件冒泡与捕获代码片段:
  1. <body>
  2. <ul>
  3. <li><a href="#">点击链接</a></li>
  4. </ul>
  5. </body>
  6. <script>
  7. const a = document.querySelector("a");
  8. const li = document.querySelector("li");
  9. const ul = document.querySelector("ul");
  10. const body = document.body;
  11. // 事件冒泡,第三个参数默认是false
  12. a.addEventListener("click", getTagName);
  13. li.addEventListener("click", getTagName);
  14. ul.addEventListener("click", getTagName);
  15. body.addEventListener("click", getTagName);
  16. // 事件捕获
  17. a.addEventListener("click", getTagName, true);
  18. li.addEventListener("click", getTagName, true);
  19. ul.addEventListener("click", getTagName, true);
  20. body.addEventListener("click", getTagName, true);
  21. function getTagName() {
  22. alert(this.tagName);
  23. }
  24. </script>

实际开发中多用于冒泡。


事件代理


事件代理的意义:通过非当前触发的事件代理当前触发事件,可以简化代码。

例如:

  1. <body>
  2. <ul>
  3. <li>li1</li>
  4. <li>li2</li>
  5. <li>li3</li>
  6. <li>li4</li>
  7. <li>li5</li>
  8. <li>li6</li>
  9. <li>li7</li>
  10. <li>li8</li>
  11. </ul>
  12. </body>
  13. <script>
  14. // 1.forEach()循环输出li内容
  15. // const alla = document.querySelectorAll("li");
  16. // alla.forEach(function (li) {
  17. // li.addEventListener("click", function () {
  18. // console.log(li.innerText);
  19. // });
  20. // });
  21. // 2.利用事件代理输出li,用ul冒泡代理li的输出,ev:事件对象
  22. document.querySelector("ul").addEventListener("mouseover", function (ev) {
  23. // 返回当前正在触发事件的元素,这里是li
  24. console.log(ev.target);
  25. // 返回事件绑定的元素,这里是ul
  26. console.log(ev.currentTarget);
  27. });
  28. </script>

这个案例使用了事件监听和冒泡代理的方式取代了传统的forEach()循环输出,更加符合逻辑要求。

实例:导航条下拉菜单

html代码:

  1. <!DOCTYPE html>
  2. <html lang="zh-cn">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <link rel="stylesheet" href="style.css" />
  7. <title>小刚的导航菜单demo</title>
  8. </head>
  9. <body>
  10. <div class="nav">
  11. <ul id="navbar" class="navbar">
  12. <li class="link">
  13. <a href="">首页</a>
  14. </li>
  15. <li class="link">
  16. <a href="">技术论坛</a>
  17. </li>
  18. <li class="link">
  19. <a href="">工具下载</a>
  20. <ul id="page" class="page">
  21. <li><a href="">PHP</a></li>
  22. <li><a href="">HTML</a></li>
  23. <li><a href="">CSS</a></li>
  24. <li><a href="">JAVASCRIPT</a></li>
  25. </ul>
  26. </li>
  27. <li class="link">
  28. <a href="">手册下载</a>
  29. <ul id="page" class="page">
  30. <li><a href="">PHP</a></li>
  31. <li><a href="">HTML</a></li>
  32. <li><a href="">CSS</a></li>
  33. <li><a href="">JAVASCRIPT</a></li>
  34. </ul>
  35. </li>
  36. <li class="link">
  37. <a href="">用户中心</a>
  38. </li>
  39. </ul>
  40. </div>
  41. </body>
  42. <script>
  43. // 获取下拉菜单
  44. const navs = document.querySelectorAll("#navbar > li");
  45. // 循环出每一个下拉菜单并添加鼠标划过与划出事件
  46. navs.forEach(function (nav) {
  47. nav.addEventListener("mouseover", showPage);
  48. nav.addEventListener("mouseout", closePage);
  49. });
  50. // 为事件添加显示与隐藏方法(冒泡)
  51. function showPage(ev) {
  52. if (ev.target.nextElementSibling !== null) {
  53. ev.target.nextElementSibling.style.display = "block";
  54. }
  55. }
  56. function closePage(ev) {
  57. if (ev.target.nextElementSibling !== null) {
  58. ev.target.nextElementSibling.style.display = "none";
  59. }
  60. }
  61. </script>
  62. </html>

外部样式表 style.css

  1. /**
  2. 层叠样式表
  3. */
  4. * {
  5. margin: 0;
  6. padding: 0;
  7. list-style: none;
  8. }
  9. a {
  10. display: block;
  11. height: 35px;
  12. color: #898988;
  13. text-decoration: none;
  14. padding-top: 15px;
  15. }
  16. a:hover {
  17. color: #e8e7e3;
  18. background-color: #3f3f3f;
  19. }
  20. .nav {
  21. position: fixed;
  22. height: 50px;
  23. width: 100%;
  24. background-color: #e8e7e3;
  25. box-shadow: 0 1px 1px rgb(154, 156, 156);
  26. }
  27. .navbar {
  28. min-width: 1000px;
  29. }
  30. .link {
  31. display: inline-block;
  32. position: relative;
  33. width: 100px;
  34. text-align: center;
  35. }
  36. .page {
  37. display: none;
  38. position: absolute;
  39. height: 200px;
  40. width: 100px;
  41. background-color: #e8e7e3;
  42. }
  43. .page li {
  44. display: inline-block;
  45. width: 100%;
  46. }

实现效果

导航条下拉菜单

总结

  1. 理解 <a> 标签的作用;
  2. css定位方式 absolute和relative 的区别及应用;
  3. html页面dom事件对象的运用,例如:onclick;
  4. javascript事件对象的运用,例如:ev.target、ev.currentTarget;
  5. javascript监听器的作用;
  6. 理解事件冒泡与捕获的区别及影响DOM元素的问题;

ps:不知为何,我的关闭菜单代码 closePage() 不需要判断冒泡影响的父元素,有待研究,怀疑是CSS样式的原因,有兴趣研究的还请赐教。

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:所谓事件冒泡,其实想一下,很简单的, 不是吗?
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post