效果


jquery 手风琴_css


  • 点击相应卡片的标签,那么就会切换至卡片的呈现
  • 如果点击03标签,那么01 02 要一起移动

5个效果图片


jquery 手风琴_jquery_02

jquery 手风琴_html_03

jquery 手风琴_html_04

jquery 手风琴_jquery_05

jquery 手风琴_jquery_06


基本HTML结构如下:


jquery 手风琴_css_07


  • 编写5个li标签,包含span以及图片
  • 设置绝对定位,溢出部分​​overflow:hidden​​进行隐藏

基本5个li标签需要使用的绝对定位的居中技巧,使用​​lef:50%​​​,然后使用​​margin-lef: - 元素的一半宽度​​​(详情可以访问​​CSS 定位布局 - 绝对、固定定位设置居中悬浮div​​)。

大概实现效果如下:


jquery 手风琴_html_08

jquery 手风琴_html_09

jquery 手风琴_jquery_10


从上面的三个截图可以看到5个li标签可以排列好了内容和图片了,只要将超出第一个li标签范围的进行隐藏即可。

使用overflow:hidden,隐藏溢出部分


jquery 手风琴_css_11


每个li使用left属性来改变位置,做出span标签部署有层叠的效果


jquery 手风琴_html_12


下一步就是要做出这样的层叠效果了。


jquery 手风琴_jquery_13


使用绝对定位以及left参数设定位置,就可以做出这个效果的了。

好了,写到这里基本完成了HTML、CSS部分的代码了,贴出源码如下:

<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript" src="jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
$(function(){

})
</script>
<style type="text/css">
* {
margin: 0;
padding: 0;
font-family: 'Miscrosoft Yahei';
font-size: 14px;
}

.accordion_warp{
width: 642px;
height: 350px;
position: absolute;
margin-top:50px;
margin-left: -321px;
left: 50%;
overflow: hidden;
}

.accordion {
width: 3210px;
list-style: none;
}

.accordion li,span,div{
float: left;
}

.accordion li span{
display: block;
width: 20px;
height: 350px;
color: #fff;
text-align: center;
}

.accordion li div{
width: 622px;
height: 350px;
}

.accordion li:nth-child(1) span{
position: absolute;
left: 0;
background-color: #09E0B5;
}

.accordion li:nth-child(1) div{
position: 20px;
background: url("images/001.jpg");
}

.accordion li:nth-child(2) span{
position: absolute;
left: 562px;
background-color: #3D7FBB;
}

.accordion li:nth-child(2) div{
position: absolute;
left: 582px;
background: url("images/002.jpg");
}

.accordion li:nth-child(3) span{
position: absolute;
left: 582px;
background-color: #5CA716;
}

.accordion li:nth-child(3) div{
position: absolute;
left: 602px;
background: url("images/003.jpg");
}

.accordion li:nth-child(4) span{
position: absolute;
left: 602px;
background-color: #F28B24;
}

.accordion li:nth-child(4) div{
position: absolute;
left: 622px;
background: url("images/004.jpg");
}

.accordion li:nth-child(5) span{
position: absolute;
left: 622px;
background-color: #7C0070;
}

.accordion li:nth-child(5) div{
position: absolute;
left: 642px;
background: url("images/005.jpg");
}



</style>
</head>
<body>
<!-- ul.accordion>(li>span{非洲景色$}+div{这是div})*5 -->
<div class="accordion_warp">
<ul class="accordion">
<li>
<span>非洲景色1</span>
<div></div>
</li>
<li>
<span>非洲景色2</span>
<div></div>
</li>
<li>
<span>非洲景色3</span>
<div></div>
</li>
<li>
<span>非洲景色4</span>
<div></div>
</li>
<li>
<span>非洲景色5</span>
<div></div>
</li>
</ul>
</div>

</html>

下面就是用​​jquery​​​去控制​​left​​的值,就可以实现手风琴的效果了。

根据jquery监听每个标签的click事件,根据点击的对象,修改相应的left值即可。

根据点击li标签,单个li标签向左移动


jquery 手风琴_css_14

jquery 手风琴_css_15

jquery 手风琴_jquery_16


此时,点击每个li标签,就会自然向左移动。

思路解析:根据点击事件的​​$(this).index()​​就可以知道点击的是哪个li,然后再设置相应的左移距离即可。

存在BUG,当跨li点击,中间部分的li标签不会一起向左移动


jquery 手风琴_jquery_17


当点击标签3,效果如下:


jquery 手风琴_html_18


这里可以看到标签2并没有移动,这里就需要将标签3前面的所有li一起移动才行,需要使用​​prevAll()​​​和​​each()​​这个方法来处理。

编写前面元素一起向左移动的方法


jquery 手风琴_html_19

jquery 手风琴_html_20


可以看到打印出了前面两个标签的索引 ​​0​​​ 和 ​​1​​​,然后使用​​each()​​遍历操作标签1和标签2的移动。

下面来看看,如果点击标签5,会是什么样的效果,如下:


jquery 手风琴_css_21


如果点击标签5,那么也是会操作前面四个标签。

那么下面剩下的最后的问题就是,点击标签也要同时向右移动回去,这个该怎么处理呢?

首先写单个向右移动的事件

如果需要向右移动,那么就需要有条件判断什么时候需要向右移动。
简单来想的话,就是当前li的位置是处于左边的位置,那么此时再点击当然就要向右了。
那么判断左边的位置,就需要当前li的具体距离数值,首先打印一下看看是多少,如下:


jquery 手风琴_jquery_22


可以看到右边的left数值 和 左边的left数值。


jquery 手风琴_jquery_23

jquery 手风琴_jquery_24

jquery 手风琴_html_25


考虑使用​​nextAll()​​​和​​each()​​来设置向右移动的方法


jquery 手风琴_html_26

jquery 手风琴_html_27


点击标签2,标签3 和 4 则自动向右移动。

完成代码如下:

<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript" src="jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
$(function(){
$(".accordion li").click(function(){
// alert( $(this).index() );

// 1.点击li,向左单个移动。
$(this).children('span').animate({
"left":$(this).index()*20,
},1000)

$(this).children('div').animate({
"left":($(this).index()+1)*20,
},1000)

// 2.处理之前的元素向左同时移动
if($(this).index()>1){
console.log("index > 1");
// console.log("pre index = " + ($(this).index()-1));
$(this).prevAll().each(function(i){
// 打印每个前面元素的index()索引
// console.log(i + " index=" + $(this).index());
// 已知前面元素的index()索引,那么下面可以设置left的值了。
$(this).children('span').animate({
"left":$(this).index()*20,
},1000)

$(this).children('div').animate({
"left":($(this).index()+1)*20,
},1000)

})
}

// 3.编写标签单个向右移动的方法
console.log( $(this).index() + " left = " + $.trim($(this).children('span').css("left") ));
console.log(typeof($(this).children('span').css("left")));

if ( $.trim($(this).children('span').css("left")) == ($(this).index()*20 + "px") ) {
// 单个向右移动部分
// alert("turn right!");
$(this).children('span').animate({
"left":542+$(this).index()*20,
},1000)

$(this).children('div').animate({
"left":542+(($(this).index()+1)*20),
},1000)

// 4.批量向右移动
$(this).nextAll().each(function(){
$(this).children('span').animate({
"left":542+$(this).index()*20,
},1000)

$(this).children('div').animate({
"left":542+(($(this).index()+1)*20),
},1000)
})

}



})
})
</script>
<style type="text/css">
* {
margin: 0;
padding: 0;
font-family: 'Miscrosoft Yahei';
font-size: 14px;
}

.accordion_warp{
width: 642px;
height: 350px;
position: absolute;
margin-top:50px;
margin-left: -321px;
left: 50%;
overflow: hidden;
}

.accordion {
width: 3210px;
list-style: none;
}

.accordion li,span,div{
float: left;
cursor: pointer;
}

.accordion li span{
display: block;
width: 20px;
height: 350px;
color: #fff;
text-align: center;
}

.accordion li div{
width: 622px;
height: 350px;
}

.accordion li:nth-child(1) span{
position: absolute;
left: 0;
background-color: #09E0B5;
}

.accordion li:nth-child(1) div{
position: 20px;
background: url("images/001.jpg");
}

.accordion li:nth-child(2) span{
position: absolute;
left: 562px;
background-color: #3D7FBB;
}

.accordion li:nth-child(2) div{
position: absolute;
left: 582px;
background: url("images/002.jpg");
}

.accordion li:nth-child(3) span{
position: absolute;
left: 582px;
background-color: #5CA716;
}

.accordion li:nth-child(3) div{
position: absolute;
left: 602px;
background: url("images/003.jpg");
}

.accordion li:nth-child(4) span{
position: absolute;
left: 602px;
background-color: #F28B24;
}

.accordion li:nth-child(4) div{
position: absolute;
left: 622px;
background: url("images/004.jpg");
}

.accordion li:nth-child(5) span{
position: absolute;
left: 622px;
background-color: #7C0070;
}

.accordion li:nth-child(5) div{
position: absolute;
left: 642px;
background: url("images/005.jpg");
}



</style>
</head>
<body>
<!-- ul.accordion>(li>span{非洲景色$}+div{这是div})*5 -->
<div class="accordion_warp">
<ul class="accordion">
<li>
<span>非洲景色1</span>
<div></div>
</li>
<li>
<span>非洲景色2</span>
<div></div>
</li>
<li>
<span>非洲景色3</span>
<div></div>
</li>
<li>
<span>非洲景色4</span>
<div></div>
</li>
<li>
<span>非洲景色5</span>
<div></div>
</li>
</ul>
</div>

</html>


jquery 手风琴_jquery_28