原生JS实现Tab栏切换功能的示例代码

 更新时间:2026年04月12日 13:49:04   作者:vmiao  
本文主要介绍了如何使用JavaScript实现一个简单的商品展示页面,包括前置知识点的讲解、功能模块的编写以及易错点的总结,如对象解构、事件绑定和箭头函数的使用等,需要的朋友可以参考下

一、效果展示

图片展示:

效果展示视频:(忽略清朝画质)

二、前置知识点

1.解构赋值:数组解构、对象解构
2.事件委托,利用冒泡原理为多个元素绑定事件
3.forEach()--遍历数组,循环;filter()筛选数组
4.箭头函数

三、练习素材(html+css)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>第一天练习</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        li {
            list-style: none;
        }
        a {
            text-decoration: none;
        }
        .viewPort {
            width: 1024px;
            height: 780px;
            margin: 0 auto;
        }
        .list {
            margin-top: 30px;
            display: flex;
            width: 1024px;
            flex-wrap: wrap;
        }
        .item {
            width: 240px;
            margin-left: 10px;
            padding: 20px 30px;
            transition: all .5s;
            margin-bottom: 20px;
        }
        .item:nth-child(4n) {
            margin-left: 0;
        }
        .item:hover {
            box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2);
            transform: translate3d(0, -4px, 0);
            cursor: pointer;
        }
        .item img {
            width: 100%;
        }
        .item .name {
            font-size: 18px;
            margin-bottom: 10px;
            color: #666;
        }
        .item .price {
            font-size: 22px;
            color: firebrick;
        }
        .item .price::before {
            content: "¥";
            font-size: 14px;
        }
        .filter {
            display: flex;
            width: 990px;
            margin: 0 auto;
            padding: 50px 30px;
        }
        .filter a {
            padding: 10px 20px;
            background: #f5f5f5;
            color: #666;
            text-decoration: none;
            margin-right: 20px;
        }
        .filter a:active,
        .filter a:focus {
            background: #05943c;
            color: #fff;
        }
    </style>
</head>
<body>
    <div class="viewPort">
        <div class="filter">
            <a data-index="1" href="javascript:;" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >0-100元</a>
            <a data-index="2" href="javascript:;" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >100-300元</a>
            <a data-index="3" href="javascript:;" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >大于300元</a>
            <a href="javascript:;" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >全部区间</a>
        </div>
        <div class="list">
            <!-- <div class="item">
                <img src="" alt="">
                <p class="name"></p>
                <p class="price"></p>
            </div> -->
        </div>
    </div>
    <script>
        // 2. 初始化数据
        const goodsList = [
            {
                id: '4001172',
                name: '称心如意手摇咖啡磨豆机咖啡豆研磨机',
                price: '289.00',
                picture: 'https://yanxuan-item.nosdn.127.net/84a59ff9c58a77032564e61f716846d6.jpg',
            },
            {
                id: '4001594',
                name: '日式黑陶功夫茶组双侧把茶具礼盒装',
                price: '288.00',
                picture: 'https://yanxuan-item.nosdn.127.net/3346b7b92f9563c7a7e24c7ead883f18.jpg',
            },
            {
                id: '4001009',
                name: '竹制干泡茶盘正方形沥水茶台品茶盘',
                price: '109.00',
                picture: 'https://yanxuan-item.nosdn.127.net/2d942d6bc94f1e230763e1a5a3b379e1.png',
            },
            {
                id: '4001874',
                name: '古法温酒汝瓷酒具套装白酒杯莲花温酒器',
                price: '488.00',
                picture: 'https://yanxuan-item.nosdn.127.net/44e51622800e4fceb6bee8e616da85fd.png',
            },
            {
                id: '4001649',
                name: '大师监制龙泉青瓷茶叶罐',
                price: '139.00',
                picture: 'https://yanxuan-item.nosdn.127.net/4356c9fc150753775fe56b465314f1eb.png',
            },
            {
                id: '3997185',
                name: '与众不同的口感汝瓷白酒杯套组1壶4杯',
                price: '108.00',
                picture: 'https://yanxuan-item.nosdn.127.net/8e21c794dfd3a4e8573273ddae50bce2.jpg',
            },
            {
                id: '3997403',
                name: '手工吹制更厚实白酒杯壶套装6壶6杯',
                price: '99.00',
                picture: 'https://yanxuan-item.nosdn.127.net/af2371a65f60bce152a61fc22745ff3f.jpg',
            },
            {
                id: '3998274',
                name: '德国百年工艺高端水晶玻璃红酒杯2支装',
                price: '139.00',
                picture: 'https://yanxuan-item.nosdn.127.net/8896b897b3ec6639bbd1134d66b9715c.jpg',
            },
        ]

四、功能JS模块

1.渲染函数的封装

function(arr){
    let str = "" //声明一个空字符串
    arr.forEach(item => {
        const {name,picture,price} = item //对象解构,快速批量的声明变量,缩减代码量
        str += `
            <div class="item">
                <img src=${picture} alt="">
                <p class="name">${name}</p>
                <p class="price">${price}</p>
            </div> 
        ` 
        //arr中有几个元素就渲染几个div,将数据填入 ${},动态渲染
    })
    document.queryselector(".list").innerHTML = str //将字符串放入.list的div盒子中
   }
   render(goodsList) //调用函数

2.绑定点击事件

    //事件委托,为父元素绑定点击事件
    document.queryselector("filter").addEventListener("click",e =>{
        const {tagName,dataset} = e.target //获取点击对象+对象解构
        let arr = goodsList //因为如果都不点击就显示全部元素,所以初始值将arr直接等于goodsList
        if(tagName === "A"){ //点击a标签时才触发,点击父元素空白区域不触发
            if (dataset.index === "1") {
                    arr = goodsList.filter(item => item.price > 0 && item.price <= 100)
                } else if (dataset.index === "2") {
                    arr = goodsList.filter(item => item.price >= 100 && item.price <= 300)
                } else if (dataset.index === "3") {
                    arr = goodsList.filter(item => item.price >= 300)
                }
                render(arr)
        }
    })

五、易错点

1.对象解构时,例如const {name,price} = item //这里是花括号,数组解构时是[]。并且对象解构时声名的变量名必须和数据中的属性名一致

2.函数不调用不执行,封装好函数后一定要调用执行

3.箭头函数省略原则:参数只有一个时,()可以省略;若函数中只有一句return语句时,{}和return都可以省略;!!!没有参数时,()一定不要省

以上就是原生JS实现Tab栏切换功能的示例代码的详细内容,更多关于JS Tab栏切换功能的资料请关注脚本之家其它相关文章!

相关文章

  • js实现iframe动态调整高度的代码

    js实现iframe动态调整高度的代码

    iframe,尤其是不带边框的iframe因为能和网页无缝的结合从而不刷新页面的情况下更新页面的部分数据成为可能,可是iframe的大小却不像层那样可以“伸缩自如”,所以带来了使用上的麻烦,给iframe设置高度的时候多了也不好,少了更是不行,现在,让我来告诉大家一种iframe动态调整高度的方法,主要是以下JS函数:
    2008-01-01
  • JavaScript设计模式经典之命令模式

    JavaScript设计模式经典之命令模式

    命令模式(Command)的定义是:用来对方法调用进行参数化处理和传送,经过这样处理过的方法调用可以在任何需要的时候执行。接下来通过本文给大家介绍JavaScript设计模式经典之命令模式,需要的朋友参考下
    2016-02-02
  • Bootstrap多级菜单的实现代码

    Bootstrap多级菜单的实现代码

    这篇文章主要介绍了Bootstrap多级菜单的简单实现代码,需要的朋友可以参考下
    2017-05-05
  • Firefox下无法正常显示年份的解决方法

    Firefox下无法正常显示年份的解决方法

    在用Firefox上一些网站会看到这样的显示108年1月26日,而IE显示为2008年1月26日原因是javascrīpt的兼容性问题
    2014-09-09
  • javascript实现在网页任意处点左键弹出隐藏菜单的方法

    javascript实现在网页任意处点左键弹出隐藏菜单的方法

    这篇文章主要介绍了javascript实现在网页任意处点左键弹出隐藏菜单的方法,设计鼠标事件及css样式操作的相关技巧,需要的朋友可以参考下
    2015-05-05
  • js eval函数使用,js对象和字符串互转实例

    js eval函数使用,js对象和字符串互转实例

    下面小编就为大家带来一篇js eval函数使用,js对象和字符串互转实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • JS操作Cookies的小例子

    JS操作Cookies的小例子

    这篇文章介绍了JS操作Cookies的小例子,有需要的朋友可以参考一下
    2013-10-10
  • TypeScript 装饰器定义

    TypeScript 装饰器定义

    这篇文章主要介绍了TypeScript 装饰器定义,装饰器是一种新的声明,它可以作用于类声明 、方法 、访问器 、属性以及参数上,下面我们就来看看TypeScript 装饰器的具体定义吧,需要的朋友可以参考一下,希望对你有所帮助
    2021-12-12
  • 一文详解令人抓狂的JS赋值顺序

    一文详解令人抓狂的JS赋值顺序

    在JavaScript编程语言中,变量赋值是基础且核心的概念,正确理解和运用变量赋值不仅关系到代码的准确性,还影响着代码的性能和可维护性,这篇文章主要介绍了JS赋值顺序的相关资料,需要的朋友可以参考下
    2025-08-08
  • 使用JS获取当前地理位置方法汇总

    使用JS获取当前地理位置方法汇总

    这篇文章主要介绍了使用JS获取当前地理位置方法汇总,需要的朋友可以参考下
    2014-12-12

最新评论