搜索
首页web前端css教程哦,制作三角形面包丝带的许多方法!

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
迭代使用样式组件的React设计迭代使用样式组件的React设计Apr 21, 2025 am 11:29 AM

在一个完美的世界中,我们的项目将拥有无限的资源和时间。我们的团队将开始使用经过深思熟虑的UX设计进行编码。

哦,制作三角形面包丝带的许多方法!哦,制作三角形面包丝带的许多方法!Apr 21, 2025 am 11:26 AM

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

CSS指南中的SVG属性CSS指南中的SVG属性Apr 21, 2025 am 11:21 AM

SVG具有自己的一套元素,属性和属性集,以至于内联SVG代码可能会变得漫长而复杂。通过利用CSS和SVG 2规范的一些即将到来的功能,我们可以减少该代码以进行清洁标记。

交叉观察者的一些功能用途可以知道何时在元素中查看交叉观察者的一些功能用途可以知道何时在元素中查看Apr 21, 2025 am 11:19 AM

您可能不知道这一点,但是JavaScript最近偷偷地积累了许多观察者,而交叉观察者是其中的一部分

恢复偏爱减少运动恢复偏爱减少运动Apr 21, 2025 am 11:18 AM

我们可能不需要扔掉所有CSS动画。请记住,这更喜欢减少动作,而不喜欢不运动。

如何将进步的Web应用程序进入Google Play商店如何将进步的Web应用程序进入Google Play商店Apr 21, 2025 am 11:10 AM

PWA(Progressive Web应用程序)已经与我们在一起了一段时间。但是,每次我尝试向客户解释它时,同样的问题都会出现:“我的用户会成为

处理HTML的最简单方法包括处理HTML的最简单方法包括Apr 21, 2025 am 11:09 AM

这对我来说非常令人惊讶,HTML从未在其中包含其他HTML文件。似乎也没有任何东西

更改悬停在悬停的SVG的颜色更改悬停在悬停的SVG的颜色Apr 21, 2025 am 11:04 AM

使用SVG有很多不同的方法。取决于哪种方式,在不同状态或条件下重新定制该SVG的策略 - 悬停,

See all articles

热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

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

热工具

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

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