JavaScript--DOM案例(一)

一、案例:分时显示不同图片,显示不同问候语

  • 根据不同时间,页面显示不同图片,同时显示不同的问候语。

  • 如果上午时间打开页面,显示上午好,显示上午的图片。

  • 如果下午时间打开页面,显示下午好,显示下午的图片。

  • 如果晚上时间打开页面,显示晚上好,显示晚上的图片。

    案例分析:

  • 根据系统不同时间来判断,所以需要用到日期内置对象

  • 利用多分支语句来设置不同的图片

  • 需要一个图片,并且根据时间修改图片,就需要用到操作元素src属性

  • 需要一个div元素,显示不同问候语,修改元素内容即可

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      <style>
          img {
              width: 300px;
          }
      </style>
    </head>
    <body>
      <img src="images/s.gif" alt="">
      <div>上午好</div>
      <script>
          // 根据系统不同时间来判断,所以需要用到日期内置对象
          // 利用多分支语句来设置不同的图片
          // 需要一个图片,并且根据时间修改图片,就需要用到操作元素src属性
          // 需要一个div元素,显示不同问候语,修改元素内容即可
          // 1.获取元素
          var img = document.querySelector('img');
          var div = document.querySelector('div');
          // 2. 得到当前的小时数
          var date = new Date();
          var h = date.getHours();
          // 3. 判断小时数改变图片和文字信息
          if (h < 12) {
              img.src = 'images/s.gif';
              div.innerHTML = '亲,上午好,好好写代码';
          } else if (h < 18) {
              img.src = 'images/x.gif';
              div.innerHTML = '亲,下午好,好好写代码';
          } else {
              img.src = 'images/w.gif';
              div.innerHTML = '亲,晚上好,好好写代码';
          }
      </script>
    </body>
    

二、案例:仿京东显示密码

  • 点击按钮将密码框切换为文本框,并可以查看密码明文。

图片说明

案例分析:

  • 核心思路: 点击眼睛按钮,把密码框类型改为文本框就可以看见里面的密码

  • 一个按钮两个状态,点击一次,切换为文本框,继续点击一次切换为密码框

  • 算法:利用一个flag变量,来判断flag的值,如果是1 就切换为文本框,flag 设置为0,如果是0 就切换为密码框,flag设置为1

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      <style>
          .box {
              position: relative;
              width: 400px;
              border-bottom: 1px solid #ccc;
              margin: 100px auto;
          }
    
          .box input {
              width: 370px;
              height: 30px;
              border: 0;
              outline: none;
          }
    
          .box img {
              position: absolute;
              top: 2px;
              right: 2px;
              width: 24px;
          }
      </style>
    </head>
    <body>
      <div class="box">
          <label for="">
              <img src="images/close.png" alt="" id="eye">
          </label>
          <input type="password" name="" id="pwd">
      </div>
      <script>
          // 1. 获取元素
          var eye = document.getElementById('eye');
          var pwd = document.getElementById('pwd');
          // 2. 注册事件 处理程序
          var flag = 0;
          eye.onclick = function() {
              // 点击一次之后, flag 一定要变化
              if (flag == 0) {
                  pwd.type = 'text';
                  eye.src = 'images/open.png';
                  flag = 1; // 赋值操作
              } else {
                  pwd.type = 'password';
                  eye.src = 'images/close.png';
                  flag = 0;
              }
    
          }
      </script>
    </body>
    </html>

    三、案例: 淘宝点击关闭二维码

  • 当鼠标点击二维码关闭按钮的时候,则关闭整个二维码。

图片说明

案例分析:

  • 核心思路: 利用样式的显示和隐藏完成, display:none 隐藏元素 display:block 显示元素

  • 点击按钮,就让这个二维码盒子隐藏起来即可

    <!DOCTYPE html>
    <html lang="en">
    <head>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <meta http-equiv="X-UA-Compatible" content="ie=edge">
     <title>Document</title>
     <style>
         .box {
             position: relative;
             width: 74px;
             height: 88px;
             border: 1px solid #ccc;
             margin: 100px auto;
             font-size: 12px;
             text-align: center;
             color: #f40;
             /* display: block; */
         }
    
         .box img {
             width: 60px;
             margin-top: 5px;
         }
    
         .close-btn {
             position: absolute;
             top: -1px;
             left: -16px;
             width: 14px;
             height: 14px;
             border: 1px solid #ccc;
             line-height: 14px;
             font-family: Arial, Helvetica, sans-serif;
             cursor: pointer;
         }
     </style>
    </head>
    <body>
     <div class="box">
         淘宝二维码
         <img src="images/tao.png" alt="">
         <i class="close-btn">×</i>
     </div>
     <script>
         // 1. 获取元素 
         var btn = document.querySelector('.close-btn');
         var box = document.querySelector('.box');
         // 2.注册事件 程序处理
         btn.onclick = function() {
             box.style.display = 'none';
         }
     </script>
    </body>
    </html>
    

四、案例:循环精灵图背景

  • 可以利用 for 循环设置一组元素的精灵图背景

图片说明

案例分析:

  • 首先精灵图图片排列有规律的

  • 核心思路: 利用for循环 修改精灵图片的 背景位置 background-position

  • 剩下的就是考验你的数学功底了让循环里面的 i 索引号 * 44 就是每个图片的y坐标

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      <style>
          * {
              margin: 0;
              padding: 0;
          }
    
          li {
              list-style-type: none;
          }
    
          .box {
              width: 250px;
              margin: 100px auto;
          }
    
          .box li {
              float: left;
              width: 24px;
              height: 24px;
              background-color: pink;
              margin: 15px;
              background: url(images/sprite.png) no-repeat;
          }
      </style>
    </head>
    <body>
      <div class="box">
          <ul>
              <li></li>
              <li></li>
              <li></li>
              <li></li>
              <li></li>
              <li></li>
              <li></li>
              <li></li>
              <li></li>
              <li></li>
              <li></li>
              <li></li>
          </ul>
      </div>
      <script>
          // 1. 获取元素 所有的小li 
          var lis = document.querySelectorAll('li');
          for (var i = 0; i < lis.length; i++) {
              // 让索引号 乘以 44 就是每个li 的背景y坐标  index就是我们的y坐标
              var index = i * 44;
              lis[i].style.backgroundPosition = '0 -' + index + 'px';
          }
      </script>
    </body>
    </html>
    

五、案例:显示隐藏文本框内容

  • 当鼠标点击文本框时,里面的默认文字隐藏,当鼠标离开文本框时,里面的文字显示。

图片说明

案例分析:

  • 首先表单需要2个新事件,获得焦点 onfocus 失去焦点 onblur

  • 如果获得焦点, 判断表单里面内容是否为默认文字,如果是默认文字,就清空表单内容

  • 如果失去焦点, 判断表单内容是否为空,如果为空,则表单内容改为默认文字

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      <style>
          input {
              color: #999;
          }
      </style>
    </head>
    <body>
      <input type="text" value="手机">
      <script>
          // 1.获取元素
          var text = document.querySelector('input');
          // 2.注册事件 获得焦点事件 onfocus 
          text.onfocus = function() {
                  // console.log('得到了焦点');
                  if (this.value === '手机') {
                      this.value = '';
                  }
                  // 获得焦点需要把文本框里面的文字颜色变黑
                  this.style.color = '#333';
              }
              // 3. 注册事件 失去焦点事件 onblur
          text.onblur = function() {
              // console.log('失去了焦点');
              if (this.value === '') {
                  this.value = '手机';
              }
              // 失去焦点需要把文本框里面的文字颜色变浅色
              this.style.color = '#999';
          }
      </script>
    </body>
    </html>

    六、案例: 密码框格式提示错误信息

  • 用户如果离开密码框,里面输入个数不是6~16,则提示错误信息,否则提示输入正确信息

图片说明

案例分析:

  • 首先判断的事件是表单失去焦点 onblur

  • 如果输入正确则提示正确的信息颜色为绿色小图标变化

  • 如果输入不是6到16位,则提示错误信息颜色为红色 小图标变化

  • 因为里面变化样式较多,我们采取className修改样式

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      <style>
          div {
              width: 600px;
              margin: 100px auto;
          }
    
          .message {
              display: inline-block;
              font-size: 12px;
              color: #999;
              background: url(images/mess.png) no-repeat left center;
              padding-left: 20px;
          }
    
          .wrong {
              color: red;
              background-image: url(images/wrong.png);
          }
    
          .right {
              color: green;
              background-image: url(images/right.png);
          }
      </style>
    </head>
    <body>
      <div>
          <input type="password" class="ipt">
          <p class="message ">请输入6~16位密码</p>
      </div>
      <script>
          //用户如果离开密码框,里面输入个数不是6~16,则提示错误信息,否则提示输入正确信息
          // 首先判断的事件是表单失去焦点 onblur
          // 如果输入正确则提示正确的信息颜色为绿色小图标变化
          // 如果输入不是6到16位, 则提示错误信息颜色为红色 小图标变化
          // 因为里面变化样式较多, 我们采取className修改样式
          var ipt = document.querySelector('.ipt');
          var message = document.querySelector('.message');
          ipt.onblur = function() {
              if (this.value.length < 6 || this.value.length > 16) {
                  message.className = 'message wrong';
                  message.innerHTML = '您输入的位数不对!请输入6~16位密码';
              } else {
                  message.className = 'message right';
                  message.innerHTML = '您输入的正确!';
              }
          }
      </script>
    </body>
    </html>

    七、案例:百度换肤

    案例分析:

  • 这个案例练习的是给一组元素注册事件

  • 给4个小图片利用循环注册点击事件当我们点击了这个图片,让我们页面背景改为当前的图片

  • 核心算法: 把当前图片的src 路径取过来,给 body 做为背景即可

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      <style>
          * {
              margin: 0;
              padding: 0;
          }
    
          body {
              background: url(images/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>
      <ul class="baidu">
          <li><img src="images/1.jpg"></li>
          <li><img src="images/2.jpg"></li>
          <li><img src="images/3.jpg"></li>
          <li><img src="images/4.jpg"></li>
      </ul>
      <script>
          // 1. 获取元素 
          var imgs = document.querySelector('.baidu').querySelectorAll('img');
          // console.log(imgs);
          // 2. 循环注册事件 
          for (var i = 0; i < imgs.length; i++) {
              imgs[i].onclick = function() {
                  // this.src 就是我们点击图片的路径   images/2.jpg
                  // console.log(this.src);
                  // 把这个路径 this.src 给body 就可以了
                  document.body.style.backgroundImage = 'url(' + this.src + ')';
              }
          }
      </script>
    </body>
    </html>

    八、案例:表格隔行变色

    图片说明

    案例分析:

  • 用到新的鼠标事件 鼠标经过 onmouseover 鼠标离开 onmouseout

  • 核心思路:鼠标经过 tr 行,当前的行变背景颜色, 鼠标离开去掉当前的背景颜色

  • 注意: 第一行(thead里面的行)不需要变换颜色,因此我们获取的是 tbody 里面的行

    javascript
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      <style>
          table {
              width: 800px;
              margin: 100px auto;
              text-align: center;
              border-collapse: collapse;
              font-size: 14px;
          }
    
          thead tr {
              height: 30px;
              background-color: skyblue;
          }
    
          tbody tr {
              height: 30px;
          }
    
          tbody td {
              border-bottom: 1px solid #d7d7d7;
              font-size: 12px;
              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>
              <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() {
                      // console.log(11);
                      this.className = 'bg';
                  }
                  // 4. 鼠标离开事件 onmouseout
              trs[i].onmouseout = function() {
                  this.className = '';
              }
          }
      </script>
    </body>
    </html>

    九、案例:表单全选取消全选案例

    业务需求:

  • 点击上面全选复选框,下面所有的复选框都选中(全选)

  • 再次点击全选复选框,下面所有的复选框都不中选(取消全选)

  • 如果下面复选框全部选中,上面全选按钮就自动选中

  • 如果下面复选框有一个没有选中,上面全选按钮就不选中所有复选框一开始默认都没选中状态

图片说明

案例分析:

  • 全选和取消全选做法: 让下面所有复选框的checked属性(选中状态) 跟随 全选按钮即可

  • 下面复选框需要全部选中, 上面全选才能选中做法: 给下面所有复选框绑定点击事件,每次点击,都要循环查看下面所有的复选框是否有没选中的,如果有一个没选中的, 上面全选就不选中。

  • 可以设置一个变量,来控制全选是否选中

    javascript
    <!DOCTYPE html>
    <html>
    <head lang="en">
      <meta charset="UTF-8">
      <title></title>
      <style>
          * {
              padding: 0;
              margin: 0;
          }
    
          .wrap {
              width: 300px;
              margin: 100px auto 0;
          }
    
          table {
              border-collapse: collapse;
              border-spacing: 0;
              border: 1px solid #c0c0c0;
              width: 300px;
          }
    
          th,
          td {
              border: 1px solid #d0d0d0;
              color: #404060;
              padding: 10px;
          }
    
          th {
              background-color: #09c;
              font: bold 16px "微软雅黑";
              color: #fff;
          }
    
          td {
              font: 14px "微软雅黑";
          }
    
          tbody tr {
              background-color: #f0f0f0;
          }
    
          tbody tr:hover {
              cursor: pointer;
              background-color: #fafafa;
          }
      </style>
    </head>
    <body>
      <div class="wrap">
          <table>
              <thead>
                  <tr>
                      <th>
                          <input type="checkbox" id="j_cbAll" />
                      </th>
                      <th>商品</th>
                      <th>价钱</th>
                  </tr>
              </thead>
              <tbody id="j_tb">
                  <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>
      </div>
      <script>
          //        1. 全选和取消全选做法: 让下面所有复选框的checked属性( 选中状态) 跟随 全选按钮即可
          // 获取元素
          var j_cbAll = document.getElementById('j_cbAll'); // 全选按钮
          var j_tbs = document.getElementById('j_tb').getElementsByTagName('input'); // 下面所有的复选框
          // 注册事件
          j_cbAll.onclick = function() {
                  // this.checked 它可以得到当前复选框的选中状态如果是true 就是选中,如果是false 就是未选中
                  console.log(this.checked);
                  for (var i = 0; i < j_tbs.length; i++) {
                      j_tbs[i].checked = this.checked;
                  }
              }
              // 2. 下面复选框需要全部选中, 上面全选才能选中做法: 给下面所有复选框绑定点击事件,每次点击,都要循环查看下面所有的复选框是否有没选中的,如果有一个没选中的, 上面全选就不选中。
          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>
    </html>
#前端##前端工程师##JavaScript#
前端基础开发 文章被收录于专栏

前端基础知识点

全部评论

相关推荐

测试糕手手:社会第一课,随便吹牛逼,直接说四个月,别老实。老实人只会被欺负
点赞 评论 收藏
分享
06-11 17:39
门头沟学院 Java
小呆呆的大鼻涕:卧槽,用户彻底怒了
点赞 评论 收藏
分享
评论
3
26
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务