JavaScript案例——tap切换栏和下拉菜单的其他方法

上一篇文章我用纯js实现了tap切换栏和下拉菜单,这篇试着用其他更简洁的方法来实现这两个效果。

一、下拉菜单

这里举例上一篇文章的微博下拉菜单案例,html和css的部分仍然和上一个一样,这里仅改变js的代码内容

1、用jQuery实现

核心思路:

①当鼠标经过的时候,显示小li里面的ul;当鼠标离开的时候,隐藏小li里面的ul;

②这个nav>li是使用了子代选择器,只选择和nav紧挨着的小li,避免选到了nav的li的li

③$(this).children("ul").show();是指当鼠标移动到小li上,就显示出小li里面的ul。鼠标离开的同理。

此处children("ul").show()表示显示ul,children("ul").hide()表示隐藏ul。

  $(function () {

            // 鼠标经过
            $(".nav>li").mouseover(function () {
                $(this).children("ul").show();
            });
            
            // 鼠标离开
            $(".nav>li").mouseout(function () {
                $(this).children("ul").hide();
            })
        })

总结:使用jQuery的方法比原生js的代码量少了很多,因为jQuery内部有隐式迭代,所以不用像原生一样再利用for循环遍历。

2、用jQuery插件来实现

可以在下面的网站中搜索下拉菜单,去找到需要的样式进行复制。这种方式的优点就是速度快,但如果没有自己需要的样式的话,还需要自己进行修改。

jQuery插件库-收集最全最新最好的jQuery插件 (jq22.com)

二、tap切换栏

1、用jQuery实现

这里举例的是淘宝的服饰精品案例

核心思路:

①核心原理:鼠标经过左侧盒子某个小 li,就让内容区盒子相对应图片显示,其余的图片隐藏。
②需要得到当前小 li 的索引号,就可以显示对应索引号的图片
③ jQuery 得到当前元素索引号$( this ). index ()
④中间对应的图片,可以通过 eq ( index )方法去选择
⑤显示元素show0;隐藏元素 hide()

这里是html和css的内容

<body>
    <div class="wrapper">
        <ul id="left">
            <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>
            <li><a href="#">棉服</a></li>
            <li><a href="#">女裤</a></li>
            <li><a href="#">羽绒服</a></li>
            <li><a href="#">牛仔裤</a></li>
        </ul>
        <div id="content">
            <div>
                <a href="#"><img src="images/女靴.jpg" width="200" height="250" /></a>
            </div>
            <div>
                <a href="#"><img src="images/雪地靴.jpg" width="200" height="250" /></a>
            </div>
            <div>
                <a href="#"><img src="images/冬裙.jpg" width="200" height="250" /></a>
            </div>
            <div>
                <a href="#"><img src="images/呢大衣.jpg" width="200" height="250" /></a>
            </div>
            <div>
                <a href="#"><img src="images/毛衣.jpg" width="200" height="250" /></a>
            </div>
            <div>
                <a href="#"><img src="images/棉服.jpg" width="200" height="250" /></a>
            </div>
            <div>
                <a href="#"><img src="images/女裤.jpg" width="200" height="250" /></a>
            </div>
            <div>
                <a href="#"><img src="images/羽绒服.jpg" width="200" height="250" /></a>
            </div>
            <div>
                <a href="#"><img src="images/牛仔裤.jpg" width="200" height="250" /></a>
            </div>
 
        </div>
 
 
    </div>
</body>
  <style type="text/css">
        * {
            margin: 0;
            padding: 0;
            font-size: 12px;
        }
         
        ul {
            list-style: none;
        }
         
        a {
            text-decoration: none;
        }
         
        .wrapper {
            width: 250px;
            height: 248px;
            margin: 100px auto 0;
            border: 1px solid pink;
            border-right: 0;
            overflow: hidden;
        }
         
        #left,
        #content {
            float: left;
        }
         
        #left li {
            background: url(images/lili.jpg) repeat-x;
        }
         
        #left li a {
            display: block;
            width: 48px;
            height: 27px;
            border-bottom: 1px solid pink;
            line-height: 27px;
            text-align: center;
            color: black;
        }
         
        #left li a:hover {
            background-image: url(images/abg.gif);
        }
         
        #content {
            border-left: 1px solid pink;
            border-right: 1px solid pink;
        }
    </style>

下面是js的内容

   $(function () {
            $("#left li").mouseover(function () {
                var index = $(this).index();
                $("#content div").eq(index).show().siblings().hide();

            })
        })

 总结:

主要的思想就是用index()作为选择器,选择第几个小li;

以及$("#content div").eq(index).show().siblings().hide(),意思是选择第index个content的div让它显示内容,然后它的兄弟则隐藏内容。

2、根据后台真实数据渲染

这里主要是实现和后端交互的tap切换,即数据并不是我们在html写死的,而是会根据后台实时的数据进行渲染。我学的不多,这块是跟着黑马的代码写的,只写出js内容。

核心思路:
这里因为小li是动态生成的,所以注册事件需要使用on()来实现,和上面有所差别。

 (function () {
            // 1. 准备相关数据
            var hotData = [
                {
                    city: "北京", // 城市
                    sales: "25, 179", // 销售额
                    flag: true, //  上升还是下降
                    brands: [
                        //  品牌种类数据
                        { name: "可爱多", num: "9,086", flag: true },
                        { name: "娃哈哈", num: "8,341", flag: true },
                        { name: "喜之郎", num: "7,407", flag: false },
                        { name: "八喜", num: "6,080", flag: false },
                        { name: "小洋人", num: "6,724", flag: false },
                        { name: "好多鱼", num: "2,170", flag: true }
                    ]
                },
                {
                    city: "河北",
                    sales: "23,252",
                    flag: false,
                    brands: [
                        { name: "可爱多", num: "3,457", flag: false },
                        { name: "娃哈哈", num: "2,124", flag: true },
                        { name: "喜之郎", num: "8,907", flag: false },
                        { name: "八喜", num: "6,080", flag: true },
                        { name: "小洋人", num: "1,724", flag: false },
                        { name: "好多鱼", num: "1,170", flag: false }
                    ]
                },
                {
                    city: "上海",
                    sales: "20,760",
                    flag: true,
                    brands: [
                        { name: "可爱多", num: "2,345", flag: true },
                        { name: "娃哈哈", num: "7,109", flag: true },
                        { name: "喜之郎", num: "3,701", flag: false },
                        { name: "八喜", num: "6,080", flag: false },
                        { name: "小洋人", num: "2,724", flag: false },
                        { name: "好多鱼", num: "2,998", flag: true }
                    ]
                },
                {
                    city: "江苏",
                    sales: "23,252",
                    flag: false,
                    brands: [
                        { name: "可爱多", num: "2,156", flag: false },
                        { name: "娃哈哈", num: "2,456", flag: true },
                        { name: "喜之郎", num: "9,737", flag: true },
                        { name: "八喜", num: "2,080", flag: true },
                        { name: "小洋人", num: "8,724", flag: true },
                        { name: "好多鱼", num: "1,770", flag: false }
                    ]
                },
                {
                    city: "山东",
                    sales: "20,760",
                    flag: true,
                    brands: [
                        { name: "可爱多", num: "9,567", flag: true },
                        { name: "娃哈哈", num: "2,345", flag: false },
                        { name: "喜之郎", num: "9,037", flag: false },
                        { name: "八喜", num: "1,080", flag: true },
                        { name: "小洋人", num: "4,724", flag: false },
                        { name: "好多鱼", num: "9,999", flag: true }
                    ]
                }
            ];

            //  2. 根据数据渲染各省热销 sup 模块内容
            // (1) 遍历 hotData对象
            var supHTML = "";
            $.each(hotData, function (index, item) {

                //因为数据不是写死的,所以不能像之前的方法直接写。
                //这里使用了一种新的连接字符的方法:`${}`,这样写的好处是可以换行
                //这里还使用了三元表达式,用来判断flag是true还是false,不同的结果会返还不同的图标内容,所以不能直接写${}
                supHTML += `<li><span>${item.city}</span><span> ${item.sales} <s class=
    ${item.flag ? "icon-up" : "icon-down"}></s></span></li>`;
            });


            // 把生成的5个小li字符串给 sub dom盒子
            $(".sup").html(supHTML);

            // 3. 当鼠标进入 tab 的时候
            // 鼠标经过当前的小li要高亮显示
            $(".province .sup").on("mouseenter", "li", function () {
                index = $(this).index();
                render($(this));
            });

            // 声明一个函数 里面设置sup当前小li高亮还有 对应的品牌对象渲染
            // 这个函数需要传递当前元素进去
            function render(currentEle) {
                currentEle
                    .addClass("active")
                    .siblings()
                    .removeClass();

                // 开始遍历品牌数组
                var subHTML = "";
                // 可以通过hotData[$(this).index()] 得到当前的城市
                // 我们可以通过hotData[$(this).index()].brands 拿到的是城市对象的品牌种类

                $.each(hotData[currentEle.index()].brands, function (index, item) {

                    // 对应城市的每一个品牌对象
                    subHTML += `<li><span>${item.name}</span><span> ${item.num}<s class=
    ${item.flag ? "icon-up" : "icon-down"}
    ></s></span></li>`;
                });

                // 把生成的6个小li字符串给 sub dom盒子
                $(".sub").html(subHTML);
            }


        })();

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
React中实现Tap切换有多种方法,我将为你介绍其中一种常见的实现方式。 首先,你可以使用React的状态管理来控制Tap切换。你可以创建一个父组件,该组件包含多个Tap选项以及需要根据选项显示的内容。通过设置一个状态来跟踪当前选中的Tap选项,然后根据选项的状态来显示对应的内容。 以下是一个示例代码: ```jsx import React, { useState } from 'react'; const Tab = ({ label, content, activeTab, onClick }) => { const isActive = activeTab === label; return ( <div className={`tab ${isActive ? 'active' : ''}`} onClick={() => onClick(label)} > {label} </div> ); }; const TabContent = ({ content, activeTab }) => { return ( <div className="tab-content"> {content[activeTab]} </div> ); }; const TapBar = ({ tabs }) => { const [activeTab, setActiveTab] = useState(tabs[0].label); const handleTabClick = (label) => { setActiveTab(label); }; return ( <div> <div className="tab-bar"> {tabs.map(tab => ( <Tab key={tab.label} label={tab.label} content={tab.content} activeTab={activeTab} onClick={handleTabClick} /> ))} </div> <TabContent content={tabs.reduce((obj, tab) => ({ ...obj, [tab.label]: tab.content }), {})} activeTab={activeTab} /> </div> ); }; const App = () => { const tabs = [ { label: 'Tab 1', content: 'Content for Tab 1' }, { label: 'Tab 2', content: 'Content for Tab 2' }, { label: 'Tab 3', content: 'Content for Tab 3' } ]; return ( <div> <h1>Tabs Demo</h1> <TapBar tabs={tabs} /> </div> ); }; export default App; ``` 在上面的代码中,我们创建了一个`TapBar`组件,它接受一个`tabs`数组作为参数,并通过`map`方法渲染了多个`Tab`组件。每个`Tab`组件都有一个点击事件,当点击时,会调用`handleTabClick`函数来更新当前选中的Tap选项。同时,我们还创建了一个`TabContent`组件来根据选中的Tap选项显示对应的内容。 请记得在样式文件中添加相应的样式以实现Tap的外观和交互效果。 希望能对你有所帮助!如有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值