iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript实现选项卡功能(面向过程与面向对象)
  • 349
分享到

JavaScript实现选项卡功能(面向过程与面向对象)

2024-04-02 19:04:59 349人浏览 独家记忆
摘要

目录面向过程面向对象 面向过程 注意: ul>li 标签属性中 的index属性值是串联起ol>li与ul>li的关键,通过调用相同索引下标的数组中的不同

面向过程

注意:

ul>li 标签属性中 的index属性值是串联起ol>li与ul>li的关键,通过调用相同索引下标的数组中的不同属性的属性值达到切换内容的效果。

通过事件委托找到对应的ul>li 进行CSS属性的删除与新增做到背景颜色改变和内容改变的效果。

<!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>
        *{
            margin: 0;
            padding: 0;
        }
 
        ul,ol,li{
            list-style: none;
        }
 
        .box{
            width: 800px;
            height: 600px;
            border: 3px solid #000;
            margin: 50px auto;
            display: flex;
            flex-direction: column;
 
        }
 
        .box > ul{
            width: 100%;
            height: 100px;
            display: flex;
  
        }
 
        .box > ul >li{
            flex: 1;
            display: flex;
            justify-content: center;
            align-items: center;
            font-size: 50px;
            background: pink;
            border-right: 2px solid #000;
            border-bottom: 2px solid #000;
            color: #fff;
 
        }
 
        .box > ul >li:last-child{
            border-right: none;
        }
 
        .box > ul >li.active{
            color: red;
            text-decoration: underline;
            background: orange;
        }
 
 
        .box > ol {
            flex: 1;
            position: relative;
 
        }
 
        .box > ol >li{
            width: 100%;
            height: 100%;
            position: absolute;
            top:0;
            left: 0;
            display: flex;
            justify-content: center;
            align-items: center;
            font-size: 100px;
            background: cyan;
            display: none;
            color: #fff;
        }
 
        .box > ol > li.active{
            display: flex;
        }
 
    </style>
</head>
<body>
 
    <div class="box"></div>
   
    <script>
        // 面向过程 
 
        // 定义数组 模拟数据库数据
        var arr1 = [
            { id:1 , ulLi:'精选' , olLi:'精选内容' },
            { id:2 , ulLi:'美食' , olLi:'美食内容' },
            { id:3 , ulLi:'百货' , olLi:'百货内容' },
            { id:4 , ulLi:'个护' , olLi:'个护内容' },
        ];
 
 
        // 获取标签对象 
        const oBox = document.querySelector('.box');
 
        // 定义全局变量储存数据
        let oUlLis ;
        let oOlLis ;
 
        // 调用函数 动态渲染生成页面
        setPage();
 
        // 调用函数 添加事件
        setEvent();
 
        // 定义函数1 动态生成页面
        function setPage(){
            // 创建固定的标签节点 ul ol 
            const oUl = document.createElement('ul');
            const oOl = document.createElement('ol');
 
            // 定义字符串 存储动态渲染生成的ul>li ol>li
            let ulLiStr = '';
            let olLiStr = '';
 
            // 循环遍历数组 根据数组中的内容动态渲染生成li标签
            arr1.forEach( function(item,key){
                // item 是 数组单元存储的数据 也就是 存储数据的对象
                // key 是 数组单元的索引下标
 
                // 第一个ul>li 有 class,active样式
                ulLiStr += key === 0 ? `<li name="ulLi" index="${key}" class="active">${item.ulLi}</li>` : `<li index="${key}" name="ulLi">${item.ulLi}</li>` ;
 
                // 第一个ol>li 有 class,active样式
                olLiStr += key === 0 ? `<li class="active">${item.olLi}</li>` : `<li>${item.olLi}</li>` ;
            });
 
            console.log( ulLiStr );
            console.log( olLiStr );
 
            // 将字符串写入ul ol 标签
            oUl.innerHTML = ulLiStr ;
            oOl.innerHTML = olLiStr ;
 
            // 将 ul ol 标签 写入 div标签中
            oBox.appendChild( oUl );
            oBox.appendChild( oOl );
 
            // 获取所有的ul>li
            oUlLis = oUl.querySelectorAll('li');
 
            // 获取所有的ol>li
            oOlLis = oOl.querySelectorAll('li');
 
        }
 
        // 定义函数2 给标签添加事件
        // 参数 绑定事件的事件类型 可以是click mouseover 默认值是 mouseover
        function setEvent( event = 'mouseover' ){
            // 给 父级标签 添加 事件 通过事件委托完成效果
            oBox.addEventListener( event , function(e){
                if( e.target.getAttribute('name') === 'ulLi' ){
                    // 清除所有 ul>li 的 class,active
                    oUlLis.forEach( function(item , key){
                        // item 是 ul>li中 li标签对象
                        // key 是 ul>li中 li标签对象的索引下标
                        // 同时也是 ol>li中 li标签对象的索引下标 
                        item.classList.remove('active');
 
                        // key是ul>li的索引下标 也就是ol>li的索引下标
                        // oOlLs数组可以通过索引下标 获取到 ol>li标签对象
                        oOlLis[key].classList.remove('active');
                    })
 
                    // 给触发事件的ul>li标签添加class,active
                    e.target.classList.add('active');
 
                    // 给触发事件的ul>li标签 对应的ol>li标签添加class,active
                    // 也就是和 e.target 触发事件标签 索引下标相同的 ol>li标签
                    // 也就是获取 e.target标签 index属性的属性值
                    // 标签属性的属性值 都是 字符串类型 需要转化为数值类型
                    oOlLis[ Number( e.target.getAttribute('index') ) ].classList.add('active');
 
                }
            })
        }
 
    </script>
 
</body>
</html>

面向对象 

注意:

  • 之前调用的是变量,现在调用的是对象中存储的属性与属性值 。
  • 确保 this 的指向是对象,当事件绑定 forEach 定时器延时器... 中 this指向 会改变
  • 修改this指向的方法:提前使用变量 存储 原始this指向,使用 变量 替代 this关键词

 代码展示:

<!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>
        * {
            margin: 0;
            padding: 0;
        }
 
        ul,
        ol,
        li {
            list-style: none;
        }
 
        .box {
            width: 800px;
            height: 600px;
            border: 3px solid #000;
            margin: 50px auto;
            display: flex;
            flex-direction: column;
 
        }
 
        .box>ul {
            width: 100%;
            height: 100px;
            display: flex;
 
        }
 
        .box>ul>li {
            flex: 1;
            display: flex;
            justify-content: center;
            align-items: center;
            font-size: 50px;
            background: pink;
            border-right: 2px solid #000;
            border-bottom: 2px solid #000;
            color: #fff;
 
        }
 
        .box>ul>li:last-child {
            border-right: none;
        }
 
        .box>ul>li.active {
            color: red;
            text-decoration: underline;
            background: orange;
        }
 
 
        .box>ol {
            flex: 1;
            position: relative;
 
        }
 
        .box>ol>li {
            width: 100%;
            height: 100%;
            position: absolute;
            top: 0;
            left: 0;
            display: flex;
            justify-content: center;
            align-items: center;
            font-size: 100px;
            background: cyan;
            display: none;
            color: #fff;
        }
 
        .box>ol>li.active {
            display: flex;
        }
    </style>
</head>
 
<body>
 
    <div class="box"></div>
    <!-- 导入外部文件 -->
    <script src="./tab.js"></script>
    <script>
        // 定义数组 模拟数据库数据
        const arr1 = [
            { id: 1, ulLi: '精选', olLi: '精选内容' },
            { id: 2, ulLi: '美食', olLi: '美食内容' },
            { id: 3, ulLi: '百货', olLi: '百货内容' },
            { id: 4, ulLi: '个护', olLi: '个护内容' },
        ];
 
 
        // 获取标签对象 
        const oBox = document.querySelector('.box');
 
        
        // es6 构造函数 通过构造函数生成实例化对象
        const obj = new CreateTabObj(oBox, arr1);
        // 调用动态生成函数
        obj.setPage();
        // 调用点击事件函数,参数为事件类型
        obj.setEvent("click");
 
    </script>
 
</body>
 
</html>

外链构造函数代码:

// 在外部文件中定义构造函数
class CreateTabObj{
    // 构造器 定义属性和属性值
    // element  创建生成选项卡的标签对象
    // msgArr   生成选项开内容的数组
    constructor( element , msgArr ){
        this.ele = element ;
        this.arr = msgArr ;
 
        // 定义属性 存储 面向过程中 需要的全局变量
        this.oUlLis;
        this.oOlLis;
    }
 
    // 构造器外定义函数方法
 
    // 函数1 动态生成页面
    setPage(){
        // 创建固定的标签节点 ul ol 
        const oUl = document.createElement('ul');
        const oOl = document.createElement('ol');
 
        // 定义字符串 存储动态渲染生成的ul>li ol>li
        let ulLiStr = '';
        let olLiStr = '';
 
        // 循环遍历数组 根据数组中的内容动态渲染生成li标签
        
        // 之前是 直接调用 变量 arr1 中 存储的数据 
        // 现在是 调用 实例化对象中arr属性存储的数据
        // arr1 ---> this.arr
        this.arr.forEach( function(item,key){
            // item 是 数组单元存储的数据 也就是 存储数据的对象
            // key 是 数组单元的索引下标
 
            // 第一个ul>li 有 class,active样式
            ulLiStr += key === 0 ? `<li name="ulLi" index="${key}" class="active">${item.ulLi}</li>` : `<li index="${key}" name="ulLi">${item.ulLi}</li>` ;
 
            // 第一个ol>li 有 class,active样式
            olLiStr += key === 0 ? `<li class="active">${item.olLi}</li>` : `<li>${item.olLi}</li>` ;
        });
 
 
        // 将字符串写入ul ol 标签
        oUl.innerHTML = ulLiStr ;
        oOl.innerHTML = olLiStr ;
 
        // 将 ul ol 标签 写入 div标签中
 
        // 标签对象 ---> this.ele
        this.ele.appendChild( oUl );
        this.ele.appendChild( oOl );
 
        // 获取所有的ul>li
        this.oUlLis = oUl.querySelectorAll('li');
 
        // 获取所有的ol>li
        this.oOlLis = oOl.querySelectorAll('li');
    }
 
    // 函数2 添加事件
    // 设定参数 存储事件类型 可以是 click 可以是 mouseover 默认值是 mouseover
    setEvent( event = 'mouseover' ){
        // class 构造函数中 this指向 默认是 对象 
        console.log( this);
 
        // 给 父级标签 添加 事件 通过事件委托完成效果
 
        // 提前定义一个变量 存储 原始this指向
        const _this = this ;
 
        // 事件绑定 中 this指向改变 
 
        this.ele.addEventListener( event , function(e){
            // 事件绑定中 this指向 默认是 事件源 
            // 不再是 对象 
            // 也就是在 事件绑定中 this.属性 不能 正确调用对象中的数据 
 
            if( e.target.getAttribute('name') === 'ulLi' ){
 
                // 清除所有 ul>li 的 class,active
 
                
                _this.oUlLis.forEach( function(item , key) {
 
                    // 给 ul>li 清除 class,active
                    item.classList.remove('active');
                    // 给 索引下标相同的 ol>li 清除 class,active
                    _this.oOlLis[key].classList.remove('active');
                })
 
                // 给 点击的 ul>li 添加 class,active
                e.target.classList.add('active');
 
                // 给 点击的 ul>li 索引下标 相同的 ol>li 添加 class,active
                _this.oOlLis[ Number( e.target.getAttribute('index') ) ].classList.add('active');
 
            }
        })
    }
}

运行结果:

 到此这篇关于javascript实现选项卡功能(面向过程与面向对象)的文章就介绍到这了,更多相关JavaScript 选项卡内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JavaScript实现选项卡功能(面向过程与面向对象)

本文链接: https://www.lsjlt.com/news/138902.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript实现选项卡功能(面向过程与面向对象)
    目录面向过程面向对象 面向过程 注意: ul>li 标签属性中 的index属性值是串联起ol>li与ul>li的关键,通过调用相同索引下标的数组中的不同...
    99+
    2024-04-02
  • JavaScript面向对象编程实现模拟
    目录前言1. 构造函数2. new的过程2.1 基础使用2.2 new.target3. 手动实现一个构造函数前言 每个对象都是一个功能中心,具有明确分工,可以处理信息,处理信息,发...
    99+
    2022-11-13
    JavaScript面向对象 JavaScript OOP
  • 详解Java的面向对象和面向过程
    目录一. 面向对象1. 概念2. 特点二. 面向过程1. 概念2. 特点3. 面向对象与面向过程的对比三. 结语一. 面向对象 既然我们要学习面向对象,那首先得对其基本概念、特性、对...
    99+
    2023-05-20
    Java面向对象 Java面向过程
  • Java中的面向过程与面向对象有什么不同
    Java中的面向过程与面向对象有什么不同?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。面向过程是指,允许在程序中定义函数或者方法。也许你觉得奇怪,难道还有语言不能定义函数方法么...
    99+
    2023-05-31
    面向对象 面向过程 java
  • JavaScript实现烟花特效(面向对象)
    本文实例为大家分享了JavaScript实现烟花特效的具体代码,供大家参考,具体内容如下 本特效使用面向对象编程 分析 OOA 点击触发事件 烟花运动分成两个阶段 ...
    99+
    2024-04-02
  • javascript中怎么通过面向对象创建对象
    本篇文章为大家展示了javascript中怎么通过面向对象创建对象,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。方式一:通过内置Object对象的方式创建 然后通过...
    99+
    2024-04-02
  • python 面向对象之添加功能
    '''**#实现功能**案列姓名:王飞 年龄:30 性别:男 工龄:5我承诺,我会认真教课。王飞爱玩象棋姓名:小明 年龄:15 性别:男 学号:00023102我承诺,我会 好好学习。小明爱玩足球。**#案例题目描述:**1.从案例效果分...
    99+
    2023-01-30
    面向对象 功能 python
  • JavaScript面向对象实现贪吃蛇游戏
    本文实例为大家分享了面向对象的贪吃蛇实现代码,供大家参考,具体内容如下 1 工具对象(Tools.js) 因为要随机生成食物,所以先将生成min-max范围内随机整数的方法提取出来。...
    99+
    2024-04-02
  • JavaScript面向对象实现放大镜案例
    本文实例为大家分享了JavaScript面向对象实现放大镜的具体代码,供大家参考,具体内容如下 效果图 实现原理分析 如图所示 触发鼠标的移动事件时,根据事件对象的 client...
    99+
    2024-04-02
  • JavaScript面向对象的支持怎么实现
    本篇内容介绍了“JavaScript面向对象的支持怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在JavaScript中,我们需要通...
    99+
    2023-06-03
  • python面向对象编程怎么实现
    这篇文章主要介绍“python面向对象编程怎么实现”,在日常操作中,相信很多人在python面向对象编程怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python面向...
    99+
    2024-04-02
  • 课时37:类与对象:面向对象编程
    目录:   一、self是什么   二、Python的魔法方法   三、公有和私有   四、课时37课后习题及答案   ***************** 一、self是什么 ***************** 对象的方法都有一个self...
    99+
    2023-01-30
    课时 面向对象 对象
  • PHP面向对象编程:框架选择与使用
    php 面向对象编程框架选择指南:选择框架: laravel 提供全堆栈特性,symfony 提供组件化灵活性,codeigniter 专注于轻量级和灵活性。使用案例: laravel ...
    99+
    2024-05-10
    php 面向对象 laravel composer php面向对象编程
  • C#面向对象之模拟实现商城购物功能
    本文实例为大家分享了C#实现商城购物功能的具体代码,供大家参考,具体内容如下 商品类 namespace ShoppingSystem {         /// <sum...
    99+
    2024-04-02
  • JavaScript面向对象基础与this指向的示例分析
    这篇文章给大家分享的是有关JavaScript面向对象基础与this指向的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1 、OOP的基础问题1.1什么是面向过程和面向对...
    99+
    2024-04-02
  • JavaScript面向对象编程详细讲解
    这篇文章主要介绍“JavaScript面向对象编程详细讲解”,在日常操作中,相信很多人在JavaScript面向对象编程详细讲解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • java中怎么实现面向对象编程
    这篇文章给大家介绍java中怎么实现面向对象编程,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1:允许将子类的引用付给父类的对象,但子类中的那些不是从父类继承来的成员将不再可见。例:Bus bus=new&n...
    99+
    2023-06-17
  • Kotlin中如何实现面向对象
    Kotlin中如何实现面向对象?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。面向对象面向对象的含义大家应该并不陌生,通过将事物抽象成对象,大大简化了程序的开发难度。我们常用的J...
    99+
    2023-05-31
    kotlin 面向对象 如何实现
  • Java 面向对象通过new揭开对象实例化
    目录概念了解第一种情况第二种情况更正说明: 我之前的的标题有点文不对题,我这篇博客的内容明明说的是:java中对象创建的过程,对内存之种底层的东西,我其实提的不太多。 所以我原来的标...
    99+
    2024-04-02
  • Go中怎么实现面向对象
    这篇文章主要为大家展示了“Go中怎么实现面向对象”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Go中怎么实现面向对象”这篇文章吧。在大家初识 Go 语言时,总会拿其他语言的基本特性来类比 Go ...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作