目录
HTML结构
基础样式
创建独特的三角形形状
方法一:边框方法
方法二:背景图像方法
首页 web前端 css教程 哦,制作三角形面包丝带的许多方法!

哦,制作三角形面包丝带的许多方法!

Apr 21, 2025 am 11:26 AM

Oh, the Many Ways to Make Triangular Breadcrumb Ribbons!

多种制作三角形面包屑条带的方法

本文探讨如何创建一系列相互连接的链接,它们呈现出类似于阶梯式面包屑导航中所见的V形形状和每个区块上的凹口。

这种样式在网页设计中很常见,例如多步骤表单和网站面包屑导航。我们将这些样式称为“条带”,以便于理解。

与许多网页元素一样,我们可以通过多种方法创建这些条带!我创建了一个演示页面,其中包含多种方法,例如使用CSS三角形、SVG背景和CSS clip-path属性。

HTML结构

每个演示的HTML结构基本相同,包含一个充当父元素的<nav></nav>元素和作为子元素的链接。

<nav aria-label="breadcrumbs" role="navigation"><a href="https://www.php.cn/link/3dc023ccc7e0bd23ce2d4427756fd03c">主页</a>
  <a href="https://www.php.cn/link/3dc023ccc7e0bd23ce2d4427756fd03ccategories/articles/">博客</a>
  <a aria-current="page" href="https://www.php.cn/link/3dc023ccc7e0bd23ce2d4427756fd03carticles/building-an-animated-sticky-header-with-custom-offset/">文章</a>
</nav>
登录后复制

请注意,根据A11y Style Guide网站,这些元素应符合无障碍性标准。在设计组件时,务必考虑无障碍性,并在一开始就引入无障碍性是避免出现“忘记添加无障碍性”问题的最佳方法。

基础样式

对于这类样式,我们需要确保元素大小正确。为此,我们将定义.ribbon(我们将这些元素称为“条带”)包装元素的字体大小,然后在子元素(链接)上使用em单位。

/* 定义包装元素的字体大小 */
.ribbon {
  font-size: 15px;
}

/* 使用em单位定义条带元素的大小 */
.ribbon__element {
  font-size: 1.5em;
  letter-spacing: 0.01em;
  line-height: 1.333em;
  padding: 0.667em 0.667em 0.667em 1.333em;
}
登录后复制

这种技术有利于定义每个条带的三角形形状大小,因为我们将使用相同的大小来计算三角形。由于我们使用em单位来计算条带元素的大小,我们可以通过重新定义包装元素的字体大小来调整所有元素的大小。

让我们使用CSS Grid进行布局,因为我们可以这样做。我们可以使用更广泛支持浏览器的方法来实现,但这取决于您的支持需求。

我们将定义四列:

  • 三列用于条带元素
  • 一列用于解决间距问题。按原样,右箭头形状将放置在条带组件的外部,这可能会弄乱原始布局。
/* 包装元素
 * 我们使用CSS Grid,但请确保它符合您的浏览器支持要求。
 * 假设使用autoprefixer进行供应商前缀和属性。
 */

.ribbon {
  display: grid;
  grid-gap: 1px;
  grid-template-columns: repeat(auto-fill, 1fr) 1em; /* 自动填充三个条带元素加上一列窄列以解决大小问题 */
}
登录后复制

如果您希望避免拉伸条带元素,则可以不同地定义网格。例如,我们可以使用max-content根据内容大小调整列。(但是,请注意,max-content在某些主要浏览器中尚不支持。)

/* 使条带列根据最大内容大小调整 */
.ribbon--auto {
  grid-template-columns: repeat(3, max-content) 1em;
}
登录后复制

我相信有很多不同的方法可以进行布局。我喜欢这种方法,因为它定义了条带元素之间的确切间隙,无需复杂的计算。

无障碍性不仅仅是添加aria属性。它还包括颜色对比度和可读性,以及添加悬停和焦点状态。如果您不喜欢轮廓样式,可以使用其他CSS属性,例如box-shadow。

/* 使用当前链接颜色,但在悬停时添加下划线 */
.ribbon__element:hover,
.ribbon__element:active {
  color: inherit;
  text-decoration: underline;
}

/* 清除默认轮廓样式并使用内嵌盒阴影表示焦点状态 */
.ribbon__element:focus {
  box-shadow: inset 0 -3px 0 0 #343435;
  outline: none;
}
登录后复制

创建独特的三角形形状

在定义每个条带末尾的三角形时,我们有多种选择。我们可以:

  1. 使用伪元素和边框创建三角形
  2. 在伪元素上使用SVG背景图像
  3. 使用内联SVG图像
  4. 使用polygon()函数创建clip-path

让我们深入研究每一个。

方法一:边框方法

首先,我们应该将元素的宽度和高度设置为零,这样它就不会妨碍我们用来绘制三角形的伪元素。然后,我们应该使用边框绘制三角形,具体来说,是定义与背景颜色匹配的实心左边框,使其与条带的其余部分融合。接下来,让我们定义顶部和底部边框,并将其设置为透明。这里的技巧是计算边框的大小。

我们的条带元素的内容大小为行高值加上顶部和底部填充:

<code>1.333em   0.667em   0.667em = 2.667em</code>
登录后复制

这意味着我们的顶部和底部边框应该为此大小的一半。唯一剩下的就是将元素绝对定位到组件的正确侧边。

/* 左箭头 */
.ribbon--alpha .ribbon__element:before {
  /* 使内容大小为零 */
  content: '';
  height: 0;
  width: 0;

  /* 使用边框使伪元素适合条带大小 */
  border-bottom: 1.333em solid transparent;
  border-left: 0.667em solid #fff;
  border-top: 1.333em solid transparent;

  /* 将元素绝对定位在条带元素的左侧 */
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
}

/* 右箭头 */
.ribbon--alpha .ribbon__element:after {
  /* 使内容大小为零 */
  content: '';
  height: 0;
  width: 0;

  /* 使用边框使伪元素适合条带大小 */
  border-bottom: 1.333em solid transparent;
  border-left: 0.667em solid;
  border-top: 1.333em solid transparent;

  /* 将元素绝对定位在条带元素的右侧并将其推到外部 */
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  -webkit-transform: translateX(0.667em);
  transform: translateX(0.667em);
}
登录后复制

由于右三角形应与条带的背景颜色匹配,因此请记住为每个条带的伪元素添加正确的边框颜色。

/* 第一个元素的右箭头 */
.ribbon--alpha .ribbon__element:nth-child(1):after {
  border-left-color: #11d295;
}

/* 第二个元素的右箭头 */
.ribbon--alpha .ribbon__element:nth-child(2):after {
  border-left-color: #ef3675;
}

/* 第三个元素的右箭头 */
.ribbon--alpha .ribbon__element:nth-child(3):after {
  border-left-color: #4cd4e9;
}
登录后复制

就是这样!

方法二:背景图像方法

我们还可以使用背景图像创建三角形。这需要创建与设计匹配的图像,这有点麻烦,但仍然完全有可能。我们将在这里使用SVG,因为它在任何分辨率下都很流畅。

与边框三角形方法不同,我们希望将伪元素的高度与条带元素的高度(或100%)匹配。组件的宽度应与边框三角形的左边界宽度匹配,在我们的例子中为0.666666em。然后,我们应该在左侧三角形上使用白色三角形作为背景图像,然后在右侧三角形上使用彩色三角形图像。同样,我们使用绝对定位将三角形放置到条带元素的正确侧边。

/* 左箭头 */
.ribbon--beta .ribbon__element:before {
  /* 定义箭头大小 */
  content: '';
  height: 100%;
  width: 0.666666em;

  /* 定义与背景颜色匹配的背景图像 */
  background-image: url(data:image/svg xml;base64,PHN2ZyBoZWlnaHQ9IjQwIiB2aWV3Qm94PSIwIDAgMTAgNDAiIHdpZHRoPSIxMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBmaWxsPSIjZmZmIj48cGF0aCBkPSJtNSAxNSAyMCAxMGgtNDB6IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHRyYW5zZm9ybT0ibWF0cml4KDAgLTEgLTEgMCAyNSAyNSkiLz48L3N2Zz4=);
  background-position: center left;
  background-repeat: no-repeat;
  background-size: 100%;

  /* 将元素绝对定位在条带元素的左侧 */
  position: absolute;
  bottom: 0;
  top: 0;
  left: 0;
}

/* 右箭头 */
.ribbon--beta .ribbon__element:after {
  /* 定义箭头大小 */
  content: '';
  height: 100%;
  width: 0.667em;

  /* 定义背景图像属性 */
  background-position: center left;
  background-repeat: no-repeat;
  background-size: 100%;

  /* 将元素绝对定位在条带元素的右侧并将其推到外部 */
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  -webkit-transform: translateX(0.667em);
  transform: translateX(0.667em);
}

/* 定义与第一个元素的背景颜色匹配的背景图像 */
.ribbon--beta .ribbon__element:nth-child(1):after {
  background-image: url(data:image/svg xml;base64,PHN2ZyBoZWlnaHQ9IjQwIiB2aWV3Qm94PSIwIDAgMTAgNDAiIHdpZHRoPSIxMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJtNSAxNSAyMCAxMGgtNDB6IiBmaWxsPSIjMTFkMjk1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHRyYW5zZm9ybT0ibWF0cml4KDAgLTEgLTEgMCAyNSAyNSkiLz48L3N2Zz4=);
}

/* 定义与第二个元素的背景颜色匹配的背景图像 */
.ribbon--beta .ribbon__element:nth-child(2):after {
  background-image: url(data:image/svg xml;base64,PHN2ZyBoZWlnaHQ9IjQwIiB2aWV3Qm94PSIwIDAgMTAgNDAiIHdpZHRoPSIxMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJtNSAxNSAyMCAxMGgtNDB6IiBmaWxsPSIjZWYzNjc1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHRyYW5zZm9ybT0ibWF0cml4KDAgLTEgLTEgMCAyNSAyNSkiLz48L3N2Zz4=);
}

/* 定义与第三个元素的背景颜色匹配的背景图像 */
.ribbon--beta .ribbon__element:nth-child(3):after {
  background-image: url(data:image/svg xml;base64,PHN2ZyBoZWlnaHQ9IjQwIiB2aWV3Qm94PSIwIDAgMTAgNDAiIHdpZHRoPSIxMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJtNSAxNSAyMCAxMGgtNDB6IiBmaWxsPSIjNGNkNGU5IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHRyYW5zZm9ybT0ibWF0cml4KDAgLTEgLTEgMCAyNSAyNSkiLz48L3N2Zz4=);
}
登录后复制

就是这样!

其余部分与原文相似,只是对语句进行了调整和替换,保持了原文意思不变。 由于篇幅限制,这里不再赘述。 请参考原文继续学习剩余部分。

以上是哦,制作三角形面包丝带的许多方法!的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

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

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

VUE 3 VUE 3 Apr 02, 2025 pm 06:32 PM

它的出局!恭喜Vue团队完成了完成,我知道这是一项巨大的努力,而且很长时间。所有新文档也是如此。

使用Redwood.js和Fauna构建以太坊应用 使用Redwood.js和Fauna构建以太坊应用 Mar 28, 2025 am 09:18 AM

随着最近比特币价格超过20k美元的攀升,最近打破了3万美元,我认为值得深入研究创建以太坊

您可以从浏览器获得有效的CSS属性值吗? 您可以从浏览器获得有效的CSS属性值吗? Apr 02, 2025 pm 06:17 PM

我有人写了这个非常合法的问题。 Lea只是在博客上介绍了如何从浏览器中获得有效的CSS属性。那样的是这样。

比较浏览器的响应式设计 比较浏览器的响应式设计 Apr 02, 2025 pm 06:25 PM

这些桌面应用程序中有许多目标是同时在不同的维度上显示您的网站。因此,例如,您可以写作

在CI/CD上有点 在CI/CD上有点 Apr 02, 2025 pm 06:21 PM

我说的“网站”比“移动应用程序”更合适,但我喜欢Max Lynch的框架:

带有粘性定位的堆叠卡和一点点的杂物 带有粘性定位的堆叠卡和一点点的杂物 Apr 03, 2025 am 10:30 AM

前几天,我发现了科里·金尼文(Corey Ginnivan)网站上的这一点,当您滚动时,彼此之间的卡片堆放集。

在WordPress块编辑器中使用Markdown和本地化 在WordPress块编辑器中使用Markdown和本地化 Apr 02, 2025 am 04:27 AM

如果我们需要直接在WordPress编辑器中向用户显示文档,那么最佳方法是什么?

为什么Flex布局中的紫色斜线区域会被误认为是'溢出空间”? 为什么Flex布局中的紫色斜线区域会被误认为是'溢出空间”? Apr 05, 2025 pm 05:51 PM

关于Flex布局中紫色斜线区域的疑问在使用Flex布局时,你可能会遇到一些令人困惑的现象,比如在开发者工具(d...

See all articles