今日学习任务

  • [ ] 网页案例

  • [x] 筋斗云:排他思想

  • 点餐选择框:开关思想
  • [ ] attribute属性语法学习

  • [ ] a.自定义属性语法

  • [ ] 设置属性setAttribute

  • 获取属性getAttribute
  • 删除属性removeAttribute
  • b.案例
  • [ ] 获取元素方式

  • [ ] innerText和innerHTML区别

  • 根据ID获取元素
  • 根据表签名获取元素
  • 根据类名获取元素
  • 根据name属性获取元素

01-核心案例:排他思想

1.1-案例:筋斗云

需求分析:

  1. 1.鼠标移入li元素:筋斗云移入到对应的li元素
  2. 2.鼠标移出li元素:筋斗云移动到选中的li元素
  3. 3.鼠标点击li元素:改变选中的li元素

效果预览

day02 - 图1

  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. <title>Document</title>
  7. <style>
  8. * {
  9. margin: 0;
  10. padding: 0;
  11. }
  12. ul {
  13. list-style: none;
  14. }
  15. body {
  16. background-color: #333;
  17. }
  18. .nav {
  19. width: 800px;
  20. height: 42px;
  21. margin: 100px auto;
  22. /*background-color: red;*/
  23. background: #fff url(images/rss.png) no-repeat right center;
  24. border-radius: 10px;
  25. position: relative;
  26. }
  27. .nav li {
  28. width: 83px;
  29. height: 42px;
  30. /*background-color: red;*/
  31. text-align: center;
  32. line-height: 42px;
  33. float: left;
  34. cursor: pointer;
  35. }
  36. ul {
  37. position: relative;
  38. }
  39. .nav .current {
  40. background: url(images/cloud.gif) no-repeat;
  41. }
  42. </style>
  43. </head>
  44. <body>
  45. <div class="nav">
  46. <ul id="navBar">
  47. <li class="current">北京校区</li>
  48. <li>上海校区</li>
  49. <li>广州校区</li>
  50. <li>深圳校区</li>
  51. <li>武汉校区</li>
  52. <li>关于我们</li>
  53. <li>联系我们</li>
  54. <li>招贤纳士</li>
  55. </ul>
  56. </div>
  57. <script>
  58. // 1. 事件源:所有的li标签
  59. let lis = document.querySelectorAll('#navBar>li');
  60. // 获取li的位置:设置一个观察者,点击筋斗云默认的位置 let index = 0
  61. let index = 0;
  62. // 2. 遍历li,给每个li绑定事件
  63. lis.forEach(function (item, key) {
  64. // item是lis里面的每个元素值:li,key是当前li的下标
  65. // 2.1 鼠标移入事件
  66. item.onmouseover = function () {
  67. // 排他思想:让所有的li都没有背景
  68. lis.forEach(function (li) {
  69. li.classList.remove('current');
  70. });
  71. // 给当前被点击的li增加背景
  72. item.classList.add('current');
  73. };
  74. // 2.2 点击事件
  75. item.onclick = function () {
  76. index = key;
  77. }
  78. // 2.3 鼠标移出事件
  79. item.onmouseout = function () {
  80. // 排他思想:让所有的li都没有背景
  81. lis.forEach(function (li) {
  82. li.classList.remove('current');
  83. });
  84. lis[index].classList.add('current');
  85. }
  86. });
  87. </script>
  88. </body>
  89. </html>

02-核心案例:开关思想

1.1-点餐选择框:开关思想

效果预览/02-%E6%A1%88%E4%BE%8B%EF%BC%9A%E7%82%B9%E9%A4%90%E9%80%89%E6%8B%A9%E6%A1%86.html)

day02 - 图2

需求分析:切入点:交互
1.点击上方选择框:让下方选择框列表的checked值与自身保持一致
2.点击下方选择框列表:判断上方选择框列表状态
选中:所有的选择框checked值都是true
未选中:只要有一个选择框checked值是false

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. * {
  8. margin: 0;
  9. padding: 0;
  10. }
  11. table {
  12. border-collapse: collapse;
  13. border: 1px solid #c0c0c0;
  14. width: 500px;
  15. margin: 100px auto;
  16. text-align: center;
  17. }
  18. th {
  19. background-color: #09c;
  20. font: bold 16px "微软雅黑";
  21. color: #fff;
  22. height: 24px;
  23. }
  24. td {
  25. border: 1px solid #d0d0d0;
  26. color: #404060;
  27. padding: 10px;
  28. }
  29. </style>
  30. </head>
  31. <body>
  32. <table>
  33. <tr>
  34. <th>
  35. <input type="checkbox" id="checkAll"/>全选/全不选
  36. </th>
  37. <th>菜名</th>
  38. <th>商家</th>
  39. <th>价格</th>
  40. </tr>
  41. <tr>
  42. <td>
  43. <input type="checkbox" class="check"/>
  44. </td>
  45. <td>红烧肉</td>
  46. <td>隆江猪脚饭</td>
  47. <td>¥200</td>
  48. </tr>
  49. <tr>
  50. <td>
  51. <input type="checkbox" class="check"/>
  52. </td>
  53. <td>香酥排骨</td>
  54. <td>隆江猪脚饭</td>
  55. <td>¥998</td>
  56. </tr>
  57. <tr>
  58. <td>
  59. <input type="checkbox" class="check"/>
  60. </td>
  61. <td>北京烤鸭</td>
  62. <td>隆江猪脚饭</td>
  63. <td>¥88</td>
  64. </tr>
  65. </table>
  66. <script>
  67. /*
  68. 1.分析需求(交互):
  69. a.点击上方选择框:下方选择框列表checked属性与上方选择框一致
  70. b.点击下方选择框列表:检查上方选择框选中状态
  71. 选中:所有的选择框列表都是选中状态
  72. 未选中:只要有任何一个选择框列表未选中
  73. 2.思路分析(事件三要素)
  74. 获取元素:事件源:
  75. 注册事件:事件类型
  76. 事件处理:
  77. */
  78. //1.获取元素
  79. let checkAll = document.querySelector('#checkAll');//上方选择框
  80. let checkList = document.querySelectorAll('.check');//下方三个选择框列表
  81. //2.注册事件
  82. //2.1 上方选择框
  83. checkAll.onclick = function () {
  84. //3.事件处理:下方选择框列表checked属性与自身一致
  85. console.log(this.checked);
  86. for(let i = 0;i<checkList.length;i++){
  87. checkList[i].checked = this.checked;
  88. };
  89. };
  90. //2.2 下方选择框列表
  91. for(let i = 0;i<checkList.length;i++){//i = 0 1 2
  92. checkList[i].onclick = function(){
  93. //3.事件处理:this点击的那个选择框
  94. //检查上方选择框选中状态
  95. /* 开关思想:当某种操作结果只有两种状态,可以使用布尔类型表示这两种状态
  96. 1.提出假设 let isAllOk = true
  97. 2.验证假设
  98. 3.根据开关结果实现需求
  99. */
  100. //3.1 提出假设
  101. let isAllOk = true;
  102. //3.2 验证假设
  103. for(let j = 0;j<checkList.length;j++){
  104. // console.log(checkList[j].checked);
  105. //只要有任何一个选择框checked是false,假设被推翻
  106. if(checkList[j].checked == false){
  107. isAllOk = false;
  108. };
  109. };
  110. //3.3 根据开关结果实现需求
  111. checkAll.checked = isAllOk;
  112. // if(isAllOk){
  113. // checkAll.checked = true;
  114. // }else{
  115. // checkAll.checked = false;
  116. // };
  117. // console.log(checkList[0].checked);
  118. // console.log(checkList[1].checked);
  119. // console.log(checkList[2].checked);
  120. };
  121. };
  122. </script>
  123. </body>
  124. </html>

03-获取元素语法补充

  • 重点掌握选择器获取,其他仅做了解 | 语法 | 示例 | 描述 | | —- | —- | —- | | getElementById() | document.getElementById(‘box’) | 根据id获取元素 | | getElementsByTagName() | document.getElementsByTagName(‘li’) | 根据标签名获取元素 | | getElementsByClassName() | document.getElementsByClassName(‘one’) | 根据类名获取元素 | | getElementsByName() | document.getElementsByName(‘sex’) | 根据name属性值获取表单元素 | | querySelector() | document.querySelector(‘选择器’) | 根据选择器获取满足条件第一个元素 | | querySelectorAll() | document.querySelectorAll(‘选择器’) | 根据选择器获取满足条件所有元素 |

1.1-innerText与innerHTML

  • 作用完全不同(只是有些类似)

    • 类似点:获取到的都是string类型字符串
    • innerText:获取元素文本
    • innerHTML:获取元素内容(文本+标签)
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <div id="box">我是班长
  9. <p>我是班长小迷妹</p>
  10. </div>
  11. <script>
  12. let box = document.querySelector('#box');
  13. //1.innerText:获取元素文本(包含子标签的文本)
  14. console.log ( box.innerText );
  15. //2.innertHTML:获取元素内容(包含标签与文本)
  16. console.log ( box.innerHTML );
  17. //3.通过分别设置一个元素的innerText与innertHTML了解两者的区别
  18. //innerText:会把所有的内容都当成文本,无法解析标签
  19. // box.innerText = '<a>我是i连接</a><p>我是p</p>';
  20. //innerHTML:可以解析字符串中的标签
  21. //作用:可以和document.write()一样动态给页面添加元素
  22. box.innerHTML = '<a>我是i连接</a><p>我是p</p>';
  23. </script>
  24. </body>
  25. </html>

1.1-根据id获取页面元素

  • 语法:document.getElementById('id名');

    • 如果没有这个id,那么会得到一个null
  • 由于在html的标签元素中id具有唯一性,所以我们可以直接使用id来表示这个元素

    • 这种用法不推荐,有些浏览器不支持
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <div id="div1">我是div1</div>
  9. <div id="div2">我是div2</div>
  10. </body>
  11. <script>
  12. /**1.getElementById:通过id获取元素
  13. * 参数:元素id字符串
  14. * 返回值:元素对象(又称为dom对象)/null
  15. */
  16. let div1 = document.getElementById('div1');
  17. console.log ( div1 );
  18. console.log ( typeof div1 ); //object
  19. //2.如果没有这个id,那么会得到一个null
  20. let box = document.getElementById('box');
  21. console.log ( box ); //null
  22. //3.由于在html的标签元素中id具有唯一性,所以我们可以直接使用id来表示这个元素
  23. //这种用法不推荐,有些浏览器不支持
  24. console.log ( div2 );
  25. </script>
  26. </html>

1.2-根据标签名tagName获取页面元素

  • 语法:document.getElementsByTagName('标签名')
  • 细节:

    • (1)id具有唯一性所以获取到的要么是null要么是单个元素
    • (2)标签名可以在页面存在多个,所以获取到的一定是一个伪数组,如果没有则是空数组
  • 总结

    • 1.如果使用document调用getElementsByTagName得到的就是整个html文档中所有的标签名元素
    • 2.如果使用某一个元素对象调用getElementsByTagName得到的就是该元素下所有的标签名元素
    • 3.getElementById只能由document来调用,否则会报错
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <ul id="oldWang">
  9. <li id="id1">隔壁老王1</li>
  10. <li>隔壁老王2</li>
  11. <li>隔壁老王3</li>
  12. <li>隔壁老王4</li>
  13. <li>隔壁老王5</li>
  14. </ul>
  15. <ul>
  16. <li>隔壁老张1</li>
  17. <li>隔壁老张2</li>
  18. <li>隔壁老张3</li>
  19. <li>隔壁老张4</li>
  20. <li>隔壁老张5</li>
  21. </ul>
  22. </body>
  23. <script>
  24. /**1.getElementsByTagName通过标签名获取元素
  25. *参数:标签名字符串
  26. * 返回值:标签数组(伪数组)
  27. * * 细节:(1)id具有唯一性所以获取到的要么是null要么是单个元素
  28. * (2)标签名可以在页面存在多个,所以获取到的一定是一个数组,如果没有则是空数组
  29. *
  30. */
  31. let liList = document.getElementsByTagName('li');
  32. console.log ( liList );//一定是一个数组,所以找不到则是空数组
  33. //console.log ( liList.slice () );//程序会报错,伪数组没有数组的API
  34. //2.假如我只想获取某一个元素下所有标签名的元素,可以先获取父元素对象,然后调用父元素对象的getElementsByTagName方法
  35. //2.1 先通过id获取ul标签
  36. let oldWang = document.getElementById('oldWang');
  37. //2.2 调用oldWang的getElementsByTagName方法
  38. let wangList = oldWang.getElementsByTagName('li');
  39. console.log ( wangList );
  40. /*总结
  41. 1.如果使用document调用getElementsByTagName得到的就是整个html文档中所有的标签名元素
  42. 2.如果使用某一个元素对象调用getElementsByTagName得到的就是该元素下所有的标签名元素
  43. 3.getElementById只能由document来调用,否则会报错
  44. */
  45. //console.log ( wangList.getElementById ( "id1" ) );//这样写会报错,id只能通过document来获取
  46. </script>
  47. </html>

1.3-根据类名className获取元素

  • 语法:document.getElementsByClassName ( "类名" )

    • 返回的就是一个伪数组
  • 小技巧:如果API写的是Emement复数的形式,也就是后面加了s(Emements)那么它返回的就是一个伪数组 否则就是单个对象,一般只有id才会是单个对象,其他方式获取(标签名 类名)都是伪数组
  • 注意点:根据类名获取元素存在浏览器兼容问题,IE8及以下不支持,一般很少使用
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <ul id="ul1">
  9. <li class="li1">隔壁老王1</li>
  10. <li class="li1">隔壁老王2</li>
  11. <li class="li1">隔壁老王3</li>
  12. <li class="li1">隔壁老王4</li>
  13. <li class="li1">隔壁老王5</li>
  14. </ul>
  15. <ul id="ul2">
  16. <li class="li1">隔壁老张1</li>
  17. <li class="li1">隔壁老张2</li>
  18. <li class="li1">隔壁老张3</li>
  19. <li class="li1">隔壁老张4</li>
  20. <li class="li1">隔壁老张5</li>
  21. </ul>
  22. </body>
  23. <script>
  24. /*本小节知识点:根据类名classNmae获取元素
  25. 1.小技巧:如果API写的是Emement复数的形式,也就是后面加了s(Emements)那么它返回的就是一个伪数组
  26. 否则就是单个对象,一般只有id才会是单个对象,其他方式获取(标签名 类名)都是伪数组
  27. 2.根据类名获取元素存在浏览器兼容问题,IE8及以下不支持,一般很少使用
  28. */
  29. //1.获取ul1
  30. let ul1 = document.getElementById('ul1');
  31. //2.根据类名获取标签 返回的是一个伪数组
  32. console.log ( ul1.getElementsByClassName ( "li1" ) )//获取ul1元素下的所有类名为li1的标签
  33. console.log ( document.getElementsByClassName ( "li1" ) )//获取整个文档中类名为li1的标签
  34. //3.根据类型获取标签getElementsByClassName,尽量少用,改用其他方式代替
  35. //原因:存在浏览器兼容性问题,IE8及之前不支持
  36. </script>
  37. </html>

1.4-根据name属性值获取表单元素

  • 语法:document.getElementsByName('表单元素name属性的值');

    • name属性是表单元素特有的默认属性,返回值也是一个伪数组
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <input type="text" name="one">
  9. <input type="password" name="one">
  10. <input type="radio" name="one">
  11. <input type="checkbox" name="one">
  12. </body>
  13. <script>
  14. /*使用name属性来获取元素,返回值也是一个伪数组
  15. * name属性是表单元素特有的默认属性
  16. */
  17. let nameList = document.getElementsByName('one');
  18. console.log ( nameList );
  19. </script>
  20. </html>

04-attribute语法学习

1.1-attribute操作自定义属性语法

  • 标签元素属性:

    • (1)行内标准属性:input.id(针对行内)
    • (2)行内自定义属性:开发追加的,html自己不能使用
    • (3)js动态添加属性:可以是行内属性(系统自带的),或者自定义属性
    • (4)行外属性
  • 1.attribute方式

    • 1.获取属性:元素.getAttribute ( “id” ) ==== 行内属性(元素.id)

      • 如果是类型直接使用class,无需使用className,因为这种方式用的是字符串语法获取属性
    • 2.设置属性:元素.setAttribute(‘属性名’,属性值); ==== 元素.id = 值
    • 3.删除属性:元素.removeAttribute(‘属性名’); ==== delete 元素.id
    • 用attribute方式设置的属性只能使用attribute方式来获取
  • 2.注意点

    • js点语法能获取到的属性:

      • (1)行内标准属性
      • (2)js点语法动态添加的自定义属性
    • 不能获取到的属性:

      • (1)行内自定义属性
      • (2)行外属性
    • getAttribute能获取到的属性:

      • (1)行内标准属性
      • (2)行内自定义属性
      • (3)setAttribute动态添加的属性
    • 不能获取到的属性:

      • (1)js点语法动态添加的自定义属性
      • (2)行外属性
  • 3.总结:js点语法操作属性与attribute语法操作属性场景(语义不同)

    • 标准属性操作:使用js点语法(代码简洁)
    • 自定义属性操作:用attribute(易读性更高)
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. .one{
  8. width: 100px;
  9. height: 100px;
  10. //background-color: red;
  11. }
  12. </style>
  13. </head>
  14. <body>
  15. <!--如果一个属性不是html中得属性,那么这个属性成为自定义属性-->
  16. <div id="div1" class="one" aaa='啊啊啊啊'></div>
  17. </body>
  18. <script src="common.js"></script>
  19. <script>
  20. //元素属性写法: (1)行内标准属性 (2)行外属性 (3)js动态添加得属性 (4)行内自定义属性
  21. //1.js点语法属性操作
  22. //1.1 可以拿到哪些
  23. let div1 = id('div1');
  24. div1.index = 1;
  25. div1.setAttribute('index',1);
  26. console.log ( div1.className );//行内标准属性
  27. div1.a = 'a';
  28. console.log ( div1.a )//js动态添加得属性
  29. //1.2 不可以拿到
  30. console.log ( div1.style.width );//行外属性
  31. console.log ( div1.aaa );//行内自定义属性
  32. //2. attribute方式
  33. /*获取属性: 元素.getAttribute('属性名')
  34. 添加属性:元素.setAttribute('属性名',属性值);
  35. * 用setAttribute方式添加只能用getAttribute获取
  36. 删除属性: 元素.removeAttribute('属性名');
  37. * a.属性名属性值全部删除,更加彻底
  38. * b.点语法只能删除属性值,不能删除属性名
  39. 总结:js点语法操作属性与attribute语法操作属性场景
  40. 标准属性:点语法(简洁)
  41. 自定义属性:attribute(代码易读性更高)
  42. */
  43. //2.1 可以获取
  44. console.log ( div1.getAttribute ( "class" ) ); //行内标准属性 类名直接class即可
  45. console.log ( div1.getAttribute ( "aaa" ) ); //行内自定义属性
  46. //2.2 不可以获取
  47. console.log ( div1.getAttribute ( "style.width" ) ); //行外属性
  48. console.log ( div1.getAttribute ( "a" ) ); //js点语法动态添加得属性
  49. //添加属性
  50. div1.setAttribute('index',10);
  51. console.log ( div1.getAttribute ( "index" ) ) //取值 用setAttribute方式添加只能用getAttribute获取
  52. console.log ( div1.index );
  53. //3.删除属性
  54. //div1.className = ''; //属性得值没有了,属性名还在
  55. div1.removeAttribute('class'); //属性名和属性值全部删除,更加干净彻底
  56. </script>
  57. </html>

1.2-案例:隔行变色

day02 - 图3

  • 需求: (1)单数行显示黄色 双数行显示绿色 (2)鼠标移入哪一个就显示红色高亮,移开就恢复原状
  • 思路分析:

    • 1.先获取到界面所有的li标签
    • 2.遍历数组,实现li标签的隔行变色
    • 3.给每一个li标签注册鼠标移入和移出事件
    • 4.移入则修改颜色为红色

      • 对象的赋值操作先回收旧值,再赋新值
    • 5.移出则修改颜色为原先的颜色

      • 可以给对象动态添加一个属性用于存储原先的颜色
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <ul id="ul1">
  9. <li>隔壁老王1</li>
  10. <li>隔壁老王2</li>
  11. <li>隔壁老王3</li>
  12. <li>隔壁老王4</li>
  13. <li>隔壁老王5</li>
  14. <li>隔壁老王6</li>
  15. <li>隔壁老王7</li>
  16. <li>隔壁老王8</li>
  17. <li>隔壁老王9</li>
  18. <li>隔壁老王10</li>
  19. </ul>
  20. </body>
  21. <script>
  22. /*需求:(1)单数行显示黄色 双数行显示绿色 (2)鼠标移入哪一个就显示红色高亮,移开就恢复原状
  23. 思路分析:
  24. * 1.先获取到界面所以的li标签
  25. * 2.遍历数组,实现li标签的隔行变色
  26. * 3.给每一个li标签注册鼠标移入和移出事件
  27. * 4.移入则修改颜色为红色
  28. * 5.移出则修改颜色为原先的颜色
  29. */
  30. //1.获取li标签列表
  31. let liList = document.querySelectorAll('li');
  32. //2.遍历数组,实现隔行变色
  33. for(let i = 0;i<liList.length;i++){
  34. if(i%2 == 0){
  35. //双数行显示绿色
  36. liList[i].style.background = 'green';
  37. }else{
  38. //单数行显示黄色
  39. liList[i].style.background = 'yellow';
  40. }
  41. //3.1 给每一个li标签注册鼠标移入和移出事件
  42. liList[i].onmouseover = function ( ) {
  43. /*(1) 修改之前我们给这个元素添加一个属性用于存储当前颜色*/
  44. this.setAttribute('defaultColor',this.style.background);
  45. //(2)如果移入则修改颜色为红色高亮
  46. this.style.background = 'red';
  47. }
  48. //3.2 移出
  49. liList[i].onmouseout = function ( ) {
  50. //如果移出则修改颜色为之前的颜色
  51. this.style.background = this.getAttribute('defaultColor');
  52. }
  53. }
  54. </script>
  55. </html>

05-核心案例(tab栏切换)

1.1-tab栏切换02(作业)

效果预览/02-%E6%A1%88%E4%BE%8B%EF%BC%9Atab%E6%A0%8F%E5%88%87%E6%8D%A202.html)

day02 - 图4

  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. <title>Document</title>
  7. <style>
  8. * {
  9. margin: 0;
  10. padding: 0;
  11. }
  12. ul {
  13. list-style: none;
  14. }
  15. .box {
  16. width: 400px;
  17. height: 300px;
  18. border: 1px solid #ccc;
  19. margin: 100px auto;
  20. }
  21. .hd {
  22. height: 45px;
  23. }
  24. .hd span {
  25. display: inline-block;
  26. /*将行内元素转换成行内块元素,宽高才起作用*/
  27. width: 90px;
  28. background-color: pink;
  29. line-height: 45px;
  30. text-align: center;
  31. cursor: pointer;
  32. }
  33. .hd span.current {
  34. /*交集选择器,标签指定式选择器*/
  35. background-color: purple;
  36. /*紫色*/
  37. }
  38. .bd li {
  39. height: 255px;
  40. background-color: purple;
  41. display: none;
  42. /*设置隐藏*/
  43. }
  44. .bd li.current {
  45. display: block;
  46. /*显示*/
  47. }
  48. </style>
  49. </head>
  50. <body>
  51. <div class="box" id="box">
  52. <div class="hd">
  53. <span class="current">体育</span>
  54. <span>娱乐</span>
  55. <span>新闻</span>
  56. <span>综合</span>
  57. </div>
  58. <div class="bd">
  59. <ul id="list">
  60. <li class="current">我是体育模块</li>
  61. <li>我的娱乐模块</li>
  62. <li id="li3">我是新闻模块</li>
  63. <li>我是综合模块</li>
  64. </ul>
  65. </div>
  66. </div>
  67. <script>
  68. // 1. 获取所有的span和li
  69. let spans = document.querySelectorAll('.hd>span');
  70. let lis = document.querySelectorAll('#list>li');
  71. // 2. 给所有的span绑定鼠标移入事件:onmouseover
  72. spans.forEach(function (item, index) {
  73. // index代表每个span的下标,但是最终每个li也是对应的位置
  74. // span与li共享下标
  75. item.onmouseover = function () {
  76. // 3. 事件处理:排他:span和li都需要排他
  77. // 3.1 排他:将所有的类似的元素都变成统一的效果
  78. spans.forEach(function (sp) {
  79. sp.classList.remove('current');
  80. });
  81. lis.forEach(function (li) {
  82. li.classList.remove('current');
  83. });
  84. // 3.2 排他:让当前元素有特效
  85. item.classList.add('current');
  86. lis[index].classList.add('current');
  87. };
  88. });
  89. </script>
  90. </body>
  91. </html>

1.2-京东商品展示

效果预览/02-%E4%BA%AC%E4%B8%9C%E5%95%86%E5%93%81%E5%B1%95%E7%A4%BA.html)

day02 - 图5

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. * {
  8. margin: 0;
  9. padding: 0;
  10. }
  11. ul {
  12. list-style: none;
  13. padding-top: 15px;
  14. }
  15. .box {
  16. width: 350px;
  17. height: 420px;
  18. border: 1px solid #000;
  19. margin: 100px auto;
  20. }
  21. li {
  22. float: left;
  23. width: 20%;
  24. text-align: center;
  25. }
  26. img:hover {
  27. outline: 3px solid #0094ff;
  28. }
  29. </style>
  30. </head>
  31. <body>
  32. <div class="box">
  33. <div>
  34. <img src="images/b1.jpg" id="big" alt=""/>
  35. </div>
  36. <div>
  37. <ul id="ul">
  38. <!--data-src是自定义属性,存放对应大图的src-->
  39. <li data-src="images/b1.jpg"><img src="images/s1.jpg" alt=""/></li>
  40. <li data-src="images/b2.jpg"><img src="images/s2.jpg" alt=""/></li>
  41. <li data-src="images/b3.jpg"><img src="images/s3.jpg" alt=""/></li>
  42. <li data-src="images/b4.jpg"><img src="images/s4.jpg" alt=""/></li>
  43. <li data-src="images/b5.jpg"><img src="images/s5.jpg" alt=""/></li>
  44. </ul>
  45. </div>
  46. </div>
  47. <script>
  48. /*
  49. 1.分析需求(交互):
  50. 点击底部li元素:取出当前点击li元素的自定义属性data-src , 赋值给上面img的src属性
  51. 2.思路分析(事件三要素)
  52. 获取元素:事件源:
  53. 注册事件:事件类型
  54. 事件处理:
  55. */
  56. //1.获取元素
  57. let big = document.querySelector('#big');//大图片
  58. let liList = document.querySelectorAll('#ul>li');//小图片列表
  59. //2.循环小图片列表
  60. for(let i = 0;i<liList.length;i++){
  61. //2.1 给每一个小图片添加点击事件
  62. liList[i].onclick = function ( ) {
  63. //3.1 获取li标签的自定义属性data-src
  64. let src = this.getAttribute('data-src');
  65. //3.2 设置大图片的src属性为自己的href属性
  66. big.src = src;
  67. }
  68. }
  69. </script>
  70. </body>
  71. </html>

1.3-tab栏切换选项卡(作业)

效果预览/03-%E6%A1%88%E4%BE%8B%EF%BC%9Atab%E6%A0%8F%E5%88%87%E6%8D%A2%E9%80%89%E9%A1%B9%E5%8D%A1.html)

day02 - 图6

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style type="text/css">
  7. * {
  8. margin: 0;
  9. padding: 0;
  10. }
  11. ul {
  12. list-style: none;
  13. }
  14. .wrapper {
  15. width: 1000px;
  16. height: 475px;
  17. margin: 0 auto;
  18. margin-top: 100px;
  19. }
  20. .tab {
  21. border: 1px solid #ddd;
  22. border-bottom: 0;
  23. height: 36px;
  24. width: 320px;
  25. }
  26. .tab li {
  27. position: relative;
  28. float: left;
  29. width: 80px;
  30. height: 34px;
  31. line-height: 34px;
  32. text-align: center;
  33. cursor: pointer;
  34. border-top: 4px solid #fff;
  35. }
  36. .tab span {
  37. position: absolute;
  38. right: 0;
  39. top: 10px;
  40. background: #ddd;
  41. width: 1px;
  42. height: 14px;
  43. overflow: hidden;
  44. }
  45. .products {
  46. width: 1002px;
  47. border: 1px solid #ddd;
  48. height: 476px;
  49. }
  50. .products .main {
  51. float: left;
  52. display: none;
  53. }
  54. .products .main.selected {
  55. display: block;
  56. }
  57. .tab li.active {
  58. border-color: red;
  59. border-bottom: 0;
  60. }
  61. </style>
  62. </head>
  63. <body>
  64. <div class="wrapper">
  65. <ul class="tab">
  66. <li class="tab-item active">国际大牌<span></span></li>
  67. <li class="tab-item">国妆名牌<span></span></li>
  68. <li class="tab-item">清洁用品<span></span></li>
  69. <li class="tab-item">男士精品</li>
  70. </ul>
  71. <div class="products">
  72. <div class="main selected">
  73. <a href="###"><img src="images1/guojidapai.jpg" alt=""/></a>
  74. </div>
  75. <div class="main">
  76. <a href="###"><img src="images1/guozhuangmingpin.jpg" alt=""/></a>
  77. </div>
  78. <div class="main">
  79. <a href="###"><img src="images1/qingjieyongpin.jpg" alt=""/></a>
  80. </div>
  81. <div class="main">
  82. <a href="###"><img src="images1/nanshijingpin.jpg" alt=""/></a>
  83. </div>
  84. </div>
  85. </div>
  86. <script src="common.js"></script>
  87. <script>
  88. /*
  89. 1.分析需求(交互):
  90. 点击上方li元素 : 排他思想修改样式
  91. a. 自身添加类名active,其他li元素移除类名active
  92. b. 下方对应的div(下标一致)显示,其他div隐藏
  93. 2.思路分析(事件三要素)
  94. 获取元素:事件源:
  95. 注册事件:事件类型
  96. 事件处理:
  97. */
  98. //1.获取元素
  99. let liList = document.querySelectorAll('.tab>li');//顶部li标签列表
  100. let productsList = document.querySelectorAll('.products>div');//商品详情div列表
  101. //2.添加事件
  102. //2.1 遍历liList
  103. for(let i = 0;i<liList.length;i++){
  104. //2.2 给每一个li标签添加自定义属性
  105. liList[i].setAttribute('index',i);
  106. //2.3 给每一个li标签添加点击事件
  107. liList[i].onclick = function ( ) {
  108. //3.1 获取当前点击li元素下标
  109. let index = this.getAttribute('index');
  110. //3.2 排他思想修改样式
  111. for(let j = 0;j<liList.length;j++){
  112. if(j == index){
  113. liList[j].className += ' active';//这里有两个类名 注意中间空格
  114. productsList[j].style.display = 'block';
  115. }else{
  116. liList[j].className = 'tab-item';//默认类名样式
  117. productsList[j].style.display = 'none';
  118. };
  119. } ;
  120. };
  121. };
  122. </script>
  123. </body>
  124. </html>