”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 依靠 CSS Clip Path 在 DOM 中制作很酷的形状而无需图像

依靠 CSS Clip Path 在 DOM 中制作很酷的形状而无需图像

发布于2024-07-31
浏览:138

Lean on CSS Clip Path to Make Cool Shapes in the DOM without Images

介绍

直到几年前,如果您想要网站的背景形状或部分不是矩形,您很可能需要设计师为您提供静态 PNG 或 JPEG 图像,并根据需要添加,但 CSS 已经从那时起,我的朋友们已经走了很长的路。

当我进行网站更新时,将页面上的内容分解为不同颜色的背景部分,在纯白色和柔和的灰色之间交替,我的设计模型包含了一个底部边缘向上倾斜的部分,右侧而不是像典型的块元素那样以完美的 90 度角穿过页面。

现在我可以要求设计师制作一个背景图像来为我做这件事,但我想看看我是否可以利用 CSS 的力量自己完成这件事。你瞧,我可以使用 CSS Clip-path。

DOM 中有趣的形状和视觉效果不再纯粹是设计师的领域,借助 CSS 剪辑路径等工具,开发人员有能力重塑元素,我将向您展示如何操作。


CSS 剪辑路径

如果您像我一样不太熟悉 CSS Clip-path 属性,它会创建一个剪切区域来设置应显示元素的哪些部分。显示区域内的部分,隐藏区域外的部分。

Lean on CSS Clip Path to Make Cool Shapes in the DOM without Images

来自 MDN 剪辑路径文档的演示。不同的剪辑路径选项提供热气球和文本的不同视图。

clip-path 属性可以接受多种值:

  • ,它接受定义了剪切路径的 SVG 元素的 url 之类的值。
  • ,接受 margin-box 和 border-box 等值。
  • ,接受 Circle() 和 rect() 等值。
  • 全局值,接受继承和恢复等值。

值甚至可以在一个剪辑路径中组合在一起。

/* this CSS combines two different clip path properties */
clip-path: padding-box circle(50px at 0 100px);

这篇文章没有详细介绍 Clip-path 可以接受的所有属性以及如何组合它们来创建相当复杂的形状。如果您想了解更多关于 Clip=path 的信息和示例,我建议您从 Mozilla 文档开始。

clip-path 接受的 属性之一是 polygon(),这最终成为我倾斜背景部分所需的解决方案。

我需要用 CSS 重新创建的多边形

Lean on CSS Clip Path to Make Cool Shapes in the DOM without Images

我需要用 CSS 创建灰色多边形背景。

上图是我需要使用 CSS Clip-path 的 Polygon() 属性重新创建的灰色背景部分的屏幕截图。我需要做的第一件事是创建一些 HTML 元素来应用 CSS。

polygon() 剪辑路径 vs rect() 剪辑路径

您可能想知道为什么我选择使用 Polygon() 属性而不是带有 Clip-path 的 rect() 属性。虽然两者相似,但 Polygon() 可以创建更复杂的多边形形状,并通过接受坐标对来定义多边形的每个顶点,为高级设计提供更大的多功能性,而 rect() 只能处理矩形形状。

设置 HTML 和 CSS

我正在开发的网站依赖于静态网站生成器 Hugo,这是一个基于 Go 的框架。 Hugo 使用模板来呈现网站的 HTML,因此如果您了解 HTML,下面的示例代码应该看起来相对熟悉。

模板说明:

如果您曾经使用过 JSX 组件、带有 Pug 或 Handlebars 的 Node.js,或者 Jekyll - Hugo 的模板都是类似的:带有 Go 变量和函数的 HTML 元素,散布在 {{ }} 中,以便在模板的任何位置呈现正确的信息被注入。

这是我昵称为页面“拼图部分”的代码,因为该部分的前景中有拼图。为了本文的目的和清晰起见,我用生成的 HTML 替换了注入模板中的 Go 变量。

single.html

  

Lorem ipsum dolor

Sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Ipsum dolor sit amet consectetur adipiscing elit pellentesque.

Duis aute irure dolor in reprehenderit

in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Consectetur adipiscing elit pellentesque habitant morbi tristique senectus et.

Puzzle pieces

这一段代码比较紧凑,但是值得讨论。除了 HTML 元素之外,还有相当多的 CSS 类来自 Bootstrap 库,这是用于响应式网页设计的原始开源 CSS 框架之一。

在像about-body这样的自定义类中,我用它来添加自定义样式,其中有container、row、col-12或col-md-6、mb-5和mb-3等类。

后面的所有类都是 Bootstrap 类,它们的作用是当视口超过一定宽度 (col-md-6) 时,使屏幕上的文本和图像元素共享页面的宽度,或者应用 margin-bottom一定数量的

标签(mb-3 或 mb-5)。

Bootstrap 类不是本文的重点,要关注的类是 puzzle-section,它包含所有文本和拼图图像。

这个拼图部分类是我们要添加clip-path属性的地方,以使用稍微倾斜、向上和向右的设计来显示文本和图像后面的浅灰色背景。

添加 CSS 剪辑路径来塑造拼图部分

由于我不太确定如何将正常的矩形

设计为不均匀的形状,我开始在网上寻找解决方案,并发现了这个有用的、以交互式剪辑路径为中心的网站,CSS 剪辑路径制作器.

Lean on CSS Clip Path to Make Cool Shapes in the DOM without Images

这个CSS剪辑路径制作器网站非常棒,因为它有大量的预设形状、可调整的图像大小和背景,并且当前显示的图像的顶点可以拖动到您想要的任何排列中。屏幕底部的行显示了确切的剪辑路径 CSS 值,您可以将其复制/粘贴到自己项目的 CSS 中。

我选择平行四边形预设形状作为起点,然后拖动角以匹配我试图从头开始重新创建的背景部分的角度。当我对它看起来准确感到满意后,我将页面底部的 CSS 行复制到剪贴板。

在我的项目的 SCSS 文件中,除了浅灰色背景颜色属性和一些填充之外,我还添加了复制的剪辑路径 CSS,以便为文本和拼图图像在页面上提供一些喘息空间。

注意: 尽管示例代码中显示的文件是 SCSS 而不是纯 CSS,但对于本文而言,它在这里应该没有什么区别。应该是直接1:1比较。

about.scss

.about-body {
  // this white sets the white background color for the whole webpage
  background-color: white; 

  .puzzle-section {
    // clip-path code copied from the clip-path maker website
    clip-path: polygon(0 0, 100% 0%, 100% 75%, 0% 100%);
    background-color: light-grey;
    padding: 2rem 0 10rem 0;
  }
}

clip-path 的那一点 CSS 就足以将我的完美矩形 DOM 元素转变为不完美的多边形。不是太寒酸!


结论

CSS 正在突破 Web 开发人员可以做的事情的界限,而无需一直求助于图像、视频和自定义设计的元素。弄清楚如何独自完成一些很酷的设计所带来的满足感让人感觉非常有力量。

最近的一个示例是使用 CSS Clip-path 属性为某些底部边缘不均匀的文本和图像创建背景框。在专门对所有形状和大小的剪辑路径进行解码的交互式网站的帮助下,我能够快速处理这个稍微倾斜的多边形。

让我花点时间表达一下我对那些为其他开发人员提供解决非常具体问题的小网站或代码片段的人们的感激之情 - 你们继续让互联网变得更美好。

几周后回来查看 — 我将撰写更多有关 JavaScript、React、IoT 或其他与 Web 开发相关的内容的文章。

如果您想确保永远不会错过我写的文章,请在此处注册我的时事通讯:https://paigeniedringhaus.substack.com

谢谢阅读。我希望学习仅使用 CSS 的力量来重塑元素在 DOM 中的外观对您有帮助,就像对我有帮助一样。


更多参考资料和资源

  • MDN 文档、CSS 剪辑路径
  • CSS 剪辑路径生成器网站
版本声明 本文转载于:https://dev.to/paigen11/lean-on-css-clip-path-to-make-cool-shapes-in-the-dom-without-images-2d7c?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    在Visual Studio 2012 尽管已安装了MySQL Connector v.6.5.4,但无法将MySQL数据库添加到实体框架的“ DataSource对话框”中。为了解决这一问题,至关重要的是要了解MySQL连接器v.6.5.5及以后的6.6.x版本将提供MySQL的官方Visual...
    编程 发布于2025-03-25
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-03-25
  • 如何在无序集合中为元组实现通用哈希功能?
    如何在无序集合中为元组实现通用哈希功能?
    在未订购的集合中的元素要纠正此问题,一种方法是手动为特定元组类型定义哈希函数,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    编程 发布于2025-03-25
  • 如何使用Python理解有效地创建字典?
    如何使用Python理解有效地创建字典?
    在python中,词典综合提供了一种生成新词典的简洁方法。尽管它们与列表综合相似,但存在一些显着差异。与问题所暗示的不同,您无法为钥匙创建字典理解。您必须明确指定键和值。 For example:d = {n: n**2 for n in range(5)}This creates a dicti...
    编程 发布于2025-03-25
  • 每个开发人员都应该掌握的最重要的JavaScript概念
    每个开发人员都应该掌握的最重要的JavaScript概念
    [2 1。掌握现代JavaScript:顶级ES6功能您需要知道 随着ES6(Ecmascript 2015)和后续版本的介绍,JavaScript已大大发展。诸如LET and const,箭头功能,模板文字和破坏等基本功能使您可以编写更清洁,更有效的代码。 关键概...
    编程 发布于2025-03-25
  • 为什么我会在PHP中“找不到HTTPS包装器”错误?
    为什么我会在PHP中“找不到HTTPS包装器”错误?
    无法找到https wrapper-解决问题背景: 通常在尝试使用php's file_get_get_contents()尝试通过https访问https访问https时会出现此错误消息。根本原因是缺乏必要的HTTPS包装器,必须在PHP的配置中启用。故障排除步骤: 1。验证扩展加载: ...
    编程 发布于2025-03-25
  • 如何使用Regex在PHP中有效地提取括号内的文本
    如何使用Regex在PHP中有效地提取括号内的文本
    php:在括号内提取文本在处理括号内的文本时,找到最有效的解决方案是必不可少的。一种方法是利用PHP的字符串操作函数,如下所示: 作为替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式来搜索特...
    编程 发布于2025-03-25
  • 如何解决由于Android的内容安全策略而拒绝加载脚本... \”错误?
    如何解决由于Android的内容安全策略而拒绝加载脚本... \”错误?
    Unveiling the Mystery: Content Security Policy Directive ErrorsEncountering the enigmatic error "Refused to load the script..." when deployi...
    编程 发布于2025-03-25
  • 如何使用Java.net.urlConnection和Multipart/form-data编码使用其他参数上传文件?
    如何使用Java.net.urlConnection和Multipart/form-data编码使用其他参数上传文件?
    使用http request 上传文件上传到http server,同时也提交其他参数,java.net.net.urlconnection and Multipart/form-data Encoding是普遍的。 Here's a breakdown of the process:Mu...
    编程 发布于2025-03-25
  • 如何在全高布局中有效地将Flexbox和垂直滚动结合在一起?
    如何在全高布局中有效地将Flexbox和垂直滚动结合在一起?
    在全高布局中集成flexbox和垂直滚动传统flexbox方法(旧属性)使用新的FlexBox properties 试图将全新的FlexBox属性应用于全高和可滚动的设计引入限制。使用高度的解决方法:0px;包装器上的元素是不可靠的,并创建了其他问题。一个鲁棒的解决方案涉及为需要垂直滚动的特定高...
    编程 发布于2025-03-25
  • 如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    为有效的slug生成首先,该函数用指定的分隔符替换所有非字母或数字字符。此步骤可确保slug遵守URL惯例。随后,它采用ICONV函数将文本简化为us-ascii兼容格式,从而允许更广泛的字符集合兼容性。接下来,该函数使用正则表达式删除了不需要的字符,例如特殊字符和空格。此步骤可确保slug仅包含...
    编程 发布于2025-03-25
  • 如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
    编程 发布于2025-03-25
  • 如何使用node-mysql在单个查询中执行多个SQL语句?
    如何使用node-mysql在单个查询中执行多个SQL语句?
    Multi-Statement Query Support in Node-MySQLIn Node.js, the question arises when executing multiple SQL statements in a single query using the node-mys...
    编程 发布于2025-03-25
  • 如何在Java中执行命令提示命令,包括目录更改,包括目录更改?
    如何在Java中执行命令提示命令,包括目录更改,包括目录更改?
    在java 通过Java通过Java运行命令命令可能很具有挑战性。尽管您可能会找到打开命令提示符的代码段,但他们通常缺乏更改目录并执行其他命令的能力。 solution:使用Java使用Java,使用processBuilder。这种方法允许您:启动一个过程,然后将其标准错误重定向到其标准输出。...
    编程 发布于2025-03-25
  • 如何正确使用与PDO参数的查询一样?
    如何正确使用与PDO参数的查询一样?
    在pdo 中使用类似QUERIES在PDO中的Queries时,您可能会遇到类似疑问中描述的问题:此查询也可能不会返回结果,即使$ var1和$ var2包含有效的搜索词。错误在于不正确包含%符号。通过将变量包含在$ params数组中的%符号中,您确保将%字符正确替换到查询中。没有此修改,PDO...
    编程 发布于2025-03-25

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3