前端实现Tab切换栏
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>
- css => 利用兄弟元素选择器
- 缺点:锚点的技术限制始终存在,科技是一点点进步的,下一步,我们来解决锚点。
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切换栏的更多相关文章
- Tab切换栏
// Tab切换栏 function setTab(name, m, n) { for (var i = 1; i <= n; i++) { var menu = document.getEle ...
- element UI中的tab切换栏
html代码:(用的是el-tab组件) <el-tabs v-model="activeIndex" type="border-card" @tab-c ...
- 谈谈一些有趣的CSS题目(八)-- 纯CSS的导航栏Tab切换方案
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- 微信小程序tab切换,可滑动切换,导航栏跟随滚动实现
简介 看到今日头条小程序页面可以滑动切换,而且tab导航条也会跟着滚动,点击tab导航,页面滑动,切导航栏也会跟着滚动,就想着要怎么实现这个功能 像商城类商品类目如果做成左右滑动切换类目用户体验应该会 ...
- 原生JS实现tab切换--web前端开发
tab切换非常常见,应用非常广泛,比较实用,一般来说是一个网站必不可少的一个效果.例如:https://123.sogou.com/中的一个tab部分: 1.案例源代码 <!DOCTYPE ht ...
- 前端tab切换 和 validatejs表单验证插件
一.tab切换 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- jq 版的tab切换
ta切换是在前端中非常常见的一种效果,网上的效果很多.但是我觉得下面这种方法最好,把tab效果封装成一个函数 tabs,这个函数要配合jq使用. var tabs = function (tab, c ...
- CSS3 :target伪类实现Tab切换效果
用:target伪类实现Tab切换效果真的非常简单!简单到什么程度呢?它只需要下面这些代码. style.css: .song-info { position: absolute; backgroun ...
- 如何用RadioButton做一个底部的切换栏
上面的效果是用Radio进行制作的,一般我们做底部的切换栏的时候需要让按钮和文字都有一个选中的状态,然后根据点击不同的按钮触发不同的页面,这里的页面一般都是fragment做的.这里我们不讨论复杂的东 ...
随机推荐
- C语言小程序(五)、数组查询
随机产生一些字符,然后输入要查找的字符,本想将查找到的字符存储起来,要么初始化一个等大小的数组,要么要先检索出总共查找到多少个元素,再开辟空间存储,但这样相当于搜索了两遍,没有想到更好的方法,只是简单 ...
- ACM学习历程—HDU 5451 Best Solver(Fibonacci数列 && 快速幂)(2015沈阳网赛1002题)
Problem Description The so-called best problem solver can easily solve this problem, with his/her ch ...
- Poj 1017 Packets(贪心策略)
一.题目大意: 一个工厂生产的产品用正方形的包裹打包,包裹有相同的高度h和1*1, 2*2, 3*3, 4*4, 5*5, 6*6的尺寸.这些产品经常以产品同样的高度h和6*6的尺寸包袱包装起来运送给 ...
- Qt安装与配置
安装Qt 安装Qt Creator,打开终端执行如下命令: sudo apt-get install qt5-default qtcreator -y 安装Qt示例和文档: sudo apt-get ...
- POJ2785(upper_bound)
#include"cstdio" #include"algorithm" using namespace std; ; int A[MAXN],B[MAXN], ...
- Python-通过socket实现一个小型的端口检测工具
实验机器IP:192.168.220.139,端口开放情况 代码 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import ...
- POST-GET请求
在应用中最常用的Http请求无非是get和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet.post与get的不同之处在于post的参数不是放在URL字串里面 ...
- 关于javaScript事件委托的那些事
今天是第一次写稿,还是有那么一丢丢小鸡冻...回归正题啦... 关于javaScript事件委托不得不说的那些事,为什么要使用事件委托? 我们可以这么说,假设老板要分配一项任务,首先要秘书叫A君来到办 ...
- 【总结整理】关于IE6的兼容性
1. /*IE6兼容性,input边框border:none无效,不能去掉,只能把背景颜色去掉*/ background: none; /*background-color:#fff ;*/ 2. / ...
- 由hibernate配置inverse="true"而导致的软件错误,并分析解决此问题的过程
题目背景软件是用来做安装部署的工具,在部署一套系统时会有很多安装包,通过此工具,可以生成一个xml文件用以保存每个安装包的文件位置.顺序.参数.所需脚本.依赖条件验证(OS..net.IIS.数据版本 ...