JavaScript综合案例五

news2024/9/24 4:25:41

目录

一、实战案例:轮播图案例-完整版

代码实现

二、实战案例:tab栏切换

1.普通版本

代码实现

2.事件委托版本

代码实现

三、实战案例:表单全选反选

代码实现

四、实战案例:哔哩哔哩导航滑动

代码实现

五、实战案例:多功能电梯导航栏

代码实现


一、实战案例:轮播图案例-完整版

需求:每隔一秒自动切换一个图片和标题、小圆点颜色,并且可以自己选择上一张还是下一张

分析:

1.准备一个数组对象,存储详细信息

2.获取元素对象

3.设置间歇函数,定时修改图片和标题小圆点

4.处理图片自动复原,从头播放

5.监听鼠标进出事件,让轮播图停止和开始

6.监听按钮点击事件,让按钮操控轮播图

 

代码实现

<style>
    .newbh {
        color: red;
    }

    img {
        height: 100px;
        width: 200px;
    }

    .bt {
        position: absolute;
        top: 80px;
        left: 40px;
    }
</style>

<body>
    <div class="cz"><img src="1.jpg">
        <div class="bt">
        <button class="syz">上一张</button>
        <button class="xyz">下一张</button>
    </div>
    </div>
    <div><span id="a">熊猫能有什么坏心思</span></div>
    <div>
        <ul>
            <li class="newbh"></li>
            <li></li>
            <li></li>
            <li></li>
        </ul>
    </div>

</body>

<script>
    //准备一个数组对象,存储详细信息
    let message = [
        { src: '1.jpg', title: '熊猫能有什么坏心思' },
        { src: '2.jpg', title: '小兔子为什么这么白?' },
        { src: '3.jpg', title: '狗狗对人类很忠诚' },
        { src: '4.jpg', title: '猫咪凶起来谁都不怕' }
    ]

    let i = 0

    //获取元素
    const imgObject = document.querySelector('img')
    const spanObject = document.querySelector('#a')


    //设置间歇函数,定时修改图片和标题、小圆点
    let id = setInterval(fn, 1000)

    function fn() {
        i++
        //判断是否超过了最后一张,如果是,则重新赋值为0,图片从头开始播放
        if (i == message.length) {
            i = 0
        }
        //更新图片和标题
        imgObject.src = message[i].src
        spanObject.innerHTML = message[i].title
        //选出含有newbh的li标签对象,然后将其class删除
        const liObject = document.querySelector('.newbh')
        liObject.classList.remove('newbh')
        const ulliObject = document.querySelector(`ul li:nth-child(${i + 1})`)
        ulliObject.classList.add('newbh')
    }

    const divObject = document.querySelector('.cz')
    //鼠标进入图片关闭定时器
    divObject.addEventListener('mouseenter', function () {
        clearInterval(id)
    })
    //鼠标出去开启定时器
    divObject.addEventListener('mouseleave', function () {
        //注意,不要加let,不然又重新定义了一个定时器
        id = setInterval(fn, 1000)
    })

    //获取按钮对象
    const button1Object = document.querySelector('.syz')
    const button2Object = document.querySelector('.xyz')
    button1Object.addEventListener('click', function () {
        i--
        if(i < 0){
            i = message.length-1
        }
        //更新图片和标题
        imgObject.src = message[i].src
        spanObject.innerHTML = message[i].title
        //选出含有newbh的li标签对象,然后将其class删除
        const liObject = document.querySelector('.newbh')
        liObject.classList.remove('newbh')
        const ulliObject = document.querySelector(`ul li:nth-child(${i + 1})`)
        ulliObject.classList.add('newbh')
    })
    button2Object.addEventListener('click', fn)
</script>

二、实战案例:tab栏切换

需求:

鼠标经过不同的选项卡,底部可以显示不同的内容

分析

1.主要的核心是类的切换,设定一个当前类,可以让元素高亮

2.鼠标经过当前选项卡,先移除其余元素身上当前的类,而只给当前元素添加类

3.注意,当前类只能有一个

 1.普通版本

代码实现

<style>
    .ulli li {
        display: inline;
    }

    .ulli .active {
        color: red;
    }

    .dis img {
        position: absolute;
        left: 40px;
        height: 100px;
        width: 280px;
        border: 1px solid #000;
        display: none;
    }

    .dis .active {
        display: block;
    }
</style>

<body>
    <div class="ulli">
        <ul>
            <li class="active">智能先锋</li>
            <li>居家优品</li>
            <li>超市百货</li>
            <li>时尚达人</li>
        </ul>
    </div>
    <div class="dis">
        <img src="11.png" alt="" class="active">
        <img src="22.png" alt="">
        <img src="33.png" alt="">
        <img src="44.png" alt="">
    </div>
</body>
<script>
    //通过querySelectorAll()获取li对象的伪数组
    const liObject = document.querySelectorAll('.ulli li')
    //通过循环遍历伪数组将每一个li对象都添加事件监听
    for (let i = 0; i < liObject.length; i++) {
        liObject[i].addEventListener('mouseenter', function () {
            console.log(1)
            //排它思想改变动态样式
            //先去除
            const clearObject = document.querySelector('.ulli .active')
            //注意()内写的是对象名
            clearObject.classList.remove('active')
            //再添加
            const ulliObject = document.querySelector(`.ulli li:nth-child(${i + 1})`)
            //注意()内写的是对象名
            ulliObject.classList.add('active')

            //排它思想动态改变图片换行样式
            //先去除
            const clearImgObject = document.querySelector('.dis .active')
            clearImgObject.classList.remove('active')
            //再添加
            const disImgObject = document.querySelector(`.dis img:nth-child(${i + 1})`)
            disImgObject.classList.add('active')
        })
    }
</script>

2.事件委托版本

知识补充

自定义标签属性的对象

<div data-id= "1" ></div>

const div = document.querySelector('div')

console.log(div.dataset)   获得的是DOMStringMap对象

DOMStringMap对象里面有id属性和 1 属性值

console.log(div.dataset.id)   获取id属性值

代码实现

<!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>
</head>
<style>
    .ulli li {
        display: inline;
    }

    .ulli .active {
        color: red;
    }

    .dis img {
        position: absolute;
        left: 40px;
        height: 100px;
        width: 280px;
        border: 1px solid #000;
        display: none;
    }

    .dis .active {
        display: block;
    }
</style>

<body>
    <div class="ulli">
        <ul>
            <li class="active"><a href="#" data-id="0">智能先锋</a></li>
            <li><a href="#" data-id="1">居家优品</a></li>
            <li><a href="#" data-id="2">超市百货</a></li>
            <li><a href="#" data-id="3">时尚达人</a></li>
        </ul>
    </div>
    <div class="dis">
        <img src="11.png" alt="" class="active">
        <img src="22.png" alt="">
        <img src="33.png" alt="">
        <img src="44.png" alt="">
    </div>
</body>
<script>
    //通过querySelector获取li的父对象ul
    const ulObject = document.querySelector('.ulli ul')
    //直接对父对象ul进行事件监听
    ulObject.addEventListener('click', function (e) {
        console.log(1)
        //获取具体点击了哪一个子a
        console.log(e.target)
        if (e.target.tagName === 'A') {
            //排它思想改变动态样式
            //先去除
            const clearObject = document.querySelector('.ulli .active')
            //注意()内写的是类名
            clearObject.classList.remove('active')
            //再添加
            //注意()内写的是对类名
            e.target.classList.add('active')
            //获取显示图片对象
            const imgObject = document.querySelector('.dis .active')
            //移除显示
            imgObject.classList.remove('active')
            //添加显示
            //获取图片对象伪数组
            const img = document.querySelectorAll('.dis img')
            //获取子对象自定义属性的值,再通过隐式转换为数字型
            const i = +e.target.dataset.id
            //伪数组的索引号对应标题号
            img[i].classList.add('active')
        }
    }) 
</script>

</html>

三、实战案例:表单全选反选

1.表单全选

需求:

点击全选框,复选框全部选中

将复选框全部选中,全选框自动选中,否则全选框不选中

分析:

全选框点击,可以得到当前按钮的checked的boolean值

把下面所有的小复选框状态checked,改为和全选框boolean值一致

遍历复选框,添加点击事件

检查选中的复选框个数是不是等于复选框总数

把判断的结果给全选框

利用css选中的复选框选择器

 

知识补充

 css选中的复选框选择器

可以通过  选择器checked

来选中已选中的复选框

那么也就可以获取已选中复选框的dom对象

例如

    .ck:checked {

        height: 20px;

        width: 20px;

        background-color: red;

    }这是对选中的复选框进行css修饰

<input type="checkbox" class="ck">

<input type="checkbox" class="ck">

<input type="checkbox" class="csk">

document.querySelectorAll('.ck:checked')这是获取所有选中的复选框dom对象的伪数组

document.querySelector('.csk:checked')这是获取已选中的复选框dom对象

代码实现

<!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>
</head>
<style>
    div {
        position: absolute;
        left: 30%;
        top: 30%;
    }

    table {
        height: 200px;
        width: 400px;
        text-align: center;
    }

    .ck:checked {
        height: 20px;
        width: 20px;
        background-color: red;
    }
</style>

<body>
    <div>
        <table border="2">
            <tr>
                <th><input type="checkbox" class="ckall">全选</th>
                <th>商品</th>
                <th>商家</th>
                <th>价格</th>
            </tr>
            <tr>
                <td><input type="checkbox" class="ck"></td>
                <td>小米手机</td>
                <td>小米</td>
                <td>1999</td>
            </tr>
            <tr>
                <td><input type="checkbox" class="ck"></td>
                <td>小米净水器</td>
                <td>小米</td>
                <td>2999</td>
            </tr>
            <tr>
                <td><input type="checkbox" class="ck"></td>
                <td>小米电视</td>
                <td>小米</td>
                <td>3999</td>
            </tr>
        </table>
    </div>
</body>
<script>
    //获取全选框对象
    const ckallObject = document.querySelector('.ckall')
    //获取所有复选框对象
    const ckObject = document.querySelectorAll('.ck')
    //对全选框对象添加点击事件监听
    ckallObject.addEventListener('click', function () {
        //循环遍历全选框伪数组赋与全选框控制checked的boolean值
        for (let i = 0; i < ckObject.length; i++) {
            ckObject[i].checked = this.checked
        }
    })

    //循环遍历给每一个复选框添加事件监听
    for (let i = 0; i < ckObject.length; i++) {
        ckObject[i].addEventListener('click', function () {
            //繁琐
            //let d = document.querySelectorAll('.ck:checked')
            // if(d.length === ckObject.length){ 
            //     ckallObject.checked = this.checked
            // }else{
            //     ckallObject.checked = false
            // }

            //当监听到已选中的复选框伪数组长度等于存在的复选框伪数组长度时,全选框选中
            ckallObject.checked = document.querySelectorAll('.ck:checked').length === ckObject.length
        })
    }
</script>

</html>

四、实战案例:哔哩哔哩导航滑动

需求:

当点击链接,下面红色滑块跟着移动

分析:

使用事件委托

点击链接得到当前元素的的offsetLeft的值

修改line颜色块的transform值 = 点击链接的offsetLeft

添加过渡效果

 

代码实现

<!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>
</head>
<style>
    li {
        display: inline;
    }

    a {
        text-decoration: none;
    }

    .bh {
        background-color: red;
        height: 10px;
        width: 20px;
        position: absolute;

        top: 40px;
        transition: all 1s;
    }

    .ulli {
        align-items: center;
        position: absolute;
    }
</style>

<body>
    <div class="ulli">
        <ul>
            <li><a href="#">首页</a></li>
            <li><a href="#">动画</a></li>
            <li><a href="#">番剧</a></li>
            <li><a href="#">果蔬</a></li>
            <li><a href="#">音乐</a></li>
        </ul>
        <div class="bh">
        </div>
    </div>
</body>
<script>
    //事件冒泡
    const ulObject = document.querySelector('ul')
    const divObject = document.querySelector('.bh')
    ulObject.addEventListener('click', function (e) {
        //确保是点击A触发
        if (e.target.tagName === 'A') {
            //移动li的border到ul的border距离
            divObject.style.transform = `translateX(${e.target.offsetLeft}px)`
        }
    })
</script>

</html>

五、实战案例:多功能电梯导航栏

需求:

点击不同的模块,页面可以自动跳转不同的位置

1.页面滚动到对应位置,导航显示,否则隐藏

2.点击导航对应小模块,页面会跳到对应大模块的位置

3.页面滚动到对应位置,电梯导航对应模块自动发生变化

分析:

1.显示隐藏电梯盒子和返回顶部已经完成,可以放到自执行函数里面,防止变量污染

2.电梯模块单独放到自执行函数里面

3.点击每个模块,页面自动滚动到对应模块,使用事件委托方法更加简单

分析:

点击小模块,当前添加这个类

解决处理初次获取不到active这个类

4.页面滚动到对应位置,电梯导航对应模块自动发生变化

分析

当页面滚动了,先移除所有小li的状态

因为页面滚动需要不断获取大盒子的位置,所以需要把所有的大盒子都获取过来

开始进行滚动判断

        -如果页面滚动大于第一个大盒子小于第二个大盒子的offsetTop就把对应的小盒子先出来添加类

        -以此类推

知识补充:

属性选择器

含有该属性的标签,将会被属性选择器所选中

格式

标签名[属性名]

标签名[属性名=属性值]

也可以直接简写

[属性名]

[属性名=属性值] 

可以通过属性选择器来获取标签的dom对象

<!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>
</head>
<style>
    input[value]{
        
    }
    [value]{

    }
    input[type=text]{

    }

</style>
<body>
    <input type="text" value="1">
    <input type="password" name="" id="2">
</body>
<script>
    const inputObject = document.querySelector('[value=1]')
    const inputObject1 = document.querySelector('input[type]')
    const inputObject2 = document.querySelector('[id]')
</script>
</html>

代码实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1143254.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

win10安装Tensorflow(2.10-)使用最新cuda(12+),cudnn(8.9+)

# tensorflow在2.11版本后不再支持原生windows的GPU&#xff1a; https://blog.tensorflow.org/2022/09/whats-new-in-tensorflow-210.html# 1、首先&#xff0c;在windows安装好最新的GPU环境&#xff1a; https://blog.csdn.net/sinat_20174131/article/details/121781420?s…

可以实时监控屏幕的电脑监控软件

电脑已经成为了人们工作和生活不可或缺的工具。然而&#xff0c;这也带来了诸多安全问题。一些人可能会利用电脑进行不恰当的操作&#xff0c;如聊天、游戏、观看视频等&#xff0c;甚至会泄露公司的商业机密。 电脑监控软件的定义 电脑监控软件是一种用于监控电脑使用情况的软…

【CSDN 每日一练 ★★☆】【数学】字符串相乘

###【CSDN Daily Practice】【数学】字符串相乘 数学 模拟 题目 给定两个以字符串形式表示的非负整数 num1 和 num2&#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。 示例 示例 1: 输入: num1 “2”, num2 “3” 输出: “6” 示例 2: …

【SOPHON】算能盒子SE-16的C++模型转换

目录 ONNX转MLIR指定模型的预处理过程转换结果 本文以 arcface 为例, 介绍如何编译迁移一个onnx模型至TPU平台运行。 有疑问具体可参考 TPU-MLIR ONNX转MLIR 如果模型是图片输入, 在转模型之前我们需要了解模型的预处理。如果模型用预处理后的npz文件做输入, 则不需要考虑预处…

01. 嵌入式与人工智能是如何结合的?

CPU是Arm A57的 GPU是128cuda核 一.小车跟踪的需求和设计方法 比如有一个小车跟踪的项目。 需求是&#xff1a;小车识别出罪犯&#xff0c;然后去跟踪他。方法&#xff1a;摄像头采集到人之后传入到开发板&#xff0c;内部做一下识别&#xff0c;然后控制小车去跟随。在人工智…

Linux ———— 管理磁盘

&#xff08;一&#xff09;MBR硬盘与GPT硬盘 硬盘按分区表的格式可以分为MBR硬盘与GPT硬盘两种硬盘格式。 MBR 硬盘&#xff1a;使用的是旧的传统硬盘分区表格式&#xff0c;其硬盘分区表存储在MBR(Master Boot Record&#xff0c;主引导区记录&#xff09;内。MBR位于…

为什么引入偏向锁、轻量级锁,介绍下升级流程

Synchronized Synchronized 在 jdk1.6 版本之前&#xff0c;是通过重量级锁的方式来实现线程之间锁的竞争。之所以称它为重量级锁&#xff0c;是因为它的底层底层依赖操作系统的 Mutex Lock 来实现互斥功能。&#xff08;如图&#xff09;Mutex 是系统方法&#xff0c;由于权限…

PN7727 集成驱动及四个开关管的无线充电发射端功率芯片 20W无线发射功率

PN7727是一款用于无线充电的智能功率芯片该芯片集成了驱动及四颗高效功率级场效应管内置自举高压PMOS和5V/50mA LDO&#xff0c;具备自适应死区功能。 该芯片集成了欠压保护、过温保护等功能。芯片的两个输入管脚PWM1和PWM2兼容5V和3.3v信号控制&#xff0c;具有良好的…

小黑子—spring:第一章 Bean基础

spring入门1.0 一 小黑子对spring基础进行概述1.1 spring导论1.2 传统Javaweb开发困惑及解决方法1.3 三大的思想提出1.3.1 IOC入门案例1.3.2 DI入门案例 1.4 框架概念1.5 初识spring1.5.1 Spring Framework 1.6 BeanFactory快速入门1.7 ApplicationContext快速入门1.8 BeanFact…

浅谈智慧空开在某市科技馆项目的应用-安科瑞 蒋静

【摘要】&#xff1a;ASCB1系列智能微型断路器是安科瑞电气股份有限公司全新推出的智慧用电产品&#xff0c;产品由智能微型断路器与智能网关两部分组成&#xff0c;可用于对用电线路的关键电气因素&#xff0c;如电压、电流、功率、温度、漏电、能耗等进行实时监测&#xff0c…

工业数字化转型中的控制塔BI

工业数字化转型是当前工业领域的一个重要趋势&#xff0c;它通过应用先进的信息技术和数据分析方法&#xff0c;推动传统制造业向智能化、高效化、可持续发展的方向转变。在工业数字化转型中&#xff0c;控制塔BI&#xff08;Business Intelligence&#xff09;扮演着重要的角色…

ant design vue 的getPopupContainer

在 ant design vue 中&#xff0c;有几个组件是有 getPopupContainer 属性的&#xff0c;比如&#xff1a;下拉菜单 默认是渲染到body 上的&#xff0c;所以如果你想要对 下拉选择组件 的样式&#xff0c;做修改&#xff0c;如果 style 标签上开启了 scoped&#xff0c;肯定不会…

快手极速版app拉新推广和抖音极速版app地推拉新,哪个收益更高?

抖音极速版和快手极速版可以通过“聚量推客”申请&#xff0c;是两个常年霸榜地推app拉新行业的项目&#xff0c;说他们是推广拉新行业的旗帜性项目&#xff0c;也丝毫不为过。许多推广员&#xff0c;就是从抖音极速版和快手极速版中间二选一&#xff0c;开启了自己的地推赚钱生…

jsp简单实现新闻发布系统中用户注册确认和用户模拟登录功能的开发

jsp简单实现新闻发布系统中用户注册确认和用户模拟登录功能的开发 <jsp:include page"common/top.jsp" /> 以及left和bottom为三个公共页面 主页面为index.jsp 简单的实现了可以设置用户名和登录等功能 Login.jsp <%page language"java" pa…

【ROS入门】机器人运动控制以及里程计信息显示

文章结构 运动控制实现流程&#xff08;Gazebo&#xff09;为joint添加传动装置以及控制器xacro文件集成启动gazebo并控制机器人运动 Rviz查看里程计信息启动Rviz添加组件 运动控制实现流程&#xff08;Gazebo&#xff09; 运动控制基本流程: 已经创建完毕的机器人模型&#x…

MySQL主从同步-binlog

MySQL主从同步-binlog 服务器准备 IP节点配置系统版本191.168.117.143master2c2g40gcentos 7.9192.168.117.142slave2c2g40gcentos 7.9 环境准备 下面操作需要在两台机器都操作 关闭防火墙 systemctl stop firewalld && systemctl disable firewalldsetenforce 0…

高可用系统架构——关于语雀宕机的思考

语雀系统崩溃了&#xff0c;并且经过8个多小时才恢复&#xff0c;估计语雀的小伙伴们已经哭晕在厕所里了。 本次稳定性故障再次给架构师敲响警钟&#xff1a;系统高可用一直是架构的重点&#xff0c;它涉及到系统的方方面面&#xff0c;并且是一件持续性的长期工作。 故障起因…

1200*A. Trust Nobody(贪心)

Problem - 1826A - Codeforces 解析&#xff1a; 从大到小枚举说谎人的个数x&#xff0c;然后查看是否有 x个人说谎即可。 #include<bits/stdc.h> using namespace std; #define int long long const int N2e55; int t,n,a[N]; signed main(){scanf("%lld",&a…

TS中类型别名和接口区别

在很多场景下&#xff0c;interface 和 type都能使用&#xff0c;因此两者在很多时候会被混淆&#xff1a; 接口可以通过之间的继承&#xff0c;实现多种接口的组合 使用类型别名也可以实现多种的&#xff0c;通过&连接,有差异&#xff1a; 子接口中不能重新覆盖父接口中…