JS 蜂窝布局效果

本文介绍了如何使用CSS和JavaScript实现在蜂窝网格布局中,当鼠标悬停在图片上时图片放大并使其周围的图片缩小的动态效果,利用了flex布局和transform属性来实现图片的放大缩小。
摘要由CSDN通过智能技术生成
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>蜂窝布局</title>
    <link rel="stylesheet" href="./index.css">
</head>
<body>
    <div id="app">
        <div class="contarner">
            <div class="item"><img src="https://picsum.photos/400?1"></div>
            <div class="item"><img src="https://picsum.photos/400?2"></div>
            <div class="item"><img src="https://picsum.photos/400?3"></div>
            <div class="item"><img src="https://picsum.photos/400?4"></div>
            <div class="item"><img src="https://picsum.photos/400?5"></div>
            <div class="item"><img src="https://picsum.photos/400?10"></div>
            <div class="item"><img src="https://picsum.photos/400?6"></div>
            <div class="item"><img src="https://picsum.photos/400?7"></div>
            <div class="item"><img src="https://picsum.photos/400?8"></div>
            <div class="item"><img src="https://picsum.photos/400?9"></div>
        </div>
        <div class="contarner">
            <div class="item"><img src="https://picsum.photos/400?11"></div>
            <div class="item"><img src="https://picsum.photos/400?12"></div>
            <div class="item"><img src="https://picsum.photos/400?13"></div>
            <div class="item"><img src="https://picsum.photos/400?14"></div>
            <div class="item"><img src="https://picsum.photos/400?15"></div>
            <div class="item"><img src="https://picsum.photos/400?110"></div>
            <div class="item"><img src="https://picsum.photos/400?16"></div>
            <div class="item"><img src="https://picsum.photos/400?17"></div>
            <div class="item"><img src="https://picsum.photos/400?18"></div>
            <div class="item"><img src="https://picsum.photos/400?19"></div>
        </div>
        <div class="contarner">
            <div class="item"><img src="https://picsum.photos/400?21"></div>
            <div class="item"><img src="https://picsum.photos/400?22"></div>
            <div class="item"><img src="https://picsum.photos/400?23"></div>
            <div class="item"><img src="https://picsum.photos/400?24"></div>
            <div class="item"><img src="https://picsum.photos/400?25"></div>
            <div class="item"><img src="https://picsum.photos/400?210"></div>
            <div class="item"><img src="https://picsum.photos/400?26"></div>
            <div class="item"><img src="https://picsum.photos/400?27"></div>
            <div class="item"><img src="https://picsum.photos/400?28"></div>
            <div class="item"><img src="https://picsum.photos/400?29"></div>
        </div>
        <div class="contarner">
            <div class="item"><img src="https://picsum.photos/400?31"></div>
            <div class="item"><img src="https://picsum.photos/400?32"></div>
            <div class="item"><img src="https://picsum.photos/400?33"></div>
            <div class="item"><img src="https://picsum.photos/400?34"></div>
            <div class="item"><img src="https://picsum.photos/400?35"></div>
            <div class="item"><img src="https://picsum.photos/400?310"></div>
            <div class="item"><img src="https://picsum.photos/400?36"></div>
            <div class="item"><img src="https://picsum.photos/400?37"></div>
            <div class="item"><img src="https://picsum.photos/400?38"></div>
            <div class="item"><img src="https://picsum.photos/400?39"></div>
        </div>
        <div class="contarner">
            <div class="item"><img src="https://picsum.photos/400?41"></div>
            <div class="item"><img src="https://picsum.photos/400?42"></div>
            <div class="item"><img src="https://picsum.photos/400?43"></div>
            <div class="item"><img src="https://picsum.photos/400?44"></div>
            <div class="item"><img src="https://picsum.photos/400?45"></div>
            <div class="item"><img src="https://picsum.photos/400?410"></div>
            <div class="item"><img src="https://picsum.photos/400?46"></div>
            <div class="item"><img src="https://picsum.photos/400?47"></div>
            <div class="item"><img src="https://picsum.photos/400?48"></div>
            <div class="item"><img src="https://picsum.photos/400?49"></div>
        </div>
    </div>
    <script src="./index.js"></script>
</body>
</html>
*{
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}
::-webkit-scrollbar{
    height: 0;
}
$n : 9;
$size : 100vw / $n;
.contarner{
    display: flex;
    // 奇数行向左偏移
    &:nth-child(even){
        margin-left: -$size / 2;
    }
    // 第一排不需要margin-top
    &:nth-child(n+2){
        margin-top: -$size / 6;
    }
    .item{
        width: $size;
        height: $size;
        background: #000;
        clip-path: polygon(50% 0%, 92% 25%, 92% 74%, 50% 100%, 6% 77%, 6% 26%);
        flex-shrink: 0;
        transition: all 0.3s ease; 
        img{
            width: 100%;
            height: 100%;
            object-fit: cover;
        }
    }
    .amplify{
        transform: scale(1.3);
    }
    .reduce{
        transform: scale(0.8);
    }
}

const items = document.querySelectorAll('.item');
// 鼠标移入移出事件
for (const v of items) {
    // 鼠标移入
    v.addEventListener('mouseenter', function(e) {
        let it = e.target;
        it.classList.add('amplify');
        // 当前元素索引
        let index = [...it.parentNode.children].indexOf(it);
        // 当前元素父级的索引
        let parentIndex = [...it.parentNode.parentNode.children].indexOf(it.parentNode);
        if(parentIndex%2 == 1){
            index = index-1;
        }
        // 左右元素添加类名
        if(it.previousElementSibling){
            it.previousElementSibling.classList.add('reduce');
        }
        if(it.nextElementSibling){
            it.nextElementSibling.classList.add('reduce');
        }
        // 上一排元素添加类名
        if(it.parentNode.previousElementSibling){
            if(it.parentNode.previousElementSibling.children[index]){
                it.parentNode.previousElementSibling.children[index].classList.add('reduce');
            }
            if(it.parentNode.previousElementSibling.children[index+1]){
                it.parentNode.previousElementSibling.children[index+1].classList.add('reduce');
            }
        }
        // 下一排元素添加类名
        if(it.parentNode.nextElementSibling){
            if(it.parentNode.nextElementSibling.children[index]){
                it.parentNode.nextElementSibling.children[index].classList.add('reduce');
            }
            if(it.parentNode.nextElementSibling.children[index+1]){
                it.parentNode.nextElementSibling.children[index+1].classList.add('reduce');
            }
        }
    });
    // 鼠标移出
    v.addEventListener('mouseleave', function(e) {
        let it = e.target;
        e.target.classList.remove('amplify');
        // 当前元素索引
        let index = [...it.parentNode.children].indexOf(it);
        // 当前元素父级的索引
        let parentIndex = [...it.parentNode.parentNode.children].indexOf(it.parentNode);
        if(parentIndex%2 == 1){
            index = index-1;
        }
        // 左右元素添加类名
        if(it.previousElementSibling){
            it.previousElementSibling.classList.remove('reduce');
        }
        if(it.nextElementSibling){
            it.nextElementSibling.classList.remove('reduce');
        }
        // 上一排元素添加类名
        if(it.parentNode.previousElementSibling){
            if(it.parentNode.previousElementSibling.children[index]){
                it.parentNode.previousElementSibling.children[index].classList.remove('reduce');
            }
            if(it.parentNode.previousElementSibling.children[index+1]){
                it.parentNode.previousElementSibling.children[index+1].classList.remove('reduce');
            }
        }
        //下一排元素添加类名
        if(it.parentNode.nextElementSibling){
            if(it.parentNode.nextElementSibling.children[index]){
                it.parentNode.nextElementSibling.children[index].classList.remove('reduce');
            }
            if(it.parentNode.nextElementSibling.children[index+1]){
                it.parentNode.nextElementSibling.children[index+1].classList.remove('reduce');
            }
        }
    });
}

 鼠标移入当前元素放大,周围元素缩小

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_最初の心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值