一、案例:推盒子

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <link rel="stylesheet" href="css/reset.min.css">
  7. <style>
  8. html,
  9. body {
  10. height: 100%;
  11. }
  12. .container {
  13. box-sizing: border-box;
  14. position: absolute;
  15. top: 50%;
  16. left: 50%;
  17. margin: -200px 0 0 -200px;
  18. width: 400px;
  19. height: 400px;
  20. background: lightblue;
  21. }
  22. .container .box {
  23. position: absolute;
  24. top: 0;
  25. left: 0;
  26. width: 100px;
  27. height: 100px;
  28. background: lightcoral;
  29. /* CSS3动画 */
  30. transition: .3s linear;
  31. }
  32. </style>
  33. </head>
  34. <body>
  35. <div class="container">
  36. <div class="box"></div>
  37. </div>
  38. <script src="js/jquery.min.js"></script>
  39. <script>
  40. let $container = $('.container'),
  41. $box = $container.children('.box');
  42. $(document).on('keydown keypress', function (ev) {
  43. // 1.首先获取按键码和元素当前的 TOP / LEFT
  44. let code = ev.keyCode,
  45. T = parseFloat($box.css('top')),
  46. L = parseFloat($box.css('left')),
  47. step = 30;
  48. // 2.根据键盘码计算移动的距离
  49. switch (code) {
  50. case 37:
  51. L -= step;
  52. break;
  53. case 38:
  54. T -= step;
  55. break;
  56. case 39:
  57. L += step;
  58. break;
  59. case 40:
  60. T += step;
  61. break;
  62. }
  63. // 4.边界判断
  64. let minL = 0,
  65. maxL = $container.outerWidth() - $box.outerWidth(),
  66. minT = 0,
  67. maxT = $container.outerHeight() - $box.outerHeight();
  68. L = L < minL ? minL : (L > maxL ? maxL : L);
  69. T = T < minT ? minT : (T > maxT ? maxT : T);
  70. // 3.把最新的样式重新赋值为盒子
  71. $box.css({
  72. left: L,
  73. top: T
  74. });
  75. });
  76. </script>
  77. </body>
  78. </html>

mouseover和mouseenter的区别.png

二、案例:自定义菜单

  1. // 1. 获取鼠标的位置
  2. // 2. 把 ul 的 left 和 top 设置为鼠标的位置
  3. // 3. 把盒子的 display 属性设为 block;
  4. let menu = document.getElementById('menu');
  5. document.oncontextmenu = function (e) {
  6. e.preventDefault();
  7. // 1. 获取鼠标的位置
  8. let left = e.clientX;
  9. let top = e.clientY;
  10. // 2. 上一步获取的值设置给 ul
  11. menu.style.left = left + 'px';
  12. menu.style.top = top + 'px';
  13. // 3. 让 ul 显示出来
  14. menu.style.display = 'block';
  15. };
  16. // 增加刷新功能
  17. let refresh = document.getElementById('refresh');
  18. refresh.onclick = function () {
  19. // 刷新页面的方法:
  20. // 1. reload
  21. // window.location.reload();
  22. // 2. 重新给 location 的 href 属性赋值
  23. // window.location.href 获取当前页面的 url;如果给 href 属性赋值一个 url,页面就会跳转到这个 url 指向的页面
  24. window.location.href = window.location.href;
  25. };

三、enter 和 over 的区别

  1. /*
  2. * over: 当从父元素进入子元素会触发父元素 out 事件;接着触发子元素的 over 事件,因为冒泡,又会触发父元素的 over 事件;
  3. *
  4. * */
  5. inner.onmouseenter = function () {
  6. console.log('inner enter');
  7. };
  8. inner.onmouseleave = function () {
  9. console.log('inner leave');
  10. };
  11. outer.onmouseenter = function () {
  12. console.log('outer enter');
  13. };
  14. outer.onmouseleave = function () {
  15. console.log('outer leave');
  16. };
  17. /*
  18. * enter: 从父元素进入子元素并不会触发父元素的 leave 事件,接下来触发子元素的 enter 事件,而且不会冒泡,进而父元素的 enter 事件不会触发;
  19. * */
  20. // 如果以后项目中用到这种大盒子套小盒子的,尽量用 enter 事件;

四、onload 和 DOMContentLoaded

  1. // window.onload 页面中所有的资源(css、js、图片、字体)全部加载完成后,才会触发;
  2. // DOM0级事件:
  3. window.onload = function () {
  4. console.log('window onload');
  5. };
  6. // DOMContentLoaded 页面中的 DOM 结构加载解析完成后就会触发;(DOM2 级事件)
  7. // DOM2 级事件绑定
  8. document.addEventListener('DOMContentLoaded', function () {
  9. console.log('DOM Content Loaded');
  10. }, false);
  11. // DOMContentLoaded 触发早于 window.onload ;
  12. // 以后经常会见到这样写的代码:
  13. document.addEventListener('DOMContentLoaded', function () {
  14. // 在这里面写了很多的业务逻辑,表示页面中的 DOM 结构加载完成后再执行这个回调函数中的代码;
  15. // 因为 JS 是用来操作 DOM 的,这样写是保证 DOM 结构加载解析完成,再操作 DOM 更安全;
  16. }, false);

五、obj 和 key 的问题

  1. let obj = {
  2. name: 'mb', // 对象的属性名都是字符串类型的
  3. id: 17
  4. };
  5. let obj2 = {};
  6. for (let key in obj) {
  7. obj2[key] = obj[key];
  8. /* obj[key] 写在方括号中的 key 没有引号,就是变量,最终被添加到 obj2 中的属性是 key 变量代表的值;第一次遍历 obj key代表的是 'name' 属性,所以第一次给 obj2 添加了一个'name' 属性,值 'mb' ,第二次 key 代表 'id',所以给 obj2 添加的属性是 'id',值是17;所以最后 obj2 是{name: 'mb', id: 17}
  9. */
  10. }
  11. let obj3 = {};
  12. for (let attr in obj) {
  13. obj3.attr = obj[attr];
  14. /*obj3.attr 写在.后面的 attr 是死的属性,不是变量,表示的就是 'attr' 属性,给 obj3 添加的属性 就是 'attr' ,第一遍历时,给 obj3 添加了 'attr' 属性,obj3 就是 {attr: 'mb'};第二次遍历时,obj3.attr 表示 obj3['attr'],此时obj3['attr']有值,所以本次不是添加是修改,就把obj3 修改成了 {attr: 17};*/
  15. }
  16. // obj.key 等价于 obj['key']