使用函数封装组件-Tab组件

Tab组件的html和css技巧

  • html技巧-分成菜单和面板两个部分


    1.png
<div class="tab"> /*放在同一个节点里,方便优化元素选择*/
        <ul class="tab-menu">  /*菜单*/
            <li class="first active">First</li>
            <li class="second">Second</li>
            <li class="third">Third</li>
        </ul>
        <div> /*面板*/
            <li class="panel">First</li>
            <li class="panel">Second</li>
            <li class="panel">Third</li>
        </div>
    </div>
  • css技巧-负margin产生缺口


    2.png
/*通过设置负margin和下边框的颜色(白色)产生缺口,具体参数需自己调试*/
margin-bottom: -3px;
border-color: #ccc #ccc #fff #ccc; /*设置边框颜色,顺序为上右下左*/

border: 1px solid transparent; /*设置1px透明边框*/
border-radius: 5px; /*设置边框圆角*/

/*可单独设置边框的四个圆角*/
border-top-right-radius: 5px;
border-top-left-radius: 5px;
border-bottom-right-radius: 5px;
border-bottom-left-radius: 5px;

使用JS触发事件

/*语法*/
var event = new Event(' ');  /* (' ')可填click,change等 */
要触发事件的元素.dispatchEvent(event); 

/*举例*/
var event = new Event('click'); /* click可以改变 */
lis[0].dispatchEvent(event); /*lis[0]表示要触发事件的元素*/
tab.querySelector('.tab-mune li.active').dispatchEvent(event); /*根据选中的元素触发事件:tab.querySelector('.tab-mune li.active')表示选中的元素*/

/*当需要找出Tab组件里里具有active项时,使用for循环语句触发事件*/
for (var i = 0; i < lis.length; i++) {
        if (lis[i].classList.contains('active')) {
            lis[i].dispatchEvent(event);
            break; /*找到active项就跳出循环*/
        }

使用函数封装组件-实现3个Tab组件

  • Tab组件结构完全相同
/*将tab当作函数的参数,调用相应的Tab*/
var tabs = document.querySelectorAll('.tab'); /*选中页面中的3个Tab*/
initTab(tabs[0]); /*调用第一个Tab*/
initTab(tabs[1]); /*调用第二个Tab*/
initTab(tabs[2]); /*调用第二个Tab*/

function initTab(tab) {  
  函数体
}
  • Tab组件的结构(菜单和面板选择器)不相同
/*将tab,菜单和面板选择器都当作函数的参数,调用相应的Tab,函数体内需要用if语句设置菜单选择器和面板选择器的默认值*/
var tabs = document.querySelectorAll('.tab'); /*选中页面中的3个Tab*/
initTab(tabs[0]); /*调用第一个Tab*/
initTab(tabs[1],'menu li',undefined); /*调用第二个Tab,'menu li'表示第一个Tab菜单不同的选择器,undefined(未定义)表示面板选择器的默认值,菜单选择器对应less代码需修改*/
initTab(tabs[2], undefined, '.pane'); /*调用第三个Tab,undefined(未定义)表示菜单选择器的默认值,'.pane'表示与第一个Tab面板不同的选择器,面板选择器对应less代码需修改*/

function initTab(tab,menuSelector,paneSelector) {  
/*if语句设置菜单选择器和面板选择器的默认值*/
  if (menuSelector == undefined) {
        menuSelector = '.tab-menu li'; /*菜单选择器的默认值为.tab-menu li*/
     }
if (paneSelector == undefined) {
         paneSelector = '.panel';  /*面板选择器的默认值为.panel*/
    }
}
 var lis = tab.querySelectorAll(menuSelector);
 var panels = tab.querySelectorAll(paneSelector);
  ......
  • 结合逻辑非和能够转换为false的语句精简if语句
    逻辑非:!
    能够转换为false的语句:
    null;
    NaN;
    0;
    空字符串(“”);
    undefined;
    if语句设置菜单选择器和面板选择器的默认值可精简为:
  if (!menuSelector) {
        menuSelector = '.tab-menu li'; /*菜单选择器的默认值为.tab-menu li*/
     }
if (!paneSelector) {
         paneSelector = '.panel';  /*面板选择器的默认值为.panel*/
    }
}

检测内容是否为空

/*当value的值为空时,用alert弹出警告提示*/
var value = Text.value; //<input type="text" value=" " class="text-input">中value的没有默认值有空格的时候什么也不会输出,空格也相当于内容,没有默认值可以不用写value
    console.log('hello', value);
    if (!value) {
        alert('请输入内容!');
        return;
    }

    var value = Text.value.trim();//用 text.value.trim() 去掉空格

逻辑或的使用方法

/*当num的值大于10或等于0时输出ok,否则输出num本身的值*/
 if(num > 10 || num == 0) {
        console.log('ok');
    }
  • 短路运算
function a() {
    console.log('a');
    return 1;
}

function b() {
    console.log('b');
    return 2;
}

var ret = a() || b();
console.log('result',ret);
/*运算结果为
a 
result 1
因为函数a的表达式返回1,即true,不会执行函数b*/
function a() {
    console.log('a');
    return 0;
}

function b() {
    console.log('b');
    return 2;
}

var ret = a() || b();
console.log('result',ret);
/*运算结果为
a 
b 
result 2
因为函数a的表达式返回0,即false,会执行函数b*/

因此,还可以精简if语句

menuSelector = menuSelector || '.tab-menu li';
paneSelector = paneSelector || ".panel";

对象-为了解决函数参数太多不好对应,函数参数最好不超过4个

  • 简化函数参数
 /*先将可选参数统一命名,然后将数据放到里面,中间用逗号分隔*/
var options = {     
    menuSelector: false,
    paneSelector: '.pane',
    autoPlay: true,
};
function initTab(tab, options) {
}
  • 使用options对象
initTab(tabs[0]);
initTab(tabs[1], {
    menuSelector: '.menu li'
});
var options = {
    menuSelector: false,
    paneSelector: '.pane',
    autoPlay: true,
};
initTab(tabs[2], {
    paneSelector: '.pane'
});

function initTab(tab, menuSelector, paneSelector,autoPlay) {
function initTab(tab, options) {
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,444评论 25 707
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,357评论 0 17
  • 幸福是一个永恒话题,拥有一个幸福美满的家庭是每一个人的心愿。 如何才能拥有幸福?这个话题有点大,在讲这个话题前,我...
    心理咨询师余煜明阅读 278评论 2 1
  • 我有了女朋友 异地的那种 她很优秀 会做饭 会弹琴会跳舞会唱歌 会说话 超出了我的预期 几时感到我这条烂命竟有如...
    踪迹阿阅读 142评论 0 1
  • 之前无意间在微信上看到李筱懿的文章,当时吸引我的是公众号的名字 “做一个灵魂有香气的女子”作为一个女子,在这个看...
    elina_zml阅读 702评论 0 0