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

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

本文翻译自 CSS Grid and Custom Shapes, Part 3,略有删改

原作者:Temani Afif

基于CSS自定义网格已发布第一部分和第二部分,本文将开始第三部分探讨更多的奇特自定义形状,与之前的文章一样,核心还是基于CSS grid,clip 和 mask来自定义网格形状布局。

CSS网格和自定义形状系列

第1部分

第2部分

第3部分(当前文章)

三部分文章不一定要按照顺序阅读,之间没有强制的关联关系,但是可以看看之前的文章,了解作者是如何完成当前的效果,接下来开始我们的第一个案例。

案例一 图片库

0e36160919d8ebad782674486564329.png

以上效果图我们的HTML代码如下:

<div class="gallery">
  <img src="..." alt="...">
  <img src="..." alt="...">
  <img src="..." alt="...">
  <img src="..." alt="...">
</div>

本系列的主要挑战都是尽可能使用少量的html标签,后续的示例也是使用相同的html代码,不会有其他的div,嵌套元素等,仅需要如上的代码结构。 然后再来看看CSS代码:

.gallery {
  --g: 6px; /* the gap */
  display: grid;
  width: 450px; /* the size */
  aspect-ratio: 1; /* equal height */
  grid: auto-flow 1fr / repeat(3, 1fr);
  gap: var(--g);
}
.gallery img:nth-child(2) {
  grid-area: 1 / 2 / span 2 / span 2;
}
.gallery img:nth-child(3) {
  grid-area: 2 / 1 / span 2 / span 2;
}

基于上面的CSS是可以看出把整个盒子分为了一个3 ✖️ 3 的网格,第二个和第三个图像设定了相应的网格属性,第一个和最后一个图像将自动围绕布局。

这里的核心代码是 grid: auto-flow 1fr / repeat(3, 1fr);,这里使用了CSS网格简写属性,相当于以下代码:

grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 1fr;

简写属性对应每个属性的值可以通过浏览器DevTools展开看到以下数据。

eb1e2cd5ddaff60dee446f5e8825659.png

此同样适用于网格区域属性,当我们定义CSS网格面积为:

grid-area: 1 / 2 / span 2 / span 2;

最终对应的具体属性值如下:

grid-row-start: 1; /* 从第一行开始 */
grid-column-start: 2; /* 从第二列开始 */
grid-row-end: span 2; /* 占据两行 */
grid-column-end: span 2; /* 占据两列 */

基于以上网格区域声明,即得到以下结果:

4ebef76f255ff4b0db773803acfae4b.png

我们的第二张和第三张图像在中间重叠,这是故意将它们重叠在一起,这样就可以使用 clip-path,从两个图像中裁剪出一部分,得到最终的效果:

e8fe1b173bdf9325ae710d104411840.png

们可以使用CSS clip-path 属性裁剪第二张图片(img:nth-child(2))的左下角:

clip-path: polygon(0 0, 100% 0, 100% 100%, calc(50% + var(--g) / 4) 100%, 0 calc(50% - var(--g) / 4))

裁剪第三张图片(img:nth-child(3))的右上角:

clip-path: polygon(0 0, calc(50% - var(--g) / 4) 0, 100% calc(50% + var(--g) / 4), 100% 100%, 0 100%);

如果不理解 clip-path 的用法,我有一篇文章详细介绍如何使用这种技术。

案例二 图片分割效果

接下来我们基于上面用到的裁剪图片技术结合鼠标悬停完成一个不错的交互效果。

b335017f7cc254a26fe2856fc12b6c1.png

这个效果的网格配置没有上一张强烈,因为我们只需要两张重叠的图像:

.gallery {
  display: grid;
}
.gallery > img {
  grid-area: 1 / 1;
  width: 350px; /* the size */
  aspect-ratio: 1; /* equal height */
}

悬停效果依赖于动画剪辑路径。我们将详细剖析第一个图像的代码,看看它是如何实现的,然后用更新的值将相同的代码应用到第二个图像。仔细分析可以得出整个动画过程中出现有三种不同的状态:

  1. 当图像没有鼠标悬停时,将显示每个图像的一半。
  2. 当鼠标悬停在第一张图像上时,它会更完全地显示出来,但会保留一个小角。
  3. 当鼠标悬停在第二张图片上时,第一张图片只有一个小三角形可见。

49ac242dc2ff36a48b1eddf1b65f08b.png

在每种状态下,我们都有一个三角形。这意味着我们需要一个三点多边形作为clip-path的值。

什么?你可能有疑问,第二个状态不是三角形,而是一个带有切角的正方形。

肉眼看确实是一个带有切角的正方形,但如果我们仔细看,我们可以看到一个“隐藏”的三角形,给图像添加一个方框阴影的效果就比较清晰了。

box-shadow: 0 0 0 200px red;

70c9a426959a00824133b0ce2ce302a.png

这是什么原理呢?原理就是 clip-path 接受0%-100%范围之外的值,这将允许我们创建“溢出”元素本身的形状。这样我们只需要使用三个点,而不是使用五个点,就可以完成我们期望的效果。最终图片的 clip-path 属性值如下所示:

.gallery > img:first-child {
  clip-path: polygon(0 0, calc(100% + var(--_p)) 0 , 0 calc(100% + var(--_p)))
}
.gallery > img:last-child {
  clip-path: polygon(100% 100%, 100% calc(0% - var(--_p)), calc(0% - var(--_p)) 100%)
}

这里增加了--_p变量,即两图之间的间隙距离。基于此来优化代码,因为我们添加了悬停过渡。我们不需要更新整个clip-path,而只更新此变量即可以获得动画效果。 最后是增加悬停后的完整代码:

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

热门文章

最新文章

  • 1
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    103
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    135
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    110
  • 4
    (CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
    82
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    208
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    229
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    120
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    61
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    116
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    154