纯 CSS+JS 通用选项卡
分类: 客户端技术 2009-09-09 15:29:00 阅读(2567)
请看源码吧,各段都有详细注释。
<!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="Content-Type" content="text/html; charset=gb2312" />
<title>选项卡</title>
<style type="text/css">
/*核心:
选项页切换:先把各选项内容块设置成 display: none,再把当前选项的 .tabOn .tabContentBox 设置为 display: block;
选项页是分属不同的 li 的,要让它们定位到相同的位置,就要用到 position: absolute; 而这时又不是相对窗口的绝对定位,而是相对于整个选项组 ul 的定位,因为给 .tabList .tabBox 设置 position:relative;。
从 http://www.awflasher.com/blog/archives/731 学到,要让某个节点相对于其上级的节点绝对定位,而不是相对于窗口,就给要参照的上级节点设置 position:relative;。由选项这个例子可以知道,这个上级节点不必是直接的父节点,可以是若干级以上的节点,即某节点设置了 position:relative; 后,它的各级子节点再用 position: absolute; 是都将参照此节点而非窗口。
这里 top 的 30px 就是选项头 .tabBox h4 的高度。
*/
.tabBox {
height:100%;
position:relative;
background:#fff;
border:1px solid #99F;
}
.tabBox .tabContentBox {
margin:1px;
padding: 10px;
width:570px;
height:60px;
text-align: left;
overflow: hidden;
background: #fff;
position: absolute;
top: 30px;
left: 0;
display: none;
}
/*原例是鼠标悬停就切换,我要的是点击再切换,所以不用 .tabOption:hover 这个级联 */
.tabBox .tabOn .tabContentBox {
display: block;
}
/* 初始化 */
body {
font: 12px/1 "宋体", SimSun, serif;
background:#fff;
color:#000;
}
/* 清除浏览器默认的margin和padding值 */
ul,li,dl,dt,dd {
margin:0;
padding:0;
}
ul,li {
list-style:none outside; /* 清除浏览器中列表项默认的占位 */
}
a {
text-decoration:none;
}
a:hover {
text-decoration:underline;
}
/* 选项卡整体外观定义 */
.tabBox {
width:580px;
height:115px;
overflow:hidden;
}
/*百分比宽度居然支持 2 位小数,在 FF 里完美合成整条,而 IE 里还是有点空白。看来只好用 JS 算成像素值了,最后剩余的几像素都放在最后一个即可。
width:25%; 只是默认的 4 个选项时用的,选项个数不是 4 时,由 JS 均分出宽度。选项头的左右边框样式做到 li 下属的 h4 标签上,这样的好处是 JS 算宽度时只考虑 width 即可,不用管边框之类的零星数。*/
.tabBox li {
float:left;
width:25%;
text-align:center;
}
/*选项头的选中和未选样式。这里好像不能用 padding 来垂直居中,会让边框超出,只好改用 line-height 配 height。选项卡的样式刚好利用 li 里套的 h4 来实现:未选中时底边框和外框同色,左右边框和选项头背景同色;选中时底边框和内容的背景同色,左右边框和外框同色。*/
.tabBox h4 {
cursor:pointer;
margin:0;
padding: 0;
height: 30px;
line-height:30px;
color:#036;
font-size:12px;
font-weight:normal;
display:block;
background:#edf2fa;
border-bottom:1px solid #99F;
}
.tabBox .tabOn h4, .tabBox h4.tabOnFirst, .tabBox h4.tabOnFinal {
color:#06f;
background:#fff;
border-left:1px solid #99F;
border-right: 1px solid #99F;
border-bottom:1px solid #FFF;
}
.tabBox h4.tabOnFirst {
border-left:1px solid #fff;
border-bottom:1px solid #FFF;
}
.tabBox h4.tabOnFinal {
border-right:1px solid #fff;
border-bottom:1px solid #fff;
}
</style>
<script type="text/javascript" language="javascript">
</script>
</head>
<body>
<h1>通用选项卡演示</h1>
<ul class="tabBox">
<li class="tabOption tabOn">
<h4 class="tabOnFirst">选项1</h4>
<div class="tabContentBox">
1的具体内容<br /><a href="http://www.snowpeak.org" target="_blank">www.snowpeak.org</a>
</div>
</li>
<li class="tabOption">
<h4>选项2</h4>
<div class="tabContentBox">
2的具体内容<br /><a href="http://www.snowpeak.org" target="_blank">www.snowpeak.org</a>
</div>
</li>
<li class="tabOption">
<h4>选项3</h4>
<div class="tabContentBox">
3的具体内容<br /><a href="http://www.snowpeak.org" target="_blank">www.snowpeak.org</a>
</div>
</li>
</ul>
<br /><br /><br /><br /><br /><br />
<ul class="tabBox">
<li class="tabOption tabOn">
<h4 class="tabOnFirst">选项1</h4>
<div class="tabContentBox">
1的具体内容<br /><a href="http://www.snowpeak.org" target="_blank">www.snowpeak.org</a>
</div>
</li>
<li class="tabOption">
<h4>选项2</h4>
<div class="tabContentBox">
2的具体内容<br /><a href="http://www.snowpeak.org" target="_blank">www.snowpeak.org</a>
</div>
</li>
<li class="tabOption">
<h4>选项3</h4>
<div class="tabContentBox">
3的具体内容<br /><a href="http://www.snowpeak.org" target="_blank">www.snowpeak.org</a>
</div>
</li>
<li class="tabOption">
<h4>选项4</h4>
<div class="tabContentBox">
4的具体内容<br /><a href="http://www.snowpeak.org" target="_blank">www.snowpeak.org</a>
</div>
</li>
</ul>
</body>
</html>
原文链接: https://www.snowpeak.fun/cn/article/detail/general_tab_with_pure_css_and_js/