找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

478

积分

0

好友

62

主题
发表于 20 小时前 | 查看: 2| 回复: 0

本文将介绍如何利用 SCSS(Sass)循环与数学计算 自动生成一个动态伸缩的网格布局。通过极少的代码,你将获得一个具备高可扩展性、高复用性,并完美支持键盘focus状态的交互效果。

动态伸缩网格效果图

🔧 核心思路:让布局“感知”交互状态

为了实现当鼠标悬停或键盘聚焦于某个格子时,其所在行与列自动放大的动态效果,我们的核心思路如下:

✔ 1. 变量化定义网格行列

将行数与列数定义为变量,便于后续计算与整体调整。

$rows: 3;
$cols: 3;

✔ 2. 循环生成格子样式

利用SCSS循环为每个格子生成唯一的背景色,创建视觉区分。

@for $i from 1 through 9 {
    .item:nth-child(#{ $i }) {
        background-color: hsl(($i * 30) % 360, 70%, 60%);
    }
}

✔ 3. 自动计算行列位置

通过数学公式,在循环中自动计算出当前格子所处的行号和列号。

$row: ceil($i / $cols); // 计算当前元素所在行
$col: ($i - 1) % $cols + 1; // 计算当前元素所在列

✔ 4. 响应交互状态,动态调整布局

使用CSS的 :has() 选择器(请注意浏览器兼容性),当某个格子处于:hover:focus状态时,动态修改其所在行和列的grid-template值,实现局部放大效果。

.box:has(.item:nth-child(#{$i}):hover),
.box:has(.item:nth-child(#{$i}):focus) {
    // 动态生成新的行、列尺寸列表
}

📦 完整SCSS代码

以下是可直接使用的完整SCSS代码,其核心在于通过循环和变量构建了灵活的布局规则。

* {
    margin: 0;
    padding: 0;
    line-height: 1;
}
body {
    width: 100vw;
    height: 100vh;
    display: flex;
    justify-content: center;
    align-items: center;
    background-color: #000;
}

$rows: 3;
$cols: 3;

.box {
    width: 400px;
    height: 400px;
    margin-top: -200px;
    display: grid;
    grid-template-columns: repeat($cols, 1fr);
    grid-template-rows: repeat($rows, 1fr);
    gap: 10px;
    box-sizing: border-box;
    overflow: hidden;
    transition: grid-template-rows 0.35s ease, grid-template-columns 0.35s ease;
}

.item {
    text-align: center;
    display: flex;
    justify-content: center;
    align-items: center;
    cursor: pointer;
    img {
        width: 100%;
        height: 100%;
        display: block;
        display: none;
    }
}

// 为每个格子设置不同的背景色
@for $i from 1 through ($rows * $cols) {
    .item:nth-child(#{ $i }) {
        background-color: hsl(($i * 30) % 360, 70%, 60%);
    }
}

// 核心交互逻辑:悬停/聚焦时放大对应行列
@for $i from 1 through ($rows * $cols) {
    $row: ceil($i / $cols);
    $col: ($i - 1) % $cols + 1;

    .box:has(.item:nth-child(#{$i}):hover),
    .box:has(.item:nth-child(#{$i}):focus) {
        $rows-list: ();
        @for $r from 1 through $rows {
            $rows-list: append($rows-list, if($r == $row, 2fr, 1fr), space);
        }
        $cols-list: ();
        @for $c from 1 through $cols {
            $cols-list: append($cols-list, if($c == $col, 2fr, 1fr), space);
        }
        grid-template-rows: $rows-list;
        grid-template-columns: $cols-list;
    }
}

完整HTML结构

对应的HTML结构非常简单,只需一个容器和若干格子元素。

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="./style.scss">
    <title>动态伸缩网格演示</title>
</head>
<body>
    <div class="box">
        <div class="item">1</div>
        <div class="item">2</div>
        <div class="item">3</div>
        <div class="item">4</div>
        <div class="item">5</div>
        <div class="item">6</div>
        <div class="item">7</div>
        <div class="item">8</div>
        <div class="item">9</div>
    </div>
</body>
</html>

总结

本方案展示了SCSS预处理器的强大能力,通过变量、循环和函数将复杂的动态样式规则自动化。这种方法不仅极大地减少了重复代码,还使得整个布局系统易于维护和扩展(例如,只需修改$rows$cols变量即可改变网格规模)。同时,结合现代CSS特性如CSS Grid:has()选择器,我们能够创造出富有表现力且具备良好可访问性的交互界面。这种动态布局思想,可以灵活运用到仪表盘、图片画廊等多种前端交互场景中。




上一篇:Chrome++增强补丁实战:实现便携版与双击关闭标签页功能
下一篇:Apache APISIX网关实战:动态路由与热更新如何解决Nginx运维痛点
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区(YunPan.Plus) ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-6 20:02 , Processed in 0.068958 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 CloudStack.

快速回复 返回顶部 返回列表