复习js基础+web Apls案例

173 阅读1分钟

复习js基础

01-动态生成商品信息

效果

image-20220410090501986

用到的技术

  • 弹出的输入框 prompt
  • 网页中输出字符串标签 document.write
  • 用到了反引号中输出变量的 ${num}
  • 简单的html+css (表格)

思路

image-20220410090624065

最终代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>01-动态生成商品信息.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
      table {
        width: 600px;
        margin: 50px auto;
        border-collapse: collapse;
        text-align: center;
      }
    </style>
  </head>
  <body>
    <script>
      /* 
      需求:
      1 弹出了四个输入框  
      2 最终就在页面上 显示出来了表格 
       */

      let phone = prompt('请输入商品的名称');
      let price = prompt('请输入商品的单价');
      let num = prompt('请输入商品的数量');
      let totalPrice = price * num; // 自己根据输入的单价和数量去计算总价
      let address = prompt('请输入收货地址');

      // 把标签字符串也输入出到网页中
      // 使用单双引号 写字符串不能换行 所以建议生成标签的字符串 要使用反引号
      // 反引号里面  想要使用 外面的变量 语法 ${变量名称}

      document.write(`
      <table border="1">
      <thead>
        <tr>
          <th>商品名称</th>
          <th>商品价格</th>
          <th>商品数量</th>
          <th>总价</th>
          <th>收货地址</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>${phone}</td>
          <td>${price}元</td>
          <td>${num}</td>
          <td>${price * num}元</td>
          <td>${address}</td>
        </tr>
      </tbody>
    </table>
      `);
    </script>
  </body>
</html>

02-时间补0案例

需求

  • 弹出输入框 允许用户输入时间 11 或者 9
  • 接收到这个时间后,做判断
    • 如果 时间 大于 10 原样输出
    • 如果 时间 小于 0 补0 之后再输出 (数字格式 前面补0 没有意义)

代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>02-时间补0案例.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <script>
      /* 
      1 弹出输入框  允许用户输入时间  11 或者 9 
      2 接收到这个时间后,做判断
        如果 时间 大于 10 原样输出
        如果 时间 小于 0  补0 之后再输出  (数字格式 前面补0 没有意义)
       */

      let time = prompt('请输入时间');
      if (time < 10) {
        time = '0' + time;
      }
      console.log(time);
    </script>
  </body>
</html>

03-代码调试

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>24-动态生成柱状图-获取用户输入的高度</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
      ul {
        list-style: none;
        width: 1000px;
        height: 600px;
        margin: 100px auto;
        display: flex;
        justify-content: space-around;
        background-color: aqua;

        align-items: flex-end;
      }
      li {
        width: 100px;
        background-color: pink;
        position: relative;
      }
      span {
        position: absolute;
        top: -30px;
        left: 50%;
        transform: translateX(-50%);
      }
      div {
        position: absolute;
        width: 100%;
        text-align: center;
        /* 相对于父元素的高 */
        top: 100%;
        background-color: red;
      }
    </style>
  </head>
  <body>
    <script>
   
      let liHtml = `<ul>`;
      let liHeight = [];

      for (let index = 0; index < 4; index++) {
        let height = +prompt(`请输入你想要的第${index + 1}个高度数据`);

        // 把数据 添加到数组中
        liHeight.push(height);
      }

      for (let index = 0; index < 4; index++) {
        liHtml += `
        <li style="height:${liHeight[index]}px;"> 
          <span>${liHeight[index]}</span>
           <div>第${index + 1}季度</div>
            </li>`;
      }
      liHtml += `</ul>`;
      document.write(liHtml);
    </script>
  </body>
</html>

04-while循环计算总和和偶数和

循环的三要素

  • 初始值
  • 判断条件
  • 初始化变化
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>04-while-1-100总和.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <script>
      /* 
      需求: 1-100 的和 

      分析:
      1 1-100 数字 刚好可以是我们的循环 1-2-3-4-100
      2 根据while的语法 写出循环的条件即可  
        定义一个变量 index=1; 如果index <=100的话 继续循环 否则就不循环 循环中 index++

        循环的三要素
        1 初始值
        2 判断条件
        3 初始化变化 
       */

      // let index = 1;
      // //  菜篮子一样
      // // 循环一次,就把这一次的鸡蛋装到 篮子中
      // let sum = 0;
      // while (index <= 100) {
      //   //  继续装鸡蛋
      //   sum = sum + index;
      //   index++;
      // }

      // console.log(sum);

      let index = 1;
      //  菜篮子一样
      // 循环一次,先判断这次的鸡蛋是不是偶数,就把这一次的鸡蛋装到 篮子中
      let sum = 0;
      while (index <= 100) {
        // 判断这次鸡蛋是不是偶数
        if (index % 2 === 0) {
          // 偶数
          //  继续装鸡蛋
          sum = sum + index;
        }
        
        index++;
      }

      console.log(sum);
    </script>
  </body>
</html>

05-while-说爱我案例

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>11-while-说爱我案例.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <script>
      /* 
      需求:
      1 一直在弹输入框
      2 无论我们输入什么 都继续弹窗
      3 直到我们输入了 爱 才结束 

      4 分析
        一直弹窗  循环  三要素
        1 初始值
        2 循环条件 用户的输入 字  "爱"
        3 初始值变化 
       */

      //  let answer=prompt("你爱不爱我");一直弹窗
      let answer;
      while (answer !== '爱') {
        answer = prompt('你爱不爱我');
      }
    </script>
  </body>
</html>

06-ATM

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>6-ATM.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <script>
      /* 
      需求分析:
      1 一直在弹出窗口 (要使用循环把弹窗装进去)
      2 循环三要素
        1 起始值 
        2 循环的条件 如果用户的输入不是4 就继续弹窗
        3 起始值 发生变化
      3 代码比较多 容易忽略 隐式转换 


        1 存款 
            弹出一个输入框 允许用户的一个输入 存款的金额
         2 取款
            弹出一个输入框 允许用户的一个输入 取款的金额    
         3 查看余额
            输入出金额即可 
         4 退出
        
       */

      let input; // 用户输入输入框的数字
      let money = 0;// undefined+=1

      while (input !== 4) {
        // "4" !== 4
        input = +prompt(`
         1 存款 
         2 取款
         3 查看余额
         4 退出
         `);
        //  根据不同的输入 执行不同的结果
        if (input === 1) {
          let num = +prompt("请输入存款的金额");
          money+=num;
          alert(money);
        } else if (input === 2) {
    
          let num = +prompt("请输入取款的金额");
          money-=num;
          alert(money);
        } else if (input === 3) {
          alert(money);
        }
      }
    </script>
  </body>
</html>

07-for-1-100偶数和

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>07-for-1-100偶数和.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <script>
      /* 
      熟悉 for循环的语法 

      for(初始值;循环条件;初始值变化){
        // 满足条件了 执行里面的代码
      }

       */

      let sum = 0; // 给初始值为0 否则就是undefined
      for (let index = 1; index <= 100; index++) {
        //  要偶数和
        if (index % 2 === 0) {
          sum += index; // 偶数和
        }
      }

      console.log(sum);
    </script>
  </body>
</html>

08-N天背M个单词

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>08-N天背M个单词.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <script>
      /* 
      如果发现要使用到  两层循环 
      分析 循环分别是干什么 
      
      N天背M个单词   
      1 两个变量 =>  弹输入框来进行输入
      2 分析N天 和 M个单词联系 
        根据N的大小来循环N次 输出 第,。。天
        根据M的大小来循环M次,输出 记住。。个单词
       */

      let n = +prompt('请输入天数');
      let m = +prompt('请输入要背单词的个数');

      for (let index = 1; index <= n; index++) {
        document.write(`第${index}天`);
        // 换行
        document.write('<br/>');

        // 把背单词的动作 放到每一天中都来执行
        for (let index = 1; index <= m; index++) {
          document.write(`记住第个${index}单词`);
          // 换行
          document.write('<br/>');
        }
      }
    </script>
  </body>
</html>

09-数组-求和

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>09-数组-求和</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <script>
      /* 
      数组的基本使用 
      1 语法  let arr =[元素1,元素2,元素3]; 希望类型统一 
      2 想要访问数组中的元素 可以下标来访问,下标的开始 是 从0 开始
         arr[0]   元素 1 
         arr[1]   元素 2 
         arr[2]   元素 3
         arr[3]  3 超出下标的范围了 输出 undefined

         arr[  arr.length ]  超出下标的范围了 输出 undefined
         arr[  arr.length -1 ] 获取最后一个元素 

      3 数组 经常和循环搭配来使用
       */

      //  数组求和
      let arr = [1, 2, 3, 4];
      // 数组里面所有的元素 加起来 一共是多少
      // arr[0]+arr[1]+arr[2]+arr[3]

      // 变量 总和
      let sum = 0;
      for (let index = 0; index < arr.length; index++) {
        sum += arr[index];
      }
      console.log(sum);
    </script>
  </body>
</html>

10-数组求最大值和最小值

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>10-数组-最大值和最小值.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <script>
      /*
      数组求最大值 分析

      1 数组  arr =[ 3,5,88,2]
      2 先定一个额外变量 存放 最大值 max = arr[0]  假设最大值 是 数组中的第0个元素
      3 思路 拿 max 和 数组其他元素比较,
        如果发现 数组其他元素比max大,让 max = 当前数组元素

       */

      let arr = [3, 5, 88, 2];
      let max = arr[0];
      for (let index = 0; index < arr.length; index++) {
        if (arr[index] > max) {
          max = arr[index];
        }
      }

      let min = arr[0]; // 如果你比我小 我就等于你
      for (let index = 0; index < arr.length; index++) {
        if (arr[index] < min) {
          min = arr[index];
        }
      }

      // console.log(max);
      console.log(min);
    </script>
  </body>
</html>

11-动态生成柱子

image-20220410145223817

思路

  1. 先写好静态结构

    image-20220410145309212

  2. 通过循环来接收用户的输入,存放起来 变成一个数组(存放的柱子的高)

  3. 通过 遍历上一个数组,动态的生成li标签以及它对应的子元素(p,div 第几季度的数据)

代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>11-动态生成柱子.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
      ul {
        list-style: none;
        width: 800px;
        height: 600px;
        background-color: aqua;
        margin: 50px auto;
        display: flex;
        align-items: flex-end;
        justify-content: space-around;
      }
      li {
        width: 80px;
        /* height: 300px; */
        background-color: pink;
        position: relative;
      }
      p {
        /* position: absolute; */
        /* 块级元素加上定位的之后 宽度变成内容撑开 */
        /* width: 100%; */

        /* p标签往上移动自身的高度 */
        /* translate的百分比是相对于自身的宽度和高度 */
        transform: translateY(-100%);
        text-align: center;
      }
      div {
        text-align: center;
        position: absolute;
        width: 100%;
        left: 0;
        top: 100%;
      }
    </style>
  </head>
  <body>
    <script>
      // 1 定义一个数组 存放四个元素 代表这四个柱子的高度
      // let arrHeight = [150, 250, 350, 450];
      let arrHeight = [];

      // 循环了 接收用户的四次输入
      for (let index = 0; index < 4; index++) {
        arrHeight.push(prompt(`请输入第${index + 1}个柱子的高度`)); // 给数组添加一个元素
      }

      // 2 遍历生成4个柱子(document.write)
      // 拼接ul的头
      let html = ` <ul> `;
      for (let index = 0; index < arrHeight.length; index++) {
        // 遍历生成li标签
        // 动态设置li标签的高度  =  行内
        html += ` <li style="height:${arrHeight[index]}px" >
          <p>${arrHeight[index]}</p>
          <div>第${index + 1}季度</div>
          </li> `;
      }

      // 拼接ul的结尾
      html += `</ul> `;

      document.write(html);
    </script>
  </body>
</html>

12-随机显示将军的姓名

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>12-随机显示将军的姓名.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <script>
      /* 
      需求
      页面一刷新了 显示出来 某一位将军的名称 (随机)

      分析:
      1 定义一个将军数组 
      2 根据数组的长度 来生成一个随机数 (区间  0 - 数组长度-1 )
        Math.random()  返回 0-0.999 随机数 包含 0  不包含1 
       */

      let names = [
        '赵云',
        '黄忠',
        '关羽',
        '张飞',
        '马超',
        '刘备',
        '曹操',
        '刘婵',
      ];
      // let names = [ '赵云', '黄忠', '关羽' ]; //  0  1 2

      // 生成随机数 随机整数
      // Math.random()    0 ~ 1  小数
      // Math.random() * 2   0 ~  2  小数
      // Math.round(  Math.random() * 2 ) 四舍五入
      let index = Math.round(Math.random() * (names.length - 1));

      document.write(names[index]);
    </script>
  </body>
</html>

14-随机显示图片

注意图片地址是 01 - 22 ,数字格式不能写 01 ,因此要转成字符串处理

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>14-随机显示图片.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <img src="" alt="" />
    <script>
      /* 
      需求:
      页面一刷新 随机显示一张图片
      
      分析:
      1 图片显示
      2 设置图片的src属性
      3 src图片地址 不能写死 要随机  01-22   1-22
        1 先算出来 1-22 随机整数 
          Math.round(Math.random()*(max-min)+min)
       */
      let img = document.querySelector('img');
      // img.src = './images/01.jpg';
      // img.src = './images/01.jpg';

      let index = Math.round(Math.random() * (22 - 1) + 1);
      // 和10 判断 补0 处理
      index = index < 10 ? '0' + index : index;

      img.src = `./images/${index}.jpg`;
    </script>
  </body>
</html>

15-随机演示颜色

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>15-随机演示颜色.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <script>
      /* 
      分析:
      如何让随机数和颜色产生关联  颜色 格式 rgb(0-255,0-255,0-255)
        Math.round(Math.random()*(255-0)+0)
       */

      setInterval(function () {
        let color1 = Math.round(Math.random() * 255);
        let color2 = Math.round(Math.random() * 255);
        let color3 = Math.round(Math.random() * 255);

        document.body.style.backgroundColor = `rgb(${color1},${color2},${color3})`; // 写死一个颜色看有没有效果
      }, 100);
    </script>
  </body>
</html>

16-随机显示图片-背景图

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>16-随机显示图片-背景图</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <script>
      let index = Math.round(Math.random() * (22 - 1) + 1);
      // 和10 判断 补0 处理
      index = index < 10 ? '0' + index : index;
      document.body.style.backgroundImage = `url(http://md.zbztb.cn/uploads/321626843354/${index}.jpg)`;
      document.body.style.backgroundRepeat = 'no-repeat';
    </script>
  </body>
</html>

17-函数的补充说明

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>17-函数.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <script>
      /* 
      函数
      1 作用   
        1 封装代码 达到同样功能代码 复用 
        2 拆分程序 让我们的代码 更加具备阅读性 方便后期程序的维护 

      2 语法 
        1 声明函数 
          1 function 函数名称() {}
          2 let 函数名称  = function(){}
        2 使用函数
          函数名称(); // 调用

        3 可以传递参数 

        4 返回值 
          一些工具的函数 希望可以把处理后的结果 返回给调用该函数的人 让这个人自己来决定如何处理返回结果
       */

      // function show() {
      //   //  打印一下 你好
      //   console.log('你好');
      // }
      // let show = function(){
      //   console.log("你也好");
      // }

      // show();
      // show();
      // show();
      // show();
      // show();

      // msg 形式上的参数 => 形参 的名字 可以自定义的 语义
      // function show(msg) {
      //   console.log(msg); // msg = 什么值 我就输出什么
      // }

      // show("你好");
      // show("你也好");

      // 返回一定区间的随机整数
      function getRandom(max, min) {
        return Math.round(Math.random() * (max - min) + min);
      }

      // 只要想获取一下随机数
      let random1 = getRandom(10, 1);
      let random2 = getRandom(100, 50);

      // 计算两个随机数的和
      let sum1 = random1 + random2;
      let sum2 = random1 - random2;

      console.log(sum1);
      console.log(sum2);
    </script>
  </body>
</html>

复习-数组-for-动态拼接html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>18-商品全选-用到技术.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <!-- <ul></ul> -->

    <table>
      <thead>
        <tr>
          <th><input type="checkbox" id="" /> 全选</th>
          <th>商品名称</th>
          <th>商家</th>
          <th>价格</th>
        </tr>
      </thead>
      <tbody></tbody>
    </table>

    <script>
      // let ul = document.querySelector('ul');

      // 1 数组
      // let arr = [
      //   { name: '小米手机', Business: '小米', price: 1999 },
      //   { name: '小米净水器', Business: '小米', price: 4999 },
      //   { name: '小米电视', Business: '小米', price: 5999 },
      // ];

      // 2 循环
      // let html = ``;
      // for (let index = 0; index < arr.length; index++) {
      //   html += `
      //   <li>
      //   商品名称:${arr[index].name}  商品商家:${arr[index].Business}  价格: ${arr[index].price}
      // </li>
      //   `;
      // }

      // 3 把生成的li标签插入到ul中
      // ul.innerHTML = html;

      /* === 拼接成 表格 */
      let tbody = document.querySelector('tbody');
      let arr = [
        { name: '小米手机', Business: '小米', price: 1999 },
        { name: '小米净水器', Business: '小米', price: 4999 },
        { name: '小米电视', Business: '小米', price: 5999 },
      ];
      let html = ``;
      for (let index = 0; index < arr.length; index++) {
        html += `
          <tr>
          <td><input type="checkbox"  id=""></td>
          <td>${arr[index].name}</td>
          <td>${arr[index].Business}</td>
          <td>${arr[index].price}</td>
        </tr>
`;
      }
      // console.log(html);

      tbody.innerHTML = html;
    </script>
  </body>
</html>

商品全选-点击时间-checked

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>19-商品全选-点击时间-checked.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <ul>
      <li>
        <input type="checkbox" class="chk" />
      </li>
      <li>
        <input type="checkbox" class="chk" />
      </li>
      <li>
        <input type="checkbox" class="chk" />
      </li>
    </ul>
    <button id="btnAll">设置全选</button>
    <button id="btnUnAll">取消选中</button>
    <h2>判断商品是否都选中</h2>
    <input type="checkbox" id="allChk" /> 商品都勾选上了
    <script>
      let btnAll = document.querySelector('#btnAll');
      let btnUnAll = document.querySelector('#btnUnAll');
      let allChk = document.querySelector('#allChk');
      // 获取复选框数组
      let chkList = document.querySelectorAll('.chk');
      // 点击 按钮的设置全选
      btnAll.addEventListener('click', function () {
        // 获取第一个 复选框
        // let chk = document.querySelector('.chk');
        // 设置复选框 选中
        // chk.checked = true;
        for (let index = 0; index < chkList.length; index++) {
          chkList[index].checked = true;
        }
      });

      // 取消选中
      btnUnAll.addEventListener('click', function () {
        for (let index = 0; index < chkList.length; index++) {
          chkList[index].checked = false;
        }
      });

      // 遍历商品的复选框  绑定点击事件
      // 判断商品是否要全选的条件是 额外定义一个变量 存放勾选了的商品的数量
      // 勾选了的商品的数量 和 商品总数量 比较 相等 == 可以设置全选

      for (let index = 0; index < chkList.length; index++) {
        chkList[index].addEventListener('click', function () {
          let checkedNums = 0;
          //  遍历所有的复选框  判断他们的选中状态 =  true 设置 checkedNums++
          // 循环结束后 再去判断 勾选了的商品的数量 和 商品总数量
          for (let index2 = 0; index2 < chkList.length; index2++) {
            if (chkList[index2].checked) {
              // 选中
              checkedNums++;
            }
          }

          // 循环结束后 再去判断 勾选了的商品的数量 和 商品总数量
          if (checkedNums === chkList.length) {
            console.log('设置全选');
            allChk.checked = true;
          } else {
            console.log('不设置全选');
            allChk.checked = false;
          }
        });
      }
    </script>
  </body>
</html>

20-商品选中

<!DOCTYPE html>

<html>
  <head lang="en">
    <meta charset="UTF-8" />
    <title>01-全选商品</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }

      table {
        border-collapse: collapse;
        border-spacing: 0;
        border: 1px solid #c0c0c0;
        width: 500px;
        margin: 100px auto;
        text-align: center;
      }

      th {
        background-color: #09c;
        font: bold 16px '微软雅黑';
        color: #fff;
        height: 24px;
      }

      td {
        border: 1px solid #d0d0d0;
        color: #404060;
        padding: 10px;
      }

      .allCheck {
        width: 80px;
      }
    </style>
  </head>

  <body>
    <table>
      <thead>
        <tr>
          <th class="allCheck">
            <input type="checkbox" name="" id="checkAll" />
            <span class="all">全选</span>
          </th>
          <th>商品</th>
          <th>商家</th>
          <th>价格</th>
        </tr>
      </thead>
      <tbody></tbody>
    </table>
  </body>
  <script>
    let tbody = document.querySelector('tbody');
    let checkAll = document.querySelector('#checkAll');
    // 代码调试 和 打断点
    // 1 以前打断点的方式  回到谷歌浏览器中来鼠标点击打断点
    // 2 写一行代码  实现断点
    // let ckList = document.querySelectorAll('.ck'); // 获取元素必须要保证页面上有 否则获取不到

    // 1 根据数组 来渲染页面结构
    function render() {
      let arr = [
        { name: '小米手机', business: '小米', price: 2999 },
        { name: '小米净水器', business: '小米', price: 4999 },
        { name: '小米电视', business: '小米', price: 5999 },
      ];

      let html = ``;
      // 遍历生成标签
      for (let index = 0; index < arr.length; index++) {
        html += `
        <tr>
        <td>
          <input type="checkbox" name="check" class="ck" />
        </td>
        <td>${arr[index].name}</td>
        <td>${arr[index].business}</td>
        <td>${arr[index].price}</td>
      </tr>
        `;
      }

      // 把html插入到tbody中
      tbody.innerHTML = html;
    }

    render(); // 1 根据数组 来渲染页面结构

    let ckList = document.querySelectorAll('.ck'); // 获取元素必须要保证页面上有 否则获取不到

    // 2 全选 点击功能
    checkAll.addEventListener('click', function () {
      // 2.1 获取自己的选中状态
      let checked = this.checked;
      // 2.2 遍历小的复选框 把 全选-选中状态设置给每一个小复选框即可
      console.log(ckList);
      for (let index = 0; index < ckList.length; index++) {
        ckList[index].checked = checked;
      }
    });

    // 3 给每一个小商品选中按钮绑定点击事件
    for (let index = 0; index < ckList.length; index++) {
      ckList[index].addEventListener('click', function () {
        // 判断选中的商品数量和  商品总数量 的关系
        // 如果相等 表示  可以全选
        // 否则不全选
        // if(isAllChk()){
        //   // 达到了全选的要求
        //   checkAll.checked=true;
        // }else{
        //   checkAll.checked=false;
        // }
        checkAll.checked = isAllChk();
      });
    }

    // 判断是否到达了全选的条件
    function isAllChk() {
      // 定义1个记录 当前选中的商品的数量 变量
      let checkedNum = 0;
      // 遍历商品的复选框数组
      for (let index = 0; index < ckList.length; index++) {
        //  如果当前的复选框是选中
        if (ckList[index].checked) {
          checkedNum++;
        }
      }

      // 判断选中的商品数量和总的商品数量直接的关系
      // if (checkedNum === ckList.length) {
      //   return true;
      // } else {
      //   return false;
      // }

      return checkedNum === ckList.length;
    }
  </script>
</html>

移动的案例

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>23-移动的案例.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
      body {
        display: flex;
        justify-content: space-evenly;
      }
      ul {
        width: 400px;
        height: 400px;
      }
      .left {
        background-color: yellow;
      }
      .right {
        background-color: aqua;
      }
    </style>
  </head>
  <body>
    <ul class="left">
      <li>龙虾</li>
      <li>鲍鱼</li>
      <li>皇帝蟹</li>
      <li>鱼子酱</li>
    </ul>
    <ul class="right"></ul>
    <script>
      let liList = document.querySelectorAll('li');
      let right = document.querySelector('.right');

      for (let index = 0; index < liList.length; index++) {
        liList[index].addEventListener('click', function () {
          // 移动元素
          // appendChild 要什么数据
          // 父元素.appendChild(子元素);
          // 子元素 目标元素 this
          right.appendChild(this);
        });
      }
    </script>
  </body>
</html>

24-美女画廊

分析

image-20220411151225962

代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>24-美女画廊.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
      body {
        padding: 20px;
      }
      .big {
        width: 815px;
      }
    </style>
  </head>
  <body>
    <h1>美女画廊</h1>
    <div></div>
    <img class="big" src="./images/3.3/placeholder.png" alt="" />
    <h3>选择图片</h3>
    <script>
      /* 
      要是你以前没有做过类似的案例 
      你不可能一下子就找到 最优解! 
      
      
       */
      let div = document.querySelector('div');
      let big = document.querySelector('.big');
      let h3 = document.querySelector('h3');

      let index = 0;

      // 1 定义好数据
      let arr = [
        {
          small: './images/3.3/1-small.jpg',
          big: './images/3.3/1.jpg',
          title: '美女A',
        },
        {
          small: './images/3.3/2-small.jpg',
          big: './images/3.3/2.jpg',
          title: '美女B',
        },
        {
          small: './images/3.3/3-small.jpg',
          big: './images/3.3/3.jpg',
          title: '美女C',
        },
        {
          small: './images/3.3/4-small.jpg',
          big: './images/3.3/4.jpg',
          title: '美女D',
        },
        {
          small: './images/3.3/2-small.jpg',
          big: './images/3.3/2.jpg',
          title: '美女E',
        },
        {
          small: './images/3.3/3-small.jpg',
          big: './images/3.3/3.jpg',
          title: '美女F',
        },
      ];

      // 2 写一个函数负责渲染小图片
      function render() {
        let imgHTML = ``;
        for (let index = 0; index < arr.length; index++) {
          // imgHTML += `<img src="./images/3.3/${index + 1}-small.jpg" alt="" />`;
          imgHTML += `<img src="${arr[index].small}" alt="" />`;
        }
        div.innerHTML = imgHTML;
      }

      render(); //  函数负责渲染小图片

      let smImgs = document.querySelectorAll('div img');
      // 3 遍历小图片 绑定点击事件
      for (let index = 0; index < smImgs.length; index++) {
        smImgs[index].addEventListener('click', function () {
          // console.log('被点击图片的下标', index);
          renderByIndex(index);
        });
      }

      // 根据下标来显示对应的内容
      function renderByIndex(arrIndex) {
        // 显示小图对应的 大图
        big.src = arr[arrIndex].big;
        // 显示标题
        h3.innerText = arr[arrIndex].title;
      }

      // 4 开启一个定时器 定时器内自动调用 函数 显示内容
      setInterval(function () {
        renderByIndex(index);
        index++;

        // 控制好下标 不要让它超出限制
        if (index === arr.length) {
          index = 0;
        }
        console.log(index);
      }, 1000);
    </script>
  </body>
</html>

学习技巧

  • 以后碰到比较复杂的案例,静态结构要先写死