选项卡切换
<div class="box">
<div class="list" id="one">1</div>
<div class="list" id="two">2</div>
<div class="list" id="three">3</div>
<div class="list" id="four">4</div>
</div>
<div class="link">
<a class="click" href="#one">1</a>
<a class="click" href="#two">2</a>
<a class="click" href="#three">3</a>
<a class="click" href="#four">4</a>
</div>
.box {
width: 20em;
height: 10em;
border: 1px solid #ddd;
overflow: hidden;
}
.list {
line-height: 10em;
background: #ddd;
text-align: center;
}
此效果乍一看很酷,但却有不少不足之处:其一,容器高度需要固定;其二,也是最麻烦
的,就是“由内而外”的锚点定位会触发窗体的重定位,也就是说,如果页面也是可以滚动的,
则点击选项卡按钮后页面会发生跳动,这种体验显然是非常不好的。那有没有什么解决办法呢?
有,还记不记得前面提过有两种方法可以触发锚点定位,其中有一种方法就是“focus 锚
点定位”,只要定位的元素在浏览器窗体中,就不会触发窗体的滚动,也就是选项卡切换的时候
页面不会发生跳动。
<div class="box">
<div class="list"><input id="one">1</div>
<div class="list"><input id="two">2</div>
<div class="list"><input id="three">3</div>
<div class="list"><input id="four">4</div>
</div>
<div class="link">
<label class="click" for="one">1</label>
<label class="click" for="two">2</label>
<label class="click" for="three">3</label>
<label class="click" for="four">4</label>
</div>
.box {
height: 10em;
border: 1px solid #ddd;
overflow: hidden;
}
.list {
height: 100%;
background: #ddd;
position: relative;
}
.list > input {
position: absolute; top:0;
height: 100%; width: 1px;
border:0; padding: 0; margin: 0;
clip: rect(0 0 0 0);
}
原理其实很简单,就是在每个列表里塞入一个肉眼看不见的<input>
输入框,然后选项卡
按钮变成<label>
元素,并通过 for 属性与<input>
输入框的 id 相关联,这样,点击选项按
钮会触发输入框的 focus 行为,触发锚点定位,实现选项卡切换效果。
这种原理实现的选项卡还有一个优点就是,我们可以直接使用 Tab 键来切换、浏览各个选
项面板的内容,传统的选项卡实现并没有如此便捷的可访问性。
然而,上面这种技术要想用在实际项目中还离不开 JavaScript 的支持,一个是选项卡按钮
的选中效果,另一个就是处理列表部分区域在浏览器外面时依然会跳动的问题。相关处理类似
下面的做法,即使用 jQuery 语法,:
$('label.click').removeAttr('for').on('click', function() {
$('.box').scrollTop(xxx); //'xxx'表示滚动数值
});
于是,就算 JavaScript 出现异常或者加载缓慢,选项卡点击功能依然正常,并且直接用 Tab
键浏览选项卡内容的超级便捷的可访问性也保留下来了。
同样,这一技术只适用于高度固定的选项卡效果,如各大站点首页经常出现的幻灯片广告
切换效果等。
实际上,如果不用考虑 IE8 浏览器,可以利用:checked 伪类、单选按钮和<label>
标签
的点击行为实现选项卡切换,由于本书知识点面向 IE8 及以上版本的浏览器,因此这一技术不
做详细介绍。