动画CSS网格(如何示例)
CSS Grid 的 grid-template-rows
和 grid-template-columns
属性现在可在所有主流浏览器中进行动画效果处理!事实上,CSS Grid 长期以来一直支持动画,因为它已内置于 CSS Grid 布局模块级别 1 规范中。
但直到最近,所有三大浏览器才全面支持对这些网格属性进行动画处理。让我们来看几个例子,激发您的创意吧!
目录
- 目录
- 示例 1:展开侧边栏
- 示例 2:展开面板
- 示例 3:添加行和列
- 更多示例
示例 1:展开侧边栏
首先,这就是我们要讨论的内容:
一个简单的两列网格。以前,您可能不会使用 CSS Grid 来构建它,因为不支持动画和过渡,但如果您希望左侧列(可能是侧边栏导航)在悬停时展开呢?现在,这是可能的。
我知道你在想什么:“动画 CSS 属性?小菜一碟,我已经做了很多年了!”我也是。但是,在尝试一个特定的用例时,我遇到一个有趣的障碍。
因此,我们想要转换网格本身(特别是示例中 .grid
类上设置的 grid-template-columns
)。但左侧列(.left
)是需要 :hover
伪类的选择器。虽然 JavaScript 可以轻松解决这个难题——谢谢,但不用了——我们可以只用 CSS 来实现它。
让我们逐步讲解整个过程,从 HTML 开始。实际上非常标准……一个有两列的网格。
<div class="grid"> <div class="left"></div> <div class="right"></div> </div>
撇开装饰性 CSS 不谈,您首先需要在父容器(.grid
)上设置 display: grid
。
.grid { display: grid; }
接下来,我们可以使用 grid-template-columns
属性定义和调整两列的大小。我们将左侧列设置得非常窄,稍后在悬停时增加其宽度。右侧列将占据其余空间,这要感谢 auto
关键字。
.grid { display: grid; grid-template-columns: 48px auto; }
我们知道我们要为它制作动画,所以让我们在添加动画的同时也添加一个过渡效果,这样状态之间的变化就会平滑且明显。
.grid { display: grid; grid-template-columns: 48px auto; transition: 300ms; /* 根据需要更改 */ }
.grid
就完成了!剩下的就是应用悬停状态。具体来说,我们将覆盖 grid-template-columns
属性,以便左侧列在悬停时占据更大的空间。
仅此一项并没有那么有趣,尽管 CSS Grid 现在支持动画和过渡非常棒。更有趣的是,我们可以使用相对较新的 :has()
伪类来在子元素(.left
)悬停时设置父容器(.grid
)的样式。
<div class="grid"> <div class="left"></div> <div class="right"></div> </div>
用简单的英语来说,这就是说:“如果 .grid
容器包含一个名为 .left
的元素并且该元素处于悬停状态,则对 .grid
容器执行某些操作。”这就是为什么 :has()
通常被称为“父”选择器。我们终于可以根据它包含的子元素来选择父元素——不需要 JavaScript!
因此,让我们在悬停时将 .left
列的宽度增加到 30%。.right
列将继续占据所有剩余空间:
.grid { display: grid; }
我们也可以使用 CSS 变量,这在外观上可能更简洁,也可能不简洁,这取决于您的个人喜好(或者您可能已经在项目中使用 CSS 变量了):
.grid { display: grid; grid-template-columns: 48px auto; }
我非常喜欢 CSS 网格现在可以制作动画,但事实上我们只需九行 CSS 代码就能构建这个特定示例,这更令人惊叹。
这是 Olivia Ng 的另一个示例——概念相似,但包含内容(点击导航图标):
示例 2:展开面板
此示例转换网格容器(列宽),也转换各个列(其背景颜色)。它非常适合在悬停时提供更多内容。
值得记住的是,repeat()
函数有时会产生错误的过渡,这就是为什么我单独设置每列的宽度(即 grid-template-columns: 1fr 1fr 1fr
)。
示例 3:添加行和列
此示例会动画地“添加”一列到网格中。但是——你猜对了——这种情况也有一个陷阱。要求是“新”列不能隐藏(即设置为 display: none
),并且 CSS Grid 必须在将它的宽度设置为 0fr 时承认它的存在。
因此,对于一个三列网格——grid-template-columns: 1fr 1fr 0fr
(是的,即使值为 0 也必须声明单位!)会正确地转换为 grid-template-columns: 1fr 1fr 1fr
,但 grid-template-columns: 1fr 1fr
不会。事后看来,考虑到我们对过渡工作原理的了解,这实际上是完全合理的。
这是 Michelle Barker 的另一个示例——相同概念,但带有一列和更多炫酷效果。确保以全屏模式运行此示例,因为它实际上是响应式的(没有技巧,只是好的设计!)。
更多示例
为什么不呢?
这个“动画蒙德里安”是 Chrome DevRel 制作的动画 CSS 网格的最初概念证明。grid-row
和 grid-column
使用 span
关键字创建您眼前看到的布局,然后使用 CSS 动画对 grid-template-row
和 grid-template-column
进行动画处理。它并没有看起来那么复杂!
相同概念,但更多 Michelle Barker 的炫酷效果。可以做一个不错的加载微调器?
最后回顾一下怀旧(这里显示我的年龄),Andrew Harvard 制作的不太像网格的动画 CSS 网格。同样——相同概念——你只是看不到其他网格项目。但别担心,它们在那里。
以上是动画CSS网格(如何示例)的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)