js之选项卡

接触js也有几天了,今天研究了一下选项卡的编写,中间磕磕绊绊,好多疑问,不过经过百度等各渠道查找,解决了遇到的问题,也做出了想要的效果。下面我放上自己的代码,也说一下遇到的困惑以及解决的办法。

选项卡需求:

  1. 点击按钮背景色变色,其余按钮背景色回复默认样式;
  2. 点击按钮时,让下方盒子内容联动。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="keywords" content="">
    <meta name="description" content="">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <title>Title</title>
    <link rel="icon" href="">
    <style>
        * {
            margin: 0;
            padding: 0;
            list-style: none;
        }
        .tab {
            position: relative;
            bottom: -1px;
            overflow: hidden;
        }
        .tab li {
            float: left;
            width: 100px;
            height: 50px;
            line-height: 50px;
            border: 1px solid #ccc;
            box-sizing: border-box;
            text-align: center;
        }
        .box {
            clear: both;
            width: 500px;
            height: 500px;

        }
        .box li {
            width: 100%;
            height: 100%;
            text-align: center;
            line-height: 500px;
            background: aquamarine;
            display: none;
        }
        .select {
            background: aquamarine;
            display: block !important;
        }
        .tab .select{
            border-bottom: none;
        }
    </style>
</head>
<body>
<ul class="tab">
    <li class="select">河南</li>
    <li>北京</li>
    <li>重庆</li>
    <li>天津</li>
    <li>山东</li>
</ul>
<ul class="box">
    <li class="select">烩面</li>
    <li>烤鸭</li>
    <li>小面</li>
    <li>狗不理</li>
    <li>煎饼</li>
</ul>
<script>
    var oTab = document.getElementsByClassName("tab");
    var oTabLis = oTab[0].getElementsByTagName("li");
    var oBox = document.getElementsByClassName("box");
    var oBoxLis = oBox[0].getElementsByTagName("li");

    function change(index) {  //index:给函数传入的一个形参,一个入口,实现方法的时候我们不知道用户点击哪一个li,设定一个入口,当用户点击需要页卡切换的时候,只要执行change这个方法,并把点击这个li的索引传递给我们,我们就可以在集合中通过索引获取当前点击的这个li对象
        for (var i = 0; i < oTabLis.length; i++) {
            oTabLis[i].className = ""; //让所有的li移除select样式类
            oBoxLis[i].className = "";
        }

        //让当前点击的li有选中的样式
        oTabLis[index].className = "select";
        oBoxLis[index].className = "select";
    }

     //给每一个li绑定点击事件,点击的时候执行change方法,把当前点击li的索引传递进来,实现页卡的切换。
    for (var i = 0; i < oTabLis.length; i++) {
        oTabLis[i].myIndex = i; //这个是我遇到最困惑的地方,我在下边详细说一下。这标记为a处吧
        oTabLis[i].onclick = function () {
            change(this.myIndex);
        }
    }
</script>
</body>
</html>

这里我说的都是a处的内容,也就是点击事件的部分。如果此处这样写:

  for (var i = 0; i < oTabLis.length; i++) {

        oTabLis[i].onclick = function () {
            change(i);
        }

乍一看,没有问题,但是你会发现运行不出来,这是什么情况呢?我们不妨控制台输出一下

 for (var i = 0; i < oTabLis.length; i++) {

        oTabLis[i].onclick = function () {
           // change(i);
              console.log(i);
        }

你会发现,不管点击哪一个li,输出的结果都是5,也就是此处的i并不是想象中点击的这个li的索引。这就很明显了,肯定是change(i)这里出现了问题。那么为什么出现这样的问题呢?

首先,我们要搞清楚,函数分为定义函数和执行函数,在这里给元素点击事件绑定方法,点击才执行,此处绑定属于创建函数,空间中存储的都是字符串:也就是说,这里的i不是变量,而是字符。因此有了下面的输出:

//第一轮
 oTabLis[0].onclick = function () {
              console.log(i);

//第二轮
 oTabLis[1].onclick = function () {
              console.log(i);
……
//第五轮
 oTabLis[5].onclick = function () {
              console.log(i);

//循环结束的时候,i=5

循环结束的时候,i的值是5。假设用户开始点击第二个li,开始执行第二个绑定方法(方法执行:形成一个新的作用域,把之前空间中存储的字符串转化为代码执行,console.log(i),但是此时输出的是循环结束时的5)。

所以我们用自定义属性,有了以下的代码:

   for (var i = 0; i < oTabLis.length; i++) {
        oTabLis[i].myIndex = i;//用来存储每次循环i的值
        oTabLis[i].onclick = function () {
            change(this.myIndex);//此处需要传递当前点击这个li的索引
           //this:当前点击的这个li
           //this.myIndex:当前点击这个li的myIndex这个自定义属性的值
        }
    }

i=0
 oTabLis[0].myIndex = 0;
i=1
 oTabLis[1].myIndex = 1;
i=2
 oTabLis[2].myIndex = 2;
i=3
 oTabLis[3].myIndex = 3;
i=4
 oTabLis[4].myIndex = 4;
//这里相当于给每个li添加了一个便签,方便取用。

以上就是我对选项卡的理解以及遇到的问题,如有表达错误的地方,请及时提出!

原文地址:https://www.cnblogs.com/wangxingren/p/10122173.html

时间: 2024-10-03 22:38:55

js之选项卡的相关文章

js实现选项卡

通过JavaScript实现如上选项卡切换的效果. 实现思路: 一.HTML页面布局 选项卡标题使用ul..li 选项卡内容使用div 二.CSS样式制作 整个选项卡的样式设置 选项卡标题的样式设置 选项卡内容的样式设置 一开始只显示一个选项卡内容,其它选项卡内容隐藏. 三.JS实现选项卡切换 获取选项卡标题和选项卡内容 选项卡内容多个,需要循环遍历来操作,得知哪个选项卡和哪个选项内容匹配 通过改变DOM的css类名称,当前点击的选项卡显示,其它隐藏 <!--代码一--><!DOCTYP

用html+css+js实现选项卡切换效果

文章转载自:http://tongling.github.io/JSCards/ 用html+css+js实现选项卡切换效果 使用之前学过的综合知识,实现一个新闻门户网站上的常见选项卡效果: 文字素材: 房产: 275万购昌平邻铁三居 总价20万买一居 200万内购五环三居 140万安家东三环 北京首现零首付楼盘 53万购东5环50平 京楼盘直降5000 中信府 公园楼王现房 家居: 40平出租屋大改造 美少女的混搭小窝 经典清新简欧爱家 90平老房焕发新生 新中式的酷色温情 66平撞色活泼家居

用js实现选项卡切换效果

这是要实现的效果图: 一.HTML页面布局 <!-- HTML页面布局 --><ul class="tab_menu"> <li class="selected">房产</li> <li>家居</li> <li>二手房</li></ul><div class="tab_box"> <div> 275万购昌平邻铁三居

JS笔记-选项卡的重用

以三个选项卡举例: html部分 <style> *{padding:0;margin:0;} a{text-decoration: none;} .clearfix:after{display: block;content:'';clear: both;} .clearfix{zoom:1;} .fl{float: left;} .tab{ width:400px; margin: 10px;} .tab div{display:none; height:150px;text-align:c

JS实现选项卡切换——原生与JQ

原生 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Conte

Jquery&amp;JS简单选项卡

结果,如图 为了明显,用绿色+红色 第一步:静态布局 先写html代码和css样式 要点一:  ul li都为块级元素,可以用height,但是里面字体不居中,我们用line-height,即达到居中,又设定行高. 要点二:ul的高度与要显示的选项li的高度相等,因为li要把ul的底边掩盖掉.其他不显示的li的行高设置ul的高度-1,留出1个像素的底边显示. <style type="text/css"> *{margin:0; padding:0; font:12px/1

原生js实现选项卡效果

<!DOCTYPE html><html><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta name="viewport" content="width=device-width; initial-scale=1

原生js解决选项卡里套选项卡的问题

今天来看一个稍微复杂的例子,选项卡里套选项卡,先来看看布局: <div id="box"> <div id="tabl" class="tabL"> <a href="javascript:void(0)">模块1</a> <a href="javascript:void(0)">模块2</a> <a href="jav

js实现选项卡功能

1.css .liclick{ border: 1px black solid; background: #fff; float: left; width: 80px; height: 35px; line-height: 35px; text-align: center; } .li{ border: 1px black solid; background: #ccc; float: left; width: 80px; height: 35px; line-height: 35px; tex