博客列表 >定位,事件、导航下拉菜单

定位,事件、导航下拉菜单

xsrsblog
xsrsblog原创
2020年06月16日 17:06:52858浏览

定位

通过对元素设置position属性,可以让元素出现在相应设置的位置。定位有四种类型:

  • 静态定位(static):HTML元素的默认值,即没有定位,静态定位的元素不会受到top, bottom, left, right影响。
  • 固定定位(fixed):元素的位置相对于浏览器窗口是固定位置(在不同的层次进行布局),会受到top, bottom, left, right影响。
  • 相对定位(relative):相对定位元素的定位是相对其原来位置的偏移量,会受到top, bottom, left, right影响。
  • 绝对定位(absolute):绝对定位的元素的位置相对于最近的已定位父元素,如果元素没有已定位的父元素,那么它的位置相对与body元素,会受到top, bottom, left, right影响。
脱离文档流 block元素 覆盖下层文本 层次是否提高
relatived
absolute
fixed

事件

网页中的每个元素对象产生某些事件。元素对象添加事件监听器,当相应事件发生时,相应的javascript函数进行相应

事件举例:

  1. 鼠标点击
  2. 页面或图像载入
  3. 鼠标悬浮于页面的某个热点之上
  4. 在表单中选取输入框
  5. 确认表单
  6. 键盘按键

监听器函数:

element.addEventListener(event, function, useCapture);

  1. 第一个参数是事件的类型(比如 “click” 或 “mousedown”)。
  2. 第二个参数是当事件发生时我们需要调用的函数。
  3. 第三个参数是布尔值,指定使用事件冒泡还是事件捕获。此参数是可选的。

事件冒泡还是事件捕获?

  • 事件传播是一种定义当发生事件时元素次序的方法。假如 <div> 元素内有一个 <p>,然后用户点击了这个 <p> 元素,应该首先处理哪个元素“click”事件?
  • 在 HTML DOM 中有两种事件传播的方法:冒泡和捕获。
  1. 在冒泡中,最内侧元素的事件会首先被处理,然后是更外侧的:首先处理 <p> 元素的点击事件,然后是 <div> 元素的点击事件。
  2. 在捕获中,最外侧元素的事件会首先被处理,然后是更内侧的:首先处理 <div> 元素的点击事件,然后是 <p> 元素的点击事件。

导航下拉菜单

HTML源码

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta name="viewport" content="width = device-width,initial-scale = 1.0" />
  6. <title>navs</title>
  7. <link href="nav.css" type="text/css" rel="stylesheet" />
  8. <script type="text/javascript" src="listener.js"></script>
  9. </head>
  10. <body>
  11. <ul id="nav">
  12. <li><a href="#">首页</a></li>
  13. <li><a href="#">视频教程</a></li> <!-- 导航菜单-->
  14. <li><a href="#">入门教程</a></li>
  15. <li><a href="#">资源下载</a></li>
  16. <li>
  17. <a href="#">社区问答</a>
  18. <ul>
  19. <li><a href="">PHP工具</a></li> <!-- 二级菜单-->
  20. <li><a href="">手册</a></li>
  21. <li><a href="">JS特效</a></li>
  22. <li><a href="">网站源码</a></li>
  23. <li><a href="">在线工具</a></li>
  24. <li><a href="">学习课件</a></li>
  25. <li><a href="">后端模板</a></li>
  26. <li><a href="">类库下载</a></li>
  27. </ul>
  28. </li>
  29. <li>
  30. <a href="#">技术文章</a>
  31. <ul>
  32. <li><a href="">头条</a></li>
  33. <li><a href="">博客</a></li>
  34. <li><a href="">PHP教程</a></li>
  35. <li><a href="">PHP框架</a></li>
  36. </ul>
  37. </li>
  38. </ul>
  39. </body>
  40. </html>

CSS源码

样式设置思路:

  1. 对第一个大无序列表的li元素进行浮动,此时第一个ul的height和width变为0,所以通过positon:absolute提高层次,再次被浮动的li撑开height和width
  2. 设置第一级无序列表的position:relative,作为第二级ul的定位参照对象。同时因第二级ul开始了position:absolute,故而也会被其子li撑起height
  3. 将两个二级ul设置为默认不可见,通过js处理可见性
    ```css
    * {
    margin: 0;
    padding: 0;
    }
    ul {
    list-style-type: none;
    }
    #nav >> li {
    margin-left: 20px;

    position: relative;
    }
    a {
    color: white;
    text-decoration: none;
    }
    #nav {
    background-color: black;
    / height: 50px; /
    line-height: 50px;
    font-size: 5px;
    position: absolute;
    }
    #nav > li > ul {
    position: absolute;
    top: 50px;
    left: 10px;
    background-color: rgb(241, 225, 225);
    font-size: 10px;
    width: 130px;
    / height: 200px; /
    }
    #nav > li > ul > li {
    margin-left: 5px;
    }
    li {
    float: left;
    }
    #nav> li > ul > li > a {
    display: block;
    width: 60px;
    height: 30px;
    line-height: 30px;
    }
    #nav > li > a:hover {
    color: red;
    }

#nav > li > ul > li > a:hover {
color: saddlebrown;
}
#nav > li > ul {
display: none;
}

  1. ## javascript源码
  2. ```javascript
  3. window.onload = function () {
  4. //通过事件冒泡,添加事件监听,当A标签或li标签事件被触发,执行li事件响应
  5. const navs = document.querySelectorAll("#nav > li"); //获取#nav下的子li元素
  6. navs.forEach(function (nav) {
  7. nav.addEventListener("mouseover", showSubMenu); //为每个li绑定鼠标移动到a标签监听程序
  8. nav.addEventListener("mouseout", closeSubMenu); //为每个li绑定鼠标移开到a标签监听程序
  9. });
  10. //移动到标签相应函数
  11. function showSubMenu(ee) {
  12. console.log(ee.target);
  13. console.log(this);
  14. if (ee.target.nodeName == "A" && ee.target.nextElementSibling != null) {
  15. //判断触发事件的对象是否为A标签的兄弟标签ul
  16. ee.target.nextElementSibling.style.display = "block";
  17. }
  18. }
  19. //移开标签相应函数
  20. function closeSubMenu(ee) {
  21. if (ee.target.nodeName == "A" && ee.target.nextElementSibling != null) {
  22. ee.target.nextElementSibling.style.display = "none";
  23. }
  24. }
  25. };

效果

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议