DOM的一些案例

目录

1、百度换肤效果

2、表格隔行变色效果

3、表单全选和取消全选

4、tab栏切换制作

5、动态生成表格

6、跟随鼠标的天使

7、模拟京东按键输入内容案例


1、百度换肤效果

 案例分析:

  • 这个案例练习的是给一组元素注册事件
  • 给4个小图片利用循环注册点击事件
  • 当我们点击了这个图片,我们的页面背景改为当前的图片
  • 核心算法:把当前图片的src路径取过来,给body做为背景即可
<head>    
    <style>
        *{
            padding: 0;
            margin: 0;
        }
        body {
            background: url(image/1.jpg) no-repeat center top;
        }
        li{
            list-style: none;
        }
        .baidu{
            overflow: hidden;
            margin: 100px auto;
            background-color: #fff;
            width: 410px;
            padding-top: 3px;
        }
        .baidu li{
            float: left;
            margin: 0 1px;
            cursor: pointer;
        }
        .baidu img{
            width: 100px;
        }
    </style>
</head>
<body>
    <div class="baidu">
        <ul>
            <li><img src="image/1.jpg" alt=""></li>
            <li><img src="image/2.jpg" alt=""></li>
            <li><img src="image/3.jpg" alt=""></li>
            <li><img src="image/4.jpg" alt=""></li>
        </ul>
    </div>
    <script>
        //1.获取元素
        var imgs = document.querySelector('.baidu').querySelectorAll('img');
        //2.循环注册事件
        for(var i = 0 ; i<imgs.length; i++){
            imgs[i].onclick=function(){
                //this.src 就是我们点击图片的路径 将它给body就可以了
                document.body.style.backgroundImage='url(' + this.src +' )';
            }
        }
    </script>
</body>

2、表格隔行变色效果

案例分析:

  • 用到新的鼠标事件 鼠标经过onmouseover 鼠标离开onmouseout
  • 核心思路:鼠标经过tr行 当前的行变背景颜色 鼠标离开就去掉当前的背景颜色
  • 注意:第一行(thead里面的行)不需要变换颜色 因此我们获取的是tbody里面的行
<head>
    <style>
        table{
            width: 800px;
            margin: 100px auto;
            text-align: center;
            border-collapse: collapse;
            font-size: 14px;
        }

        thead tr{
            height: 30px;
            background-color: skyblue;
        }

        tbody td{
            border-bottom: 1px solid #d7d7d7;
            color:blue;
        }

        .bg{
            background-color: pink;
        }
    </style>
</head>
<body>
    <table>
        <thead>
            <tr>
                <th>代码</th>
                <th>名称</th>
                <th>最新公布净值</th>
                <th>累计净值</th>
                <th>前单位净值</th>
                <th>净值增长率</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>003526</td>
                <td>农行金穗3个月定期开放债券</td>
                <td>1.075</td>
                <td>1.079</td>
                <td>1.074</td>
                <td>+0.047%</td>
            </tr>
            <tr>
                <td>003526</td>
                <td>农行金穗3个月定期开放债券</td>
                <td>1.075</td>
                <td>1.079</td>
                <td>1.074</td>
                <td>+0.047%</td>
            </tr>
            <tr>
                <td>003526</td>
                <td>农行金穗3个月定期开放债券</td>
                <td>1.075</td>
                <td>1.079</td>
                <td>1.074</td>
                <td>+0.047%</td>
            </tr>
            </tbody>
    </table>
    <script>
        // 1.获取元素 获取的是tbody里面所以的行
        var trs = document.querySelector('tbody').querySelectorAll('tr');
        // 2.利用循环注册事件
        for(var i = 0; i<trs.length; i++){
            // 3.鼠标经过事件 onmouseover
           trs[i].onmouseover = function(){
            this.className = 'bg';
        } 
        // 4.鼠标离开事件 onmouseout
        trs[i].onmouseout = function(){
            this.className = '';
        } 
        }
    </script>
</body>

3、表单全选和取消全选

案例分析:

  • 全选和取消全选做法:让下面所有复选框的checked属性(选中状态)跟随全选按钮即可
  • 下面复选框需要全部选中,上面全选才能选中做法:给下面所有复选框绑定点击事件,每次点击,都要循环查看下面所有的复选框是否有没选中的,如果有一个没选中,上面全选就不选中。
  • 可以设置一个变量来控制全选是否选中
<head>
    <style>
        table {
            width: 300px;
            margin: 100px auto;
            text-align: center;
            border-collapse: collapse;
        }

        thead tr {
            background-color: skyblue;
        }

        tbody td{
            border: 1px solid #dfdfdf;
        }
    </style>
</head>
<body>
    <table>
        <thead>
            <tr>
                <th><input type="checkbox" id="j_cbAll"></th>
                <th>商品</th>
                <th>价格</th>
            </tr>
        </thead>
        <tbody id="j_tbs">
            <tr>
                <td><input type="checkbox"></td>
                <td>iphone8</td>
                <td>8000</td>
            </tr>
            <tr>
                <td><input type="checkbox"></td>
                <td>iPad Pro</td>
                <td>5000</td>
            </tr>
            <tr>
                <td><input type="checkbox"></td>
                <td>iPad Air</td>
                <td>2000</td>
            </tr>
            <tr>
                <td><input type="checkbox"></td>
                <td>Apple Watch</td>
                <td>2000</td>
            </tr>
        </tbody>
    </table>
    <script>
        // 1.获取元素
        var j_cbAll = document.getElementById('j_cbAll');//全选按钮
        var j_tbs = document.getElementById('j_tbs').getElementsByTagName('input');//下面所有的复选框都被选中
        // 2.注册事件
        // 全选和取消全选做法
        j_cbAll.onclick = function(){
            for(var i = 0; i<j_tbs.length; i++){
                // this.checked 可以得到当前复选框的选中状态 如果是true 就是选中 如果是false 就是未选中
                j_tbs[i].checked = this.checked;
            }   
        }
        // 下面是复选框需全部选中 上面全选才能选中做法
        for(var i = 0; i<j_tbs.length; i++){
            j_tbs[i].onclick = function() {
                // flag 控制全选按钮是否选中
                var flag =true;
                // 每次点击下面的复选框都要循环检查4个小按钮是否全被选中
                for(var i = 0 ; i<j_tbs.length; i++){
                    if(!j_tbs[i].checked){
                        flag=false;
                        break;//退出for循环 这样可以提高执行效率 因为只要有一个没有选中 剩下的就无需
                    }
                }
                j_cbAll.checked = flag;
            }
        }

    </script>
</body>

4、tab栏切换制作

案例分析:

  • Tab栏切换有2个大的模块
  • 上面是模块选项卡,点击某一个,当前这一个底色为红色,其余不变(排他思想)修改类名的方式
  • 下面的模块内容会跟随上面的选项卡变化 所有下面模块变化要写到点击事件里面
  • 规律:下面的模块显示内容和上面的选项卡一一对应,相匹配
  • 核心思路:给上面的tab_list里面的所有li添加自定义属性,属性值从0开始编号
  • 当我们点击tab_list里面的某个li,让tab_con里面对应序号的内容显示,其余隐藏(排他思想)
<head>
    <style>
        *{
            margin: 0;
            padding: 0;
        }

        .tab {
            width: 800px;
            height: 300px;
            margin: 100px auto;
        }

        li {
            list-style-type: none;
            border-right: 1px solid #c0bcbc;
        }

        .tab_list{
            height: 40px;
            background-color: #dfdfdf;
        }

        .tab_list li{
            float: left;
            height: 39px;
            line-height: 39px;
            padding: 0 20px;
            text-align: center;
            cursor: pointer;
        }
        
        .tab_list .current {
            background-color: #c81623;
            color: #fff;
        }

        .item {
            display: none;
        }
    </style>
</head>
<body>
    <div class="tab">
        <div class="tab_list">
            <ul>
                <li class="current">商品介绍</li>
                <li>规格与包装</li>
                <li>售后保障</li>
                <li>商品评价(50000)</li>
                <li>手机社区</li>
            </ul>
        </div>
        <div class="tab_con">
            <div class="item" style="display:block;">商品介绍模块内容</div>
            <div class="item">规格与包装模块内容</div>
            <div class="item">售后保障模块内容</div>
            <div class="item">商品评价(50000)模块内容</div>
            <div class="item">手机社区模块内容</div>
        </div>
    </div>
    <script>
        // 获取元素
        var tab_list = document.querySelector('.tab_list');
        var lis = tab_list.querySelectorAll('li');
        var items = document.querySelectorAll('.item');
        // for循环绑定点击事件
        for(var i = 0; i < lis.length; i++){
            // 开始给5个li设置索引号
            lis[i].setAttribute('index',i);
            lis[i].onclick = function(){
                // 1.上面是模块选项卡,点击某一个,当前这一个底色为红色,其余不变(排他思想)修改类名的方式
                // 将所有的li的class这个类都清除掉
                for(var i = 0; i < lis.length; i++){
                    lis[i].className = '';
                }
                // 给当前点击的li设置class类
                this.className = 'current';
                // 2.下面的显示内容模块
                var index = this.getAttribute('index');
                for(var i = 0; i < items.length; i++) {
                    items[i].style.display = 'none';
                }
                // 给当前点击的item显示出来
                items[index].style.display = 'block';
            }
        }
    </script>
</body>
</html>

5、动态生成表格

案例分析:

  • 因为里面的学生数据都是动态的,我们需要js动态生成,这里我们使用模拟数据,自己定义好数据,数据采用对象形式存储
  • 所有的数据都是放到tbody里面的行里面
  • 因为行很多,所以需要循环创建多个行(对应多少人)通过数组的长度得到
  • 每个行里面又有很多单元格(对应里面的数据),我们还继续使用循环创建多个单元格,并且把数据存入里面(双层for循环)
  • 最后一列单元格是删除,需要单独创建单元格
<head>
    <style>
      * {
        padding: 0;
        margin: 0;
      }

      table {
        width: 500px;
        margin: 100px auto;
        border-collapse: collapse;
        text-align: center;
      }

      th,
      td {
        border: 1px solid #333;
      }

      thead tr {
        height: 40px;
        background-color: #ccc;
      }
    </style>
  </head>
  <body>
    <table>
      <thead>
        <tr>
          <th>姓名</th>
          <th>科目</th>
          <th>成绩</th>
          <th>操作</th>
        </tr>
      </thead>
      <tbody></tbody>
    </table>
    <script>
      // 1.先准备好学生的数据
      var datas = [
        {
          name: "小明",
          subject: "javascript",
          score: 100,
        },
        {
          name: "小红",
          subject: "javascript",
          score: 98,
        },
        {
          name: "小黄",
          subject: "javascript",
          score: 88,
        }
      ];
      // 2.在tbody创建行 有几个人就创建几行(通过数组的长度)
      var tbody = document.querySelector("tbody");
      //   外层for循环 行 tr
      for (var i = 0; i < datas.length; i++) {
        //   创建tr行
        var tr = document.createElement("tr");
        tbody.appendChild(tr);
        // 行里面创建单元格 td (跟数据有关系的3个单元格)单元格的数量取决于每个对象里面的属性个数 for循环遍历对象 datas[i]
        for (var k in datas[i]) {
          //内循环 列 td
          // 创建单元格
          var td = document.createElement("td");
          //   把对象里面的属性值 data[i][k]给 td
          td.innerHTML = datas[i][k];
          tr.appendChild(td);
        }
        // 创建有删除两个字的单元格
        var td = document.createElement("td");
        td.innerHTML = '<a href="javascript:;">删除</a>';
        tr.appendChild(td);
      }
      //   4.删除操作
      var as = document.querySelectorAll("a");
      for (var i = 0; i < as.length; i++) {
        as[i].onclick = function () {
          // 点击a 删除 当前a 所在的行(链接的爸爸的爸爸)  node.removeChild(child)
          tbody.removeChild(this.parentNode.parentNode);
        }
      }
      // for(var k in obj) {
      //     k 得到的是属性名
      //     obj[k] 得到是属性值
      // }
    </script>
  </body>
</html>

6、跟随鼠标的天使

案例分析

  • 鼠标不断的移动,使用鼠标移动事件:mousemove
  • 在页面中移动,给document注册事件
  • 图片要移动距离,而且不占位置,我们要使用绝对定位
  • 核心原理:每次鼠标移动,我们都会获得最新的鼠标坐标,把这个x和y坐标作为图片的top和left值就可以移动图片
<head>
    <style>
      img {
        position: absolute;
      }
    </style>
  </head>
  <body>
    <img src="../image/angel.gif" alt="" />
    <script>
      var pic = document.querySelector("img");
      document.addEventListener("mousemove", function (e) {
        // 1.mousemove只要鼠标移动1px 就会触发这个事件
        var x = e.pageX;
        var y = e.pageY;
        // 2.不要忘记给left和top添加px单位 -50和-40是图片的高度和宽度的一半
        pic.style.left = x - 50 + "px";
        pic.style.top = y - 40 + "px";
      });
    </script>
  </body>

7、模拟京东按键输入内容案例

  • 核心思路:检测用户是否按下了s键,如果按下了s键,就把光标定位到搜索框里面
  • 使用键盘事件对象的属性keyCode 判断用户按下的是否是s键
  • 搜索框获得焦点:使用js里面的focus()方法
  <body>
    <input type="text" />
    <script>
      var search = document.querySelector("input");
      document.addEventListener("keyup", function (e) {
        // console.log(e.keyCode);  用来查询s键的ASCII码值 s键为83
        if (e.keyCode === 83) {
          search.focus();
        }
      });
    </script>
  </body>

8、模拟京东快递单号查询

  • 快递单号输入内容时 上面的大号字体盒子(con)显示(这里面的字号更大)
  • 表单检查用户输入:给表单添加键盘事件
  • 同时把快递单号里面的值(value)获取过来赋值给con盒子(innerText)作为内容
  • 如果快递单号里面内容为空,则隐藏大号字体盒子(con)
  • 当文本框失去焦点 就隐藏con盒子 当文本框获得焦点 就显示con盒子

注意:

  • keydown和keypress在文本框里面的特点:他们两个事件触发的时候,文字还没有落入文本框中;
  • keyup事件触发的时候,文字已经落入文本框里面了
  <head>
    <style>
      * {
        padding: 0;
        margin: 0;
      }
      .search {
        position: relative;
        width: 178px;
        margin: 100px;
      }
      .con {
        display: none;
        position: absolute;
        top: -40px;
        width: 171px;
        border: 1px solid rgba(0, 0, 0, 0.2);
        box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
        padding: 5px 0;
        font-size: 18px;
        line-height: 20px;
        color: #333;
      }
      /* 小三角形的做法 */
      .con::before {
        content: "";
        width: 0;
        height: 0;
        position: absolute;
        top: 28px;
        left: 18px;
        border: 8px solid #000;
        border-style: solid dashed dashed;
        border-color: #fff transparent transparent;
      }
    </style>
  </head>
  <body>
    <div class="search">
      <div class="con">123</div>
      <input type="text" placeholder="请输入您的快递单号" class="jd" />
    </div>
    <script>
      var con = document.querySelector(".con");
      var jd_input = document.querySelector(".jd");
      jd_input.addEventListener("keyup", function () {
        if (this.value == "") {
          con.style.display = "none";
        } else {
          com.style.display = "block";
          con.innerHTML = this.value;
        }
      });
      // 当我们失去焦点 就隐藏con盒子
      jd_input.addEventListener("blur", function () {
        con.style.display = "none";
      });
      // 当我们获得焦点 就显示con盒子
      jd_input.addEventListener("focus", function () {
        if (this.value != "") {
          con.style.display = "block";
        }
      });
    </script>
  </body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值