Web APIs(七)

88 阅读4分钟

web APIS

一、资源加载事件

1.load:加载外部资源(如图片、外联CSS和JavaScript等)加载完毕时触发的事件

①监听页面所有资源加载完毕:给 window 添加 load 事件

②语法

window.addEventListener('load',function(){

})

2.DOMContentLoaded:当初始的 HTML 文档被完全加载和解析完成之后,DOMContentLoaded 事件被触发,而无需等待样式表、图像等完全加载

①监听页面DOM加载完毕:给 document 添加 DOMContentLoaded 事件

②语法

document.addEventListener('DOMContentLoaded',function(){

})

二、元素位置和大小

1.scroll家族

①scollWidth 获取容器的宽度(包含滚动的区域)

②scrollLeft 获取左侧滚动的距离

    <script>
      const scrollDOM = document.querySelector(".scroll-DOM");
      scrollDOM.addEventListener("scroll", function () {
        // console.log(scrollDOM.scrollTop);  
        // console.log(scrollDOM.scrollLeft);
        // console.log(scrollDOM.scrollWidth);  可视区域宽度 固定的
        // console.log(scrollDOM.scrollHeight);  可视区域宽度 固定的
      });
    </script>

2.offset家族

①offsetWidth 获取可视区域的宽度(包含滚动条)

②offsetLeft 获取和已经定位了的父级元素的左距离

    <script>
      const offsetDom = document.querySelector(".offset");

      // 获取宽度和高度 包含这滚动条的大小
      console.log(offsetDom.offsetWidth); // 300
      console.log(offsetDom.offsetHeight); // 300

      // console.log(offsetDom.scrollWidth); // 283
      // console.log(offsetDom.scrollHeight);// 283

      // 获取当前元素距离 定位了的父元素的大小(找不到定位了的父元素,相对于页面来计算)
      console.log(offsetDom.offsetLeft);
      console.log(offsetDom.offsetTop);

      /* 
      总结 offset家族
      1 offsetWidth  获取元素的宽度 包含这滚动条
      2 offsetHeight 获取元素的高度 包含这滚动条
      3 offsetLeft 获取定位了的父元素的 水平距离 左 
      4 offsetTop 获取定位了的父元素的 垂直距离 上
       */
    </script>

3.client家族

①clientWidth 获取可视区域的宽度(不包含滚动条)

②clientLeft 获取左边框的大小

    <script>
      const clientDom = document.querySelector(".client");
      // 宽度和高度
      console.log(clientDom.clientWidth); // 不包含 滚动条(类似 scrollWidth)
      console.log(clientDom.clientHeight); // 不包含 滚动条(类似 scrollHeight)

      // 获取边框的大小
      console.log(clientDom.clientLeft); // 左边框
      console.log(clientDom.clientRight); // 有没有?
      console.log(clientDom.clientTop); // 上边框

      // scollWidth     获取容器的宽度(包含滚动的区域)
      // offsetWidth    获取可视区域的宽度(包含滚动条)
      // clientWidth    获取可视区域的宽度(不包含滚动条)

      // scrollLeft    获取左侧滚动的距离
      // offsetLeft    获取和已经定位了的父级元素的左距离
      // clientLeft    获取左边框的大小
    </script>

三、屏幕大小事件resize(window)

1.关键代码

// 页面大小发生变化了就会触发的事件 resize window来绑定
      window.addEventListener("resize", function (event) {

})

// 获取当前页面的宽度
      console.log(document.body.offsetWidth);

// 设置页面html标签的字体大小为屏幕的十分之一
      document.documentElement.style.fontSize =document.body.offsetWidth / 10 + "px";

if (width > 1200) {

// 获取html标题title
document.querySelector("title").innerText = `大屏幕 ${width}`;
} else if (width > 992) {
  document.querySelector("title").innerText = `中等屏幕 ${width}`;
} else if (width > 768) {
  document.querySelector("title").innerText = `小屏幕 ${width}`;
} else {
  document.querySelector("title").innerText = `极小屏幕 ${width}`;
}
<!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-屏幕大小改变事件.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
      div {
        width: 1rem;
        height: 1rem;
        background-color: aqua;
        font-size: 1rem;
      }
    </style>
  </head>
  <body>
    <div>div</div>
    <script>
      // 页面大小发生变化了就会触发的事件 resize window来绑定
      window.addEventListener("resize", function (event) {
        console.log("页面大小发生变化了");
        // 移动端屏幕适配 rem   淘宝js库,flexible.js  作用  设置html的字体大小 为当前页面的宽度的十分之一
        // 获取当前页面的宽度
        console.log(document.body.offsetWidth);
        // 设置页面html标签的字体大小为屏幕的十分之一
        document.documentElement.style.fontSize =
          document.body.offsetWidth / 10 + "px";

        // 响应式布局的时候  发一个js文件  方便根据当前页面的宽度 告诉我们屏幕的种类和宽度
        const width = document.body.offsetWidth;

        if (width > 1200) {
          document.querySelector("title").innerText = `大屏幕 ${width}`;
        } else if (width > 992) {
          document.querySelector("title").innerText = `中等屏幕 ${width}`;
        } else if (width > 768) {
          document.querySelector("title").innerText = `小屏幕 ${width}`;
        } else {
          document.querySelector("title").innerText = `极小屏幕 ${width}`;
        }
      });
    </script>
  </body>
</html>

四、swiper插件(轮播图)

1.网址:www.swiper.com.cn/usage/index…

2.如何选择插件版本: 点击导航栏获取wiper--->下载swiper--->目前swiper7--->选择对应目前版本(swiper-7.4.1)

1 下载swiper对应的文件 - css + js 
2 分布引入他们
3 拷贝别人的固定结构
4 拷贝写好的swiper 初始化js代码

3.自己写轮播图思路

思路:通过移除和添加类名实现相关轮播图效果,实际中轮播图不需要自己写,但要会写

关键代码

// 移除含有active类名的标签 的 类,先找到相关标签
document.querySelector(".slides li.active")

// 删除类名代码  元素.classList.remove
document.querySelector(".slides li.active").classList.remove("active");
document.querySelector(".indicator li.active").classList.remove("active");

// 对点击对象 添加相关类
// 给当前点击的li标签对应下标的 小图 添加 active类
this.classList.add("active");
// console.log(this);// 希望 this是li标签
// 给当前点击的li标签对应下标的 大图 添加 active类
slidesLis[index].classList.add("active");

// 设置标题文字
document.querySelector("h3").innerText = `第${index + 1}张图的描述信息`;

js部分

// 获取小图片的li标签
const lis = document.querySelectorAll(".indicator li");
// 获取大图对应的li标签
const slidesLis = document.querySelectorAll(".slides li");
// 遍历来绑定点击事件
for (let index = 0; index < lis.length; index++) {
  lis[index].addEventListener("click", function (event) {
    // 把大图的 active 类 移除掉
    document.querySelector(".slides li.active").classList.remove("active");
    // 把小图的 active  移除掉
    document.querySelector(".indicator li.active").classList.remove("active");

    // 给当前点击的li标签对应下标的 小图 添加 active类
    this.classList.add("active");
    // console.log(this);// 希望 this是li标签
    // 给当前点击的li标签对应下标的 大图 添加 active类
    slidesLis[index].classList.add("active");

    // 设置标题文字
    document.querySelector("h3").innerText = `第${index + 1}张图的描述信息`;
  });
}

框架部分

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>QQ音乐轮播图</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }

      li {
        list-style: none;
      }

      .main {
        width: 700px;
        margin: auto;
        background: #000;
      }

      .slides {
        height: 320px;
        position: relative;
      }

      .slides ul li {
        /* display: none; */
        position: absolute;
        top: 0;
        left: 0;
        opacity: 0;
        /* 这里实现淡入淡出的关键 */
        transition: all 0.3s;
      }

      .slides li.active {
        /* display: block; */
        opacity: 1;
      }

      .slides .extra {
        width: 700px;
        height: 53px;
        line-height: 53px;
        position: absolute;
        bottom: 0px;
        background-color: rgba(0, 0, 0, 0.8);
        z-index: 10;
      }

      .slides .extra h3 {
        width: 82%;
        margin: 0;
        margin-right: 20px;
        padding-left: 20px;
        color: #98e404;
        font-size: 28px;
        float: left;
        font-weight: 500;
        font-family: "Microsoft Yahei", Tahoma, Geneva;
      }

      .slides .extra a {
        width: 30px;
        height: 29px;
        display: block;
        float: left;
        margin-top: 12px;
        margin-right: 3px;
        background-image: url(./assets/icon_focus_switch.png);
      }

      .slides .extra .prev {
        background-position: 0 0;
      }

      .slides .extra .prev:hover {
        background-position: -30px 0;
      }

      .slides .extra .next {
        background-position: -60px 0;
      }

      .slides .extra .next:hover {
        background-position: -90px 0;
      }

      .indicator {
        padding: 10px 0;
      }

      .indicator ul {
        list-style-type: none;
        margin: 0 0 0 4px;
        padding: 0;
        overflow: hidden;
      }

      .indicator ul li {
        position: relative;
        float: left;
        width: 60px;
        margin: 0 4px 0 5px;
        text-align: center;

        cursor: pointer;
      }

      .indicator li img {
        display: block;
        border: 0;
        text-align: center;
        width: 60px;
      }

      .indicator li .mask {
        width: 60px;
        height: 60px;
        position: absolute;
        top: 0;
        left: 0;
        background-color: rgba(0, 0, 0, 0.4);
      }

      .indicator li .border {
        display: none;
        width: 54px;
        position: absolute;
        bottom: 0;
        left: 0;
        z-index: 20;
        border: 3px solid #98e404;
      }

      /* li里面的mask 和 border 刚开始都是显示的 */
      /* 我们写一个样式css */
      .indicator .active .mask {
        display: none;
      }

      .indicator .active .border {
        display: block;
      }
    </style>
  </head>

  <body>
    <div class="main">
      <div class="slides">
        <ul>
          <li class="active">
            <a href="#"
              ><img src="./assets/b_01.jpg" alt="第1张图的描述信息"
            /></a>
          </li>
          <li>
            <a href="#"
              ><img src="./assets/b_02.jpg" alt="第2张图的描述信息"
            /></a>
          </li>
          <li>
            <a href="#"
              ><img src="./assets/b_03.jpg" alt="第3张图的描述信息"
            /></a>
          </li>
          <li>
            <a href="#"
              ><img src="./assets/b_04.jpg" alt="第4张图的描述信息"
            /></a>
          </li>
          <li>
            <a href="#"
              ><img src="./assets/b_05.jpg" alt="第5张图的描述信息"
            /></a>
          </li>
          <li>
            <a href="#"
              ><img src="./assets/b_06.jpg" alt="第6张图的描述信息"
            /></a>
          </li>
          <li>
            <a href="#"
              ><img src="./assets/b_07.jpg" alt="第7张图的描述信息"
            /></a>
          </li>
          <li>
            <a href="#"
              ><img src="./assets/b_08.jpg" alt="第8张图的描述信息"
            /></a>
          </li>
          <li>
            <a href="#"
              ><img src="./assets/b_09.jpg" alt="第9张图的描述信息"
            /></a>
          </li>
          <li>
            <a href="#"
              ><img src="./assets/b_10.jpg" alt="第9张图的描述信息"
            /></a>
          </li>
        </ul>

        <div class="extra">
          <h3>第1张图的描述信息</h3>
          <a class="prev" href="javascript:;"></a>
          <a class="next" href="javascript:;"></a>
        </div>
      </div>
      <div class="indicator">
        <ul>
          <li class="active">
            <img src="assets/s_01.jpg" />
            <span class="mask"></span>
            <span class="border"></span>
          </li>
          <li>
            <img src="assets/s_02.jpg" />
            <span class="mask"></span>
            <span class="border"></span>
          </li>
          <li>
            <img src="assets/s_03.jpg" />
            <span class="mask"></span>
            <span class="border"></span>
          </li>
          <li>
            <img src="assets/s_04.jpg" />
            <span class="mask"></span>
            <span class="border"></span>
          </li>
          <li>
            <img src="assets/s_05.jpg" />
            <span class="mask"></span>
            <span class="border"></span>
          </li>
          <li>
            <img src="assets/s_06.jpg" />
            <span class="mask"></span>
            <span class="border"></span>
          </li>
          <li>
            <img src="assets/s_07.jpg" />
            <span class="mask"></span>
            <span class="border"></span>
          </li>
          <li>
            <img src="assets/s_08.jpg" />
            <span class="mask"></span>
            <span class="border"></span>
          </li>
          <li>
            <img src="assets/s_09.jpg" />
            <span class="mask"></span>
            <span class="border"></span>
          </li>
          <li>
            <img src="assets/s_10.jpg" />
            <span class="mask"></span>
            <span class="border"></span>
          </li>
        </ul>
      </div>
    </div>
    <!-- <script src="./10-焦点轮播图.js"></script> -->

    <script>
      const indicatorLi = document.querySelectorAll(".indicator li");
      const slidesLi = document.querySelectorAll(".slides li");
      for (let index = 0; index < indicatorLi.length; index++) {
        indicatorLi[index].addEventListener("click", function (event) {
          //
          document
            .querySelector(".indicator li.active")
            .classList.remove("active");
          //
          document
            .querySelector(".slides li.active")
            .classList.remove("active");
          //
          this.classList.add("active");
          //
          slidesLi[index].classList.add("active");
          //
          document.querySelector("h3").innerText = `第${index + 1}的描述信息`;
        });
      }
    </script>
  </body>
</html>

五、延时器

1.定时器-延时函数:JavaScript 内置的一个用来让代码延迟执行的函数,叫 setTimeout

2.语法

setTimeout(回调函数,等待的毫秒数)
setTimeout 仅仅只执行一次,所以可以理解为就是把一段代码延迟执行, 平时省略window

清除延时函数
let timeID=setTimeout(回调函数,等待的毫秒数)
clearTimeout(timeID)

3.案例---延时广告

①原理:添加延时器,到达一定时间,广告消失

②关键代码

<script>
    // 设置延时器 5秒后 display:none
      setTimeout(function () {
        document.querySelector(".box").style.display = "none";
        document.querySelector("span").style.display = "none";
      }, 5000);
      let span = document.querySelector("span");
      index = 5;
    // 5秒 倒计时
      setInterval(function () {
        index--;
        span.innerText = index;
      }, 1000);
</script>
<!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;
      }
      .box {
        width: 300px;
        height: 300px;
        background-color: paleturquoise;
        border-radius: 5px;
        font-size: 20px;
        display: flex;
        align-items: center;
        justify-content: center;
        color: #fff;
      }
      span {
        display: block;
        width: 50px;
        height: 50px;
        background-color: red;
        text-align: center;
        line-height: 50px;
      }
    </style>
  </head>
  <body>
    <div class="box">男人秃头 怎么办 请。。。</div>
    <span>5</span>
    <script>
      setTimeout(function () {
        document.querySelector(".box").style.display = "none";
        document.querySelector("span").style.display = "none";
      }, 5000);
      let span = document.querySelector("span");
      index = 5;
      setInterval(function () {
        index--;
        span.innerText = index;
      }, 1000);
    </script>
  </body>
</html>

六、递归

1.什么是递归:一个函数调用自己

2.使用场景

①有一个函数,可以打印出 一个dom元素的所有祖先元素 ,不可能提前知道 这个a标签有多少个父元素 ,这个函数接收一个参数,= dom,如果这个dom元素有父元素,就继续调用自己函数。

②假设你现在得了肺炎 警察叔叔

​ 先找你 -> 找你的邻居(得了肺炎) -> 找你的邻居的邻居(得了肺炎)->找你的邻居的邻居(得了肺炎)...

​ 直到找到一个邻居 没事 警察叔叔 不找结束了

3.案例---通过延时器完成定时器效果

①原理:递归

②关键代码

    <script>
      // 定时器 不主动清除,定时器永远执行下去
      // 延时器 只会执行一次

      // 延时器实现定时器的功能

      // 在延时器 又开启一个延时器,

      // 递归 自己调用自己  函数自己调用自己
      let index = 0;
      function func() {
        console.log(index++);
        setTimeout(func, 1000);
      }
      func();
      let index1 = 100;
      function func1() {
        console.log(index1--);
        setTimeout(func1, 1000);
      }
      func1();
    </script>

七、BOM

1.浏览器对象模型

2.location

①href属性,跳转页面

②search 获取url ? 后面的字符串

③hash 获取url# 后面的字符串

④reload()刷新和强制刷新reload(true)

  <body>
    <button>跳转到百度</button>
    <script>
      // 1 使用a标签 href 属性 可以实现页面跳转
      // 2 在js中,也可以直接跳转  location.href 来跳转
      // 3 location.href 也可以实现刷新 location.href = location.href;
      // 4 location.reload(true)
      // 5 search 后一个阶段就会用到它  获取 url 上 ? 后面的串字符 /17-location.html?a=1&b=2
      // 6 hash 学习到 vue 阶段 会用 获取#后面的一串字符 /17-location.html#/index #/index

      const button = document.querySelector("button");
      button.addEventListener("click", function () {
        // location.href = "http://www.baidu.com";
        // console.log(location.href);// http://127.0.0.1:5500/17-location.html
        // 刷新功能
        // location.href = location.href; // 刷新功能

        // reload实现刷新
        // location.reload(true)  true 强制刷新
        console.log(location.hash);
      });
      setTimeout(function () {
        location.href = "http://www.baidu.com";
      }, 5000);
    </script>
  </body>

3.navigator

①navigator的数据类型是对象,该对象下记录了浏览器自身的相关信息

②通过 userAgent 检测浏览器的版本及平台

navigator.userAgent

③检测安卓或苹果

(function () {
   const userAgent = navigator.userAgent;
   // 验证是否为Android或iPhone
   const android = userAgent.match(/(Android);?[\s\/]+([\d.]+)?/);
   const iphone = userAgent.match(/(iPhone\sOS)\s([\d_]+)/);
   // 如果是Android或iPhone,则跳转至移动站点
   if (android || iphone) {
      location.href = 'http://m.itcast.cn';
   }
   console.log(android);
   console.log(iphone);
})();

4.history

①history 的数据类型是对象,该对象与浏览器地址栏的操作相对应,如前进、后退、历史记录等

②back()退回功能、forward()前进功能、go(参数)前进/或后退【1 前进 ;-1 后退】

③关键代码

  <body>
    <a href="http://www.baidu.com">百度</a>
    <button class="forward">前进</button>
    <button class="back">后退</button>
    <script>
      const forward = document.querySelector(".forward");
      forward.addEventListener("click", function () {
        // history.forward();
        history.go(1); // 前进一个记录
      });
      const back = document.querySelector(".back");
      back.addEventListener("click", function () {
        // history.back();
        history.go(-1); // 后退一个记录
      });
    </script>
  </body>