金色小芝麻

vuePress-theme-reco 金色小芝麻    2021 - 2023
金色小芝麻 金色小芝麻

Choose mode

  • dark
  • auto
  • light
主页
分类
  • JavaScript
  • BUG复盘
  • SVG笔记
  • TypeScript
  • 个人总结
  • CSS笔记
  • 开发工具
  • 前端入门
  • Vue2.0
  • 性能优化
  • 架构学习
  • 每日一题
标签
时间轴
社交
  • 掘金 (opens new window)
author-avatar

金色小芝麻

83

文章

27

标签

主页
分类
  • JavaScript
  • BUG复盘
  • SVG笔记
  • TypeScript
  • 个人总结
  • CSS笔记
  • 开发工具
  • 前端入门
  • Vue2.0
  • 性能优化
  • 架构学习
  • 每日一题
标签
时间轴
社交
  • 掘金 (opens new window)
  • 前端入门

    • 博客搭建过程及相关配置
    • 数组中的16种常用方法
    • JS中的数据类型简析——基本数据类型值
    • JS中的数据类型object基础
    • JS中三种常见的判断
    • 数据类型之间的区别(堆内存Heap VS 栈内存Stack)
    • JS基础练习题及解析
    • 开关灯的小案例
    • JS中数据类型检测方法——typeof
    • 条件判断几个小练习
    • JS循环——for循环
    • 自定义属性实现选项卡小案例
    • 字符串中的12种常用方法
    • DOM操作的简单原理
    • JS实现隔行变色鼠标跟随小案例
    • JS中function的基础知识
    • JS中数组去重的三种方法
    • JS中时间格式化的三种方法
    • JS中URL参数处理的三种方法
    • JS小案例——获取随机验证码
    • DOM操作之——获取DOM标签的9种方式
    • DOM操作之——DOM节点类型及属性
    • DOM操作之——元素的增删改、样式修改、插入内容
    • JS中THIS相关问题梳理
    • JS中的变量提升机制
    • 在全局:私有上下文中:带VAR和不带VAR的区别
    • 作用域和作用域链查找机制
    • JS中堆栈内存的释放问题
    • JS中的闭包机制
    • ES3和ES6定义变量的区别
    • JS中的单例和工厂设计模式
    • JS中的面向对象OOP理论基础
    • 构造函数创建自定义类
    • JS中的原型和原型链
    • Math中常用的9种方法
    • 从一道阿里经典面试题剖析函数三种角色
    • 重写内置call
    • 重写一个内置new
    • 浏览器渲染页面的主体流程
    • 减少DOM的回流和重绘
    • JS中的多种继承方式
    • JS中数据类型检测四种方式的优缺点
    • JS中的正则表达式&&全面梳理
    • 非严格模式 🆚 严格模式的区别
    • 数组方法reduce、filter、flat
    • 获取数组中最大值/最小值的三种基础方法
    • 轮播图——渐隐渐显版
    • 深克隆 VS 浅克隆|深比较 VS 浅比较|回调函数
    • 轮播图——左右切换版
    • 事件及事件绑定、事件对象及事件传播
    • 从在地址栏输入网址到看到页面的过程&&AJAX基础
    • 想自学JS吗?想提升JS底层原理吗?76张脑图带你彻底搞懂原生JS
    • 面试手写API系列
    • 30张脑图带你从零开始学VUE
    • JS中的盒子模型
    • 初识JS-基础中的基础
    • 前端发展简史
    • JS中的三大类输出方式

自定义属性实现选项卡小案例

vuePress-theme-reco 金色小芝麻    2021 - 2023

自定义属性实现选项卡小案例

金色小芝麻 2020-04-08

# 选项卡案例实现

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>选项卡小案例</title>
    <link rel="stylesheet" href="reset.min.css">
    <style>
        .cardBox {
            width: 600px;
            margin: 20px auto;
        }

        .cardBox ul {
            position: relative;
            top: 1px;
        }

        .cardBox ul li {
            float: left;
            margin-right: 20px;
            width: 80px;
            height: 30px;
            text-align: center;
            line-height: 30px;
            border: 1px solid #000;
        }

        .cardBox div {
            width: 600px;
            height: 300px;
            text-align: center;
            line-height: 300px;
            border: 1px solid #000;
            display: none;
        }

        .cardBox li.active {
            background-color: aqua;
            border-bottom-color: aqua;
        }

        .cardBox div.active {
            background-color: aqua;
            display: block;
        }
    </style>
</head>

<body>
    <div class="cardBox" id="cardBox">
        <ul class="clearfix">
            <li class="active">新闻</li>
            <li>娱乐</li>
            <li>图片</li>
        </ul>
        <div class="active">新闻页</div>
        <div>娱乐页</div>
        <div>图片页</div>
    </div>

    <script>
        /* 效果:当点击LI标签让对应的div显示
         * 思路:
         *    1、当点击第一个LI时让第一个LI和第一个div同时加上active的class名,
         *    2、并让其他两个没有active的class名
         * (也可以是点击LI时,先让所有LI和DIV都没有active的class名,
         *      点击谁,让谁有active的class名)
         */
        let cardBox = document.getElementById("cardBox"),
            list = cardBox.getElementsByTagName("li"),
            divs = cardBox.getElementsByTagName("div");
        
        function changeBox(index) {
            // 让点击的这个LI和DIV有选中样式(但是创建函数的时候,还不知道点击的是哪一个LI呢,只有点击的时候才知道,此时我们要把点击的是哪一个作为形参,提供对应的入口) =>index形参变量:点击的是谁,就在执行changeBox的时候,把点击这一项的索引传递给我
            for (var i = 0; i < list.length; i++) {
                list[i].className = "";
                divs[i].className = "";
            }
            list[index].className = "active";
            divs[index].className = "active";
        }
        for (var i = 0; i < list.length; i++) {
            //=>list[i] 获取到的LI元素对象(堆,有很多内置的属性,也可以设置自定义属性)
            // 我们在每一轮循环的时候,给当前元素对象的堆内存中设置一个自定义属性index,属性值存储当前LI元素对象的索引
            list[i].index = i
            list[i].onclick = function () {
                // 传递当前点击这个LI的索引
				// this => 当前点击的这个LI,而我们基于它的自定义属性index,就可以拿到它的索引
                changeBox(this.index);
            }
        }
    </script>
</body>

</html>

# 不能直接用i当作形参的原因

for (var i = 0; i < list.length; i++) {
	list[i].onclick = function () {
		changeBox(i);
	}
}

// 这样写不行的原因:点击每一个LI的时候,绑定事件函数中的i都是3(循环结束后i的结果)
/*
i=0 第一轮循环  i++  
	list[0].onclick = function () {
	此处是创建函数,函数存储的是一堆破字符串,我们看到的i,也只是一个字符
	“changeBox(i);”
	}
i=1 第二轮循环 i++ 
	list[1].onclick = function () {
	“changeBox(i);”
	}
i=2 第三轮循环 i++ 
	list[2].onclick = function () {
	“changeBox(i);”
	}
i=3 循环结束
........
手欠点了第二个LI,触发第二个LI绑定的函数
	changeBox(i)  此时的i已经是循环结束后的3了
*/

欢迎来到 金色小芝麻
看板娘