JavaScript 练手小案例:超级简单又炫酷的图片手风琴效果

手风琴效果很流行,可以任意展开收缩内容,甚是好看。

特效要求

鼠标移动到图片上,当前图片放大,其他图片收缩。

HTML

<div class="pics">
    <ul id="picList">
        <li><a href="#"><img src="images/pic1.jpg" alt=""></a></li>
        <li><a href="#"><img src="images/pic2.jpg" alt=""></a></li>
        <li><a href="#"><img src="images/pic3.jpg" alt=""></a></li>
        <li><a href="#"><img src="images/pic4.jpg" alt=""></a></li>
        <li><a href="#"><img src="images/pic5.jpg" alt=""></a></li>
    </ul>
</div>

CSS

*{
    margin: 0;
    padding: 0;
}
ul,li,ol{
    list-style: none;
}
img{
    border:none;
}
/* 公用css 结束 */

.pics{
    width: 1000px; /* 1个 600px,4个 100px*/
    margin-left: auto;
    margin-right: auto;
    height: 400px;
    overflow: hidden;
}
.pics ul{
    display: flex;    /* flex 布局让 li 横向排列 */
    justify-content: space-between;  /* 内容靠向两端 */
}
.pics ul li{
    width: 100px;
    height: 400px;
    position: relative;
    overflow: hidden;
    transition:all 0.4s;   /* 过渡动画 */
    flex-grow: 1;   /* 让 li 始终能占满整个 ul ,保证变化过程中 li 之间没有缝隙 */
}
.pics ul li img{
    position: absolute;   /* 确保图片在 li 里显示中间部分 */
    left:50%;
    top:0;
    margin-left: -300px;
}
.pics ul li.active{    /* 有类 active li 宽度为 600px。去掉,就会恢复 100px */
    width: 600px;
}

几个细节需要注意:

  1. li 的变宽,变窄动画,全靠 CSS3 的 transition 完成
  2. 为了防止 li 变化过程中 li 之间产生缝隙,li 添加了样式:
 flex-grow: 1; 

让 li 自动塞满 ul 。

     3. 为了让图片在 li 中始终居中,对图片运用了绝对定位。li 则是相对定位。

.pics ul li img{
    position: absolute;
    left:50%;
    top:0;
    margin-left: -300px;
}

JavaScript

let ul = document.getElementById("picList");
let lies = ul.children ;
// 第一个 li 变宽:增加类 active
lies[0].classList.add("active");
// 查找兄弟标签函数
let findSiblings = function(tag){
    let parent = tag.parentNode ;
    let child = parent.children ;
    let sb = [];
    for(let i = 0 ; i <= child.length-1 ; i++ ){
        if( tag !== child[i]){
            sb.push( child[i]);
        }
    }
    return sb ;
};

for( let i = 0 ; i <= lies.length-1 ; i++  ){
    lies[i].addEventListener("mouseenter",function(){
        let siblings = findSiblings(this);
        // 当前标签变宽: 增加类 active
        this.classList.add("active");
        // 兄弟标签变窄
        for(let k = 0 ; k <= siblings.length-1 ; k++ ){
            // 兄弟标签去掉 active
            siblings[k].classList.remove("active");
        }
    });
}

完工~!!

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要实现微信小程序中的手风琴效果,你可以使用小程序的组件和动画来完成。下面是一个简单的示例代码,供你参考: 1. 在 wxml 文件中添加一个手风琴容器和多个手风琴项: ```html <view class="accordion"> <view class="item" wx:for="{{accordionItems}}" wx:key="index" bindtap="toggleAccordion"> <view class="title">{{item.title}}</view> <view class="content {{item.open ? 'open' : ''}}">{{item.content}}</view> </view> </view> ``` 2. 在 wxss 文件中定义手风琴的样式: ```css .accordion { border: 1px solid #ccc; } .item { border-top: 1px solid #ccc; } .title { padding: 10rpx; font-weight: bold; } .content { padding: 10rpx; max-height: 0; overflow: hidden; transition: max-height 0.3s ease-out; } .open { max-height: 9999rpx; /* 设置合适的高度 */ } ``` 3. 在 js 文件中定义手风琴的数据和交互逻辑: ```javascript Page({ data: { accordionItems: [ { title: '手风琴项1', content: '内容1', open: false }, { title: '手风琴项2', content: '内容2', open: false }, // 添加更多手风琴项... ] }, toggleAccordion(e) { const index = e.currentTarget.dataset.index; const accordionItems = this.data.accordionItems; accordionItems[index].open = !accordionItems[index].open; this.setData({ accordionItems: accordionItems }); } }); ``` 这样,当用户点击手风琴项的标题时,对应的内容区域将展开或收起。你可以根据需要自定义样式和动画效果来实现更复杂的手风琴效果

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值