那些你不知道的 CSS 自定义形状网格布局 3(2)

简介: 那些你不知道的 CSS 自定义形状网格布局

案例三 饼图效果

这个效果我们增加难度,和上面的效果类似,但增加到四个图像,而不是两个。

ad40c6f2f80ffd81b31f7465244841e.png

每个图像是一个圆的四分之一,鼠标悬停时,基于动画将一个图像转换为一个完整的圆,覆盖其余的图像。看起来是不是很炫酷呢,接下来开始具体的实现过程。

首先给整个元素增加 border-radius: 50%使其变为圆形。

da41fb740ed5ef22558ac1fb7e99dbb.png

然后是针对每个图像设置 clip-path 值,clip-path由七个点组成,其中三个点位于固定位置,如上图所示,默认就是一个三角形。当悬停时,修改剩余几个点的数值并加上过渡动画。

transition: transform .2s, clip-path .3s .2s, z-index 0s;

但是当它运行缓慢时,效果看起来不那么酷,但我们可以看到剪辑路径如何在形状之间进行变化的。以下是第一个图像的代码,其他的几个图像类似,只是对应方向的数值不同:

.gallery > img:nth-child(1) {
  clip-path: polygon(50% 50%, calc(50% * var(--_i, 0)) calc(120% * var(--_i, 0)), 0 calc(100% * var(--_i, 0)),0 0, 100% 0, 100% calc(100% * var(--_i, 0)), calc(100% - 50% * var(--_i, 0)) calc(120% * var(--_i, 0)));
}
.gallery > img:hover {
 --_i: 1;
}

这里还是像往常一样,我使用一个变量来优化代码。变量将在0和1之间切换来达到更新多边形的效果。

案例四 多图镶嵌效果

这是一种艺术风格,各种各样的图像以不同的形状组合在一起。这个效果利用我们今天使用的CSS完全可以胜任!

2e17e019af2624eee424a87769f7d57.png

基于上面的效果图,我们来分析每个图像的位置和大小。我们需要确定网格需要多少列和行数:

  1. 我们有两个大的图像放置在彼此旁边,每个填充一半的网格宽度和整个网格高度。这意味着可能需要 两列 和 单行。
  2. 中间的图像与另外两个图像重叠。这意味着我们需要 四列 和 单行。
  3. 最后两个图像各填充一半网格,就像前两个图像一样。但它们只有网格高度的一半。我们可以使用现有的列,但我们需要 两排。

8dd340fa7b6385574c1cad0d3467afe.png

这仅仅是我理解它的方式。我相信还有其他的配置可以得到同样的布局,有兴趣的同学可以用自己的思路实现看看。 基于以上我们定义的网格,然后将图像放在对应的网格上面:

.gallery {
  display: grid;
  grid: repeat(2, 1fr) / repeat(4, 1fr); 
  aspect-ratio: 2;
}
.gallery img:nth-child(1) {
  grid-area: 1 / 1 / span 2 / span 2;
}
.gallery img:nth-child(2) {
  grid-area: 1 / 2 / span 2 / span 2;
}
.gallery img:nth-child(3) {
  grid-area: span 2 / span 2 / -1 / -1;
}
.gallery img:nth-child(4) {
  grid-area: 2 / 1 / span 1 / span 2;
}
.gallery img:nth-child(5) {
  grid-area: span 1 / span 2 / -1 / -1;
}

看到这相信你已经发现我们使用相同方法的例子。我们定义了一个网格并将图像显式地放置在网格上,使用网格区域使图像重叠。最后将重叠的部分进行裁剪达到最终的目的。接下来就是裁剪的部分,我们总共有四个三角形和一个菱形。

986107e21dab5b8e9799d229b5de7d1.png

完整代码:

.gallery img:nth-child(1) {
  grid-area: 1/1/span 2/span 2;
  clip-path: polygon(0 0,100% 0,0 100%);
}
.gallery img:nth-child(2) {
  grid-area: 1/2/span 2/span 2;
  clip-path: polygon(50% 0,100% 50%,50% 100%,0 50%);
}
.gallery img:nth-child(3) {
  grid-area: span 2/span 2/-1/-1;
  clip-path: polygon(0 0,100% 0,100% 100%);
}
.gallery img:nth-child(4) {
  grid-area: 2/1/span 1/span 2;
  clip-path: polygon(50% 0,100% 100%,0 100%);
}
.gallery img:nth-child(5) {
  grid-area: span 1/span 2/-1/-1;
  clip-path: polygon(50% 0,100% 100%,0 100%);
}

基于这个效果可以引出一个更为复杂的多图排版效果,此效果没有上面的对称效果,实现起来相对复杂一点。

de5a9d746e4e9a7f886385817b86ebf.png

但是核心的实现过程都是一样的,可以将整体按以下网格布局进行排列,有兴趣的同学可以自己实现看看。

5e68838ef6a4e74d054aed6e48b863c.png

总结

在整个系列中,我们探索了许多不同类型的图像网格,从基本的东西到我们今天制作的复杂马多图镶嵌。这里面的大量的CSS裁剪实践经验希望在你的项目中可以用到这些经验!

整体代码在线效果:code.juejin.cn/pen/7175445…

看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~


目录
相关文章
|
2月前
|
前端开发 算法 Java
(CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
(CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
121 0
|
2月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
Flex 布局 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。 2009年,W3C 提出了一种新的方案----Flex 布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。 一、Flex 布局是什么? Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。
251 1
|
6月前
|
前端开发
用 CSS Grid 轻松构建复杂布局
用 CSS Grid 轻松构建复杂布局
317 83
|
5月前
|
Web App开发 前端开发 数据可视化
用 CSS Grid 实现高效布局的 3 个实战技巧
用 CSS Grid 实现高效布局的 3 个实战技巧
|
前端开发 容器
使用 CSS Grid 布局实现响应式设计
【10月更文挑战第1天】使用 CSS Grid 布局实现响应式设计
419 99
|
前端开发 UED 容器
在 CSS 中使用 Flex 布局实现页面自适应时需要注意什么?
【10月更文挑战第22天】在使用 Flex 布局实现页面自适应时,需要对其基本原理和特性有深入的理解,同时结合具体的布局需求和场景,进行细致的调整和优化。通过合理的设置和注意事项的把握,才能实现理想的自适应效果,提升用户体验。还可以根据实际情况进行更深入的探索和实践,以不断提升 Flex 布局的应用能力。
|
前端开发 JavaScript 开发者
掌握 CSS 弹性布局(Flexbox):构建复杂页面布局的高效秘籍与实战案例
CSS弹性布局(Flexbox)是现代网页设计中构建复杂页面布局的高效工具。本文将深入浅出地介绍Flexbox的核心概念、使用技巧及实际应用案例,帮助读者快速掌握这一强大布局方法。
|
前端开发 容器
前端技术分享:利用CSS Grid布局实现响应式设计
【10月更文挑战第1天】前端技术分享:利用CSS Grid布局实现响应式设计