tab切换,所需的 UI 只有两组元素 - Header 和 Tab,下面介绍几种不同的实现方法和他们的优缺点

本文主要说一些 CSS 的实现方法。最好的方法是 第四种 => label + input 的实现方式。

1.首先来个JS的实现办法。JS的实现往往是比较简单的。本文主讲css实现,js的css就不细写了。

其实没有什么逻辑,就是 a 触发 b,修改 class。简简单单,平平淡淡。

  • 实现思路 => 通过点击 Header 来触发 Tab 的display属性。

    • style
    #tabGroup li {
    display: none;
    }
    #tabGroup .current {
    display: block;
    }
    • body
    <nav id="navGroup">
    <h2>tab1</h2>
    <h2>tab2</h2>
    <h2>tab3</h2>
    </nav>
    <ul id="tabGroup">
    <li class="current">content1</li>
    <li>content2</li>
    <li>content3</li>
    </ul>
    • js
    const navGroup = document.getElementById("navGroup").getElementsByTagName("h2");
    const tabGroup = document.getElementById("tabGroup").getElementsByTagName("li");
    for (let i = 0; i < navGroup.length; i++) {
    navGroup[i].onclick = function () {
    for (let k = 0; k < tabGroup.length; k++) {
    tabGroup[k].style.display = "none";
    }
    tabGroup[i].style.display = "block";
    }
    }
  • 缺点:用到了 JS。(其实也不能说是什么缺点,大概只是人类的偏好,和为了衬托 CSS 的实现吧。


概述:其实 CSS 的方法,主要是标记。是谁来决定 Tab 的高亮?是谁来决定 Header 的高亮? => 有时候点击不一定代表着记录。 所以,我们要努力让点击产生效果,撬动 CSS。

2.CSS方法 - 锚点实现 => 跳转到名为孤独的锚点,并且将孤独的情绪放在页面之上。

锚点的实现本身是有局限性的。因为它将 元素id放于页面顶部的特性,当页面高度很高的时候,就挡住了Header栏。

有时候,不将 body 的 height 设为最大,你是看不出来的。所以我这里故意将 body 设为 1000px。

  • 实现思路 => 通过伪元素 :target 来高亮被命运选中的元素 => 那么 header 呢?header 如何来决定谁来高亮它 - 答案是没有,它被无情的抛弃了。

    • html
    <nav class="tab-header" id="test">
    <a href="#tab1" class="header-item">Tab1</a>
    <a href="#tab2" class="header-item">Tab2</a>
    <a href="#tab3" class="header-item">Tab3</a>
    </nav>
    <ul class="tab-content">
    <li class="content-item" id="tab1">content1</li>
    <li class="content-item" id="tab2">content2</li>
    <li class="content-item" id="tab3">content3</li>
    </ul>
    • css
    body,p,div{margin: 0;}
    h2{margin: 0;font-size:100%;}
    ul{margin: 0;padding: 0;list-style: none;}
    a{text-decoration: none;color:inherit;} .tab-header,
    .tab-content {
    margin: 0 auto;
    }
    .tab-header {
    width: 600px;
    height: 30px;
    background-color: #089e8a;
    font-size: 0;
    text-shadow: 0 0 10px #000;
    cursor: pointer;
    }
    .tab-content {
    width: 600px;
    height: 400px;
    overflow: hidden;
    }
    .header-item {
    display: inline-block;
    width: 33%;
    font-size: 16px;
    line-height: 30px;
    text-align: center;
    }
    .header-item:hover {
    color: #fff;
    }
    .header-item:target {
    background: #6c9;
    }
    .content-item {
    width: 100%;
    height: 100%;
    text-indent: 2em;
    background-color: #6c9;
    } body {
    /* position: fixed; */
    height: 1000px;
    }
  • 缺点:1.对Header的高亮束手无测 2.锚点的限制 => 高度一高的时候,锚点跳转遮住了导航栏。

3.CSS方法实现 => 锚点实现 => 关于前者的改善 => 通过 :target我们能选择到 tab,谁来选中 header 的问题。

女孩的心灵,是我触不可及的地方。就如同这里的 Header 一样,我们都需要一座桥。

  • 实现原理:为了让 Header 被点击后,能够锚点一起改变样式 => 我们将锚点的 tab 放在 Header 的上方就行了。

    因为他们是兄弟,而且 tab 是哥哥。 => 开弓没有回头箭,css找不到之前的兄弟元素,却可以找到之后的兄弟元素。

    • css => 利用兄弟元素选择器 ~ => .brother:target ~ .弟弟元素 {...}
    body,p,div{margin: 0;}
    h2{margin: 0;font-size:100%;}
    ul{margin: 0;padding: 0;list-style: none;}
    a{text-decoration: none;color:inherit;} ul {
    position: relative;
    margin: 0 auto;
    width: 600px;
    height: 400px;
    overflow: hidden;
    font-size: 0;
    } li {
    width: 33.3%;
    display: inline-block;
    font-size: 12px;
    }
    .header-item {
    display: inline-block;
    width: 100%;
    line-height: 30px;
    height: 30px;
    background: #089e8a;
    border-right: 1px solid #fff;
    text-align: center;
    text-shadow: 0 0 10px #000;
    }
    .header-item:hover {
    background: #6c8;
    }
    .content-item {
    position: absolute;
    top: 30px;
    left: 0;
    width: 600px;
    height: 370px;
    background: #6c9;
    }
    .current {
    z-index: 1;
    }
    .content-item:target {
    z-index: 1;
    }
    .content-item:target ~ .header-item {
    background: #6c9;
    }
    body {
    height: 1200px;
    }
    • html => 真正修改的其实 html 结构。
    <ul>
    <li>
    <p id="tab1" class="content-item current">content1</p>
    <a class="header-item" href="#tab1">Tab1</a>
    </li>
    <li>
    <p id="tab2" class="content-item">content2</p>
    <a class="header-item" href="#tab2">Tab2</a>
    </li>
    <li>
    <p id="tab3" class="content-item">content3</p>
    <a class="header-item" href="#tab3">Tab3</a>
    </li>
    </ul>
  • 缺点:锚点的技术限制始终存在,科技是一点点进步的,下一步,我们来解决锚点。

intel 芯片的厚度,每年都在缩小,每次到达 厚度的极限的时候 => 就是它们换材料的时候了。 => 其实根本没有什么极限,只是没有找到方法罢了。

4.CSS实现 => 使用 label + input 实现

  • 实现原理:label 触发 input-ratio 的点击(label的特性) => 元素顺序:ratio-label-p => 通过 ratio 特性:checked选中 label 和 p 分别改变样式。

    标记 和 桥梁。都有了。

    • html
    <ul>
    <li>
    <input class="header-anchor" name="nav" type="radio" id="tab1" checked>
    <label class="header-item" for="tab1">Tab One</label>
    <p class="content-item current">content1</p>
    </li>
    <li>
    <input class="header-anchor" name="nav" type="radio" id="tab2" checked>
    <label class="header-item" for="tab2">Tab Two</label>
    <p class="content-item item2">content2</p>
    </li>
    <li>
    <input class="header-anchor" name="nav" type="radio" id="tab3" checked>
    <label class="header-item" for="tab3">Tab Three</label>
    <p class="content-item item3">content3</p>
    </li>
    </ul>
    • css
    body,p,div{margin: 0;}
    h2{margin: 0;font-size:100%;}
    ul{margin: 0;padding: 0;list-style: none;}
    a{text-decoration: none;color:inherit;} ul {
    margin: 0 auto;
    width: 600px;
    height: 400px;
    overflow: hidden;
    font-size: 0;
    } li {
    width: 33.3%;
    display: inline-block;
    font-size: 12px;
    }
    .header-anchor {
    display: none;
    }
    .header-item {
    display: inline-block;
    width: 100%;
    height: 30px;
    line-height: 30px;
    background: #089e8a;
    text-align: center;
    border-right: 1px solid #6c9;
    cursor: pointer;
    }
    .header-item:hover {
    color: #fff;
    }
    .content-item {
    position: relative;
    width: 600px;
    height: 370px;
    background: #6c9;
    text-indent: 2em;
    }
    .item2 {
    margin-left: -100%;
    }
    .item3 {
    margin-left: -200%;
    }
    body {
    height: 1200px;
    }
    .header-anchor:checked ~ .header-item {
    background: #6c9;
    }
    .header-anchor:checked ~ .content-item {
    z-index: 1;
    }
  • 缺点:多了一个元素?如果这都算缺点。

前端实现Tab切换栏的更多相关文章

  1. Tab切换栏

    // Tab切换栏 function setTab(name, m, n) { for (var i = 1; i <= n; i++) { var menu = document.getEle ...

  2. element UI中的tab切换栏

    html代码:(用的是el-tab组件) <el-tabs v-model="activeIndex" type="border-card" @tab-c ...

  3. 谈谈一些有趣的CSS题目(八)-- 纯CSS的导航栏Tab切换方案

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  4. 微信小程序tab切换,可滑动切换,导航栏跟随滚动实现

    简介 看到今日头条小程序页面可以滑动切换,而且tab导航条也会跟着滚动,点击tab导航,页面滑动,切导航栏也会跟着滚动,就想着要怎么实现这个功能 像商城类商品类目如果做成左右滑动切换类目用户体验应该会 ...

  5. 原生JS实现tab切换--web前端开发

    tab切换非常常见,应用非常广泛,比较实用,一般来说是一个网站必不可少的一个效果.例如:https://123.sogou.com/中的一个tab部分: 1.案例源代码 <!DOCTYPE ht ...

  6. 前端tab切换 和 validatejs表单验证插件

    一.tab切换 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  7. jq 版的tab切换

    ta切换是在前端中非常常见的一种效果,网上的效果很多.但是我觉得下面这种方法最好,把tab效果封装成一个函数 tabs,这个函数要配合jq使用. var tabs = function (tab, c ...

  8. CSS3 :target伪类实现Tab切换效果

    用:target伪类实现Tab切换效果真的非常简单!简单到什么程度呢?它只需要下面这些代码. style.css: .song-info { position: absolute; backgroun ...

  9. 如何用RadioButton做一个底部的切换栏

    上面的效果是用Radio进行制作的,一般我们做底部的切换栏的时候需要让按钮和文字都有一个选中的状态,然后根据点击不同的按钮触发不同的页面,这里的页面一般都是fragment做的.这里我们不讨论复杂的东 ...

随机推荐

  1. php断点续传

    http://www.cnblogs.com/xproer/archive/2012/10/26/2741264.html

  2. 关于对H264码流的TS的封装的相关代码实现

    1 写在开始之前 在前段时间有分享一个H264封装ps流到相关文章的,这次和大家分享下将H264封装成TS流到相关实现,其实也是工作工作需要.依照上篇一样,分段说明每个数据头的封装情况,当然,一样也会 ...

  3. Metasploit的使用下篇——漏洞攻击

    一.上文总结 上篇当中主要通过开启的端口对目标主机进行攻击,最后成功做到了连接不过却不能查看到telnet的登陆用户名和密码,目前来看有两个原因:第一.我对于靶机telnet的设置有问题,没有设置相应 ...

  4. bzoj 4504: K个串 可持久化线段树+堆

    题目: Description 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一 个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计一次). 兔子们想 ...

  5. 洛谷【P1561】[USACO12JAN]爬山Mountain Climbing

    我对\(Jhonson\)算法的理解:https://www.cnblogs.com/AKMer/p/9863620.html 题目传送门:https://www.luogu.org/problemn ...

  6. 洛谷【P1303】A*B Problem

    题目传送门:https://www.luogu.org/problemnew/show/P1303 高精度乘法板子题,灵性地回忆一下小学时期列竖式的草稿纸即可. 时间复杂度:\(O(len^2)\) ...

  7. 快速排序的JavaScript实现

    思想 分治的思想,将原始数组分为较小的数组(但没有像归并排序一样将它们分隔开). 主元选择: 从数组中任意选择一项作为主元,通常为数组的第一项,即arr[i]:或数组的中间项, arr[Math.fl ...

  8. Azure上部署FTP服务

    FTP是个比较复杂的协议,其协议分为控制层和数据层,工作模式分为主动和被动两种模式. 在默认的Active模式下其工作原理如下: 可以看到,客户端发起FTP的请求道服务器端,FTP的端口是21.用户在 ...

  9. 安装mariadb并修改配置文件

    实验环境:CentOS7 #安装mariadb-server包#修改mariadb配置文件/etc/my.cnf.d/server.cnf#添加 skip_name_resolve=ON #不执行将I ...

  10. linux strace-跟踪进程的系统调用或是信号产生情况,lstrace-跟踪己丑年调用库函数情况,进程跟踪调试命令

    本工具可以用来做大多数排除,比如mount一个NFS,很慢,找不出原因,我们可以使用strace命令来跟中mount这个经常所有的调用过程. strace 命令是一种强大的工具,它能够显示所有由用户空 ...