当前位置: 首页 > article >正文

使用 SASS 与 CSS Grid 实现鼠标悬停动态布局变换效果

在这里插入图片描述

最终效果概述

  1. 页面为 3x3 的彩色格子网格;
  2. 当鼠标悬停任意格子,所在的行和列被放大;
  3. 使用纯 CSS 实现,无需 JavaScript;
  4. 利用 SASS 的模块能力大幅减少冗余代码。

HTML 结构

我们使用非常基础的结构,9 个 .item 放在 .container 容器中:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><link rel="stylesheet" href="./index.css">
</head>
<body><div class="container"><div class="item"></div><div class="item"></div><div class="item"></div><div class="item"></div><div class="item"></div><div class="item"></div><div class="item"></div><div class="item"></div><div class="item"></div></div>
</body>
</html>

SASS + CSS Grid 样式详解

1. 设置基本布局

body {background-color: #23262d;
}.container {width: 480px;height: 400px;margin: 50px auto;display: grid;grid-template-columns: 1fr 1fr 1fr;grid-template-rows: 1fr 1fr 1fr;gap: 10px;transition: 0.5s;
}

我们为 .container 设置了一个固定尺寸的 3x3 网格,并加了 transition 来实现动画过渡。

2. 为每个格子设置不同颜色

@for $i from 1 through 9 {.item:nth-child(#{$i}) {background: hsl($i * 40deg, 100%, 60%);}
}

利用 HSL 色彩空间,我们为每个格子设置了不同色相,让它们具有渐变的彩虹效果。

3. 交互式动态布局(核心逻辑)

@use "sass:list";
@use "sass:math";@for $i from 1 through 9 {.container:has(.item:nth-child(#{$i}):hover) {$r: math.floor(math.div($i - 1, 3) + 1);$c: ($i - 1) % 3 + 1;$arr: 1fr 1fr 1fr;$rows: list.set-nth($arr, $r, 2fr);$cols: list.set-nth($arr, $c, 2fr);grid-template-columns: $cols;grid-template-rows: $rows;}
}

解释一下这段代码的巧妙之处:

  • @for 循环处理每一个 .item;
  • 通过 SASS 的数学模块计算出第几个格子对应的行($r)和列($c);
  • 使用 list.set-nth() 将第 $r 行和第 $c 列的比例设为 2fr,其他保持 1fr
  • 利用 :has() 选择器监听每个格子的 hover 状态,进而修改 .container 的布局。

完整代码

index.scss

@use "sass:list";
@use "sass:math";body {background-color: #23262d;
}.container {width: 480px;height: 400px;margin: 0 auto;margin-top: 50px;display: grid;grid-template-columns: 1fr 1fr 1fr;grid-template-rows: 1fr 1fr 1fr;gap: 10px;transition: 0.5s;
}@for $i from 1 through 9 {.item:nth-child(#{$i}) {background: hsl($i * 40deg, 100%, 60%);}// 选择子元素,更改父元素:当容器的子元素被鼠标移入时,父元素样式生效.container:has(.item:nth-child(#{$i}):hover) {// 移入某个子元素时,改变父元素的行列比例$r: math.floor(math.div($i - 1, 3) + 1);$c: ($i - 1) % 3 + 1;$arr: 1fr 1fr 1fr;$rows: list.set-nth($arr, $r, 2fr); // 将第 $c 行的宽度改为 2fr$cols: list.set-nth($arr, $c, 2fr); // 将第 $c 列的宽度改为 2frgrid-template-columns: $cols;grid-template-rows: $rows;}
}

总结

技术点说明
CSS Grid实现基本的行列布局和比例控制
SASS 循环 + 模块自动生成 9 套不同的布局规则
:has() 选择器CSS4 的新特性,实现“父级根据子级状态变化”
transition平滑过渡布局变化

浏览器兼容性提示

:has() 是一个 CSS4 选择器,目前主流浏览器如 Chrome、Edge 和 Safari 已支持,但 Firefox 仍不支持(截至 2025 年)。部署到生产环境前,请根据用户群体权衡。

http://www.lryc.cn/news/2396926.html

相关文章:

  • Node.js 全栈开发方向常见面试题
  • Spring如何实现组件扫描与@Component注解原理
  • 历年四川大学计算机保研上机真题
  • gcc符号表生成机制
  • 达梦数据库 Windows 系统安装教程
  • unix/linux source 命令,其基本概念、定义、性质、定理
  • 【Java EE初阶】计算机是如何⼯作的
  • RAG理论基础总结
  • 列表推导式(Python)
  • 嵌入式RTC工作原理及应用场景
  • 一天搞懂深度学习--李宏毅教程笔记
  • Go语言常见接口设计技巧-《Go语言实战指南》
  • python打卡训练营打卡记录day43
  • Camera相机人脸识别系列专题分析之十一:人脸特征检测FFD算法之低功耗libvega_face.so人脸属性(年龄,性别,肤色,微笑,种族等)检测流程详解
  • 解决:输入SSH后,仍无法通过网址登录以及紧接着的新问题Permission denied(publickey,password).
  • 【QT控件】QWidget 常用核心属性介绍 -- 万字详解
  • uniapp-商城-77-shop(8.2-商品列表,地址信息添加,级联选择器picker)
  • HTTPS加密通信详解及在Spring Boot中的实现
  • 如何让 Git 停止跟踪文件?停止后又如何恢复跟踪?
  • 【第16届蓝桥杯 | 软件赛】CB组省赛第二场
  • SQL进阶之旅 Day 10:执行计划解读与优化
  • AR/MR实时光照阴影开发教程
  • Visual studio 中.sln/.vcxproj/.vcxproj.filters和.vcxproj.user文件的作用
  • 【汽车电子入门】一文了解LIN总线
  • JVM学习(七)--JVM性能监控
  • 关于 java:5. Java IO 与文件操作
  • 【笔记】为 Python 项目安装图像处理与科学计算依赖(MINGW64 环境)
  • 【笔记】MLA矩阵吸收分析
  • 600+纯CSS加载动画一键获取指南
  • 开源的JT1078转GB28181服务器