您可能已经知道可以使用 CSS 创建三角形。 但是,如果您想在其后面添加阴影怎么办? 不幸的是,经典的边框技巧不会改变元素的形状,它只是一个视觉技巧。 让我们看看几个替代解决方案。
直接使用 Unicode
Unicode 中有三角形字符。 例如
▲▼◀▶
还有 更多。
如果将其用作三角形,则可以选择它并对其进行各种花哨的处理。
<span class="triangle">▲</span>
.triangle {
color: #BADA55;
text-shadow: 0 0 20px black;
}
颜色、阴影、大小,等等。 您甚至可以变得更花哨。 如果三角形不是您想要的精确形状或指向错误的方向,则可以使用 CSS3 变换功能将其拉伸或旋转。 这是一个类似的演示
查看 Chris Coyier 在 CodePen 上编写的笔 myomvM(@chriscoyier)。
我喜欢这种技术,但有一些显而易见的问题。 一个是依赖 CSS3 变换功能无法获得非常广泛的浏览器支持。 当然不支持 IE 8。 但是,这篇文章是关于阴影的,因此无论如何都是 CSS3。 比这更旧的浏览器也可能无法处理 Unicode 图标本身。 所以请注意。
双盒方法
假设我们对 CSS3 满意,一种方法是使用一个具有隐藏溢出的容器框,以及一个在其内部旋转并悬挂在容器框外的另一个框。 仍然可见的部分将形成一个三角形。 然后,您可以在两个框上使用 box-shadow 以在整个周围实现阴影。
<div class="triangle-with-shadow"></div>
.triangle-with-shadow {
width: 100px;
height: 100px;
position: relative;
overflow: hidden;
box-shadow: 0 16px 10px -17px rgba(0, 0, 0, 0.5);
}
.triangle-with-shadow:after {
content: "";
position: absolute;
width: 50px;
height: 50px;
background: #999;
transform: rotate(45deg); /* Prefixes... */
top: 75px;
left: 25px;
box-shadow: -1px -1px 10px -2px rgba(0, 0, 0, 0.5);
}
请注意,我们在父级中使用负扩散半径,以便阴影仅从一侧发出。 这是一个类似的演示
查看 Chris Coyier 在 CodePen 上编写的笔 带阴影的三角形(@chriscoyier)。
直接使用图像
我不太喜欢这种方法,因为它是一个额外的 HTTP 请求或在您的精灵中需要管理的另一件事。 并且您将拥有“响应式图像”(除非您准备了多个版本并尽最大努力进行修复,否则在像素密集型显示器上看起来不太好)。 其他技术本质上是用矢量绘制的,因此在任何环境中都将保持清晰。
但是,没有人会因此而死亡,并且您将获得良好的浏览器支持。
未来
您将能够使用 filter: drop-shadow()
非常轻松地为形状投下阴影。 这是一篇关于它的文章。
一如既往,您继续令人惊叹。
还有其他人对即使在此时,在 html 中获得任何非矩形形状是多么的困难感到难过吗? 一个三角形。 您知道,希腊人非常了解的那种东西? a^2 + b^2 = c^2 ?
而且不要让我开始谈论圆圈。
我想这就是 canvas 的用途。
这是一个 canvas 示例。
http://jsfiddle.net/SdeeV/
我希望这能起作用
使用 Unicode 字符是否存在任何浏览器或操作系统兼容性问题?
使用 Unicode 似乎比使用边框创建三角形更简单。 此外,还可以使用 text-shadow! 我喜欢它。
IE8 似乎不喜欢 Unicode。 它未能通过 Modernizr 测试,但至少在这种情况下可以使用后备方案。
实际上,IE8 支持一些 Unicode 字符。
例如,它支持“黑色向下指向的三角形”,但不支持“黑色小向下指向的三角形”……很奇怪。
要正确显示奇怪的 Unicode 字符,用户需要安装相应的字体,该字体支持该字符。
我想您可以使用网络字体来解决此问题,但在那种情况下,为什么不使用符号字体呢?
事实证明,
#BADA55
颜色并不是真正的厉害……看到这个很失望 :(这个也逗乐我了。 :P
顺便说一句,Unicode 字符的技巧不错,我喜欢它!
很高兴我不是唯一注意到这一点的人 :)
如果边框足够,则始终可以执行以下操作
使用边框创建纯 CSS 箭头(工具提示)
相同内容的 Canvas 版本。
http://jsfiddle.net/SdeeV/
我喜欢字体解决方案,但为什么不避免 Unicode 问题并使用 @font-face 使用符号字体呢? 这样,大多数浏览器都能提供支持,即使三角形并不总是带有阴影,您也可以保留它。
如何在 span 选择器中放置
transition: all 0.2s ease;
以使其在悬停三角形时更平滑。
只有我一个人对 Unicode 三角形不是以 4 种不同的方式旋转成完全相同的形状,而是 4 个大小和尺寸略有不同的三角形感到困扰吗? 在左右三角形中最为明显——右指向的三角形比左指向的三角形稍短。 这让我非常抓狂!
不错。 我完全惊叹于这个解决方案。 但我很好奇是否可以使用相同的方法创建其他图标或形状。 如果可以,谁能分享 URL?
color: #BADA55 哈哈哈哈哈。 很好。 不过,在主题方面,我们创建了两个自定义字体并使用 Font Squirrel 生成了不同的版本。 这为我们节省了很多更改悬停颜色时的麻烦,甚至只是过渡效果也变得更容易处理。
Sinan
我喜欢这个主意。 对字体工具有什么推荐吗?
嗨,Steve,
首先,我们使用 Illustrator 准备所有想要的字符“图标”,然后使用http://www.fontlab.com/创建字体,最后使用http://www.fontsquirrel.com/的字体生成器转换我们的字体。
当然,您可以使用任何其他字体创建软件。这是我产生的一种想法,因为项目发布后,设计和布局发生了太多次更改。有一次网站甚至更改了配色方案!所以您可以想象,回头编辑您的精灵图是一项多么艰巨的任务。现在,使用这种方法变得非常简单 :)
你不喜欢那样吗?
更喜欢这样?
:)
SVG 在任何像素密度下看起来都很不错。
确实如此,但这样您需要发出额外的 HTTP 请求来获取该文件。这不是世界末日,但需要考虑。您还需要在 SVG 图形本身中添加投影。根据您的使用情况,这可能不是坏事,但可能难以使投影与其他 CSS 生成的投影匹配。
我在最近的一个项目中使用了大量的 CSS 箭头,我喜欢可以更改这些箭头的颜色和方向,而无需创建一堆不同的资产文件。同样,都是一些小事,但我喜欢这些小细节。
SVG 不是单独下载,它是作为子元素绘制到 HTML 中的。因此,它成为 DOM 的一部分,并且可以使用 CSS 像页面中的任何其他元素一样进行样式设置。因此,您可以将颜色与其他 CSS 样式元素匹配。使用 Raphael 或 D3 等库,工作会更容易,并且可以为旧版浏览器提供备用方案。
我想这取决于您如何使用 SVG 资产。虽然 Raphael 非常适合这种事情,但为了一个或两个箭头而引入整个库可能有点过头了。不要误会我的意思,我喜欢使用 SVG。但在我看来,您需要使用相当多的 SVG 才能证明加载另一个 JS 库是合理的。我认为这就是为什么人们如此渴望尝试在 CSS 中实现这些效果的原因。
今天在 LinkedIn 的新闻资讯中看到这篇博文,我感到很惊讶。一如既往,很棒的帖子!
对于像单色三角形这样的小图像,使用 Base64 编码是否更有意义?我制作了一个简单的三角形 PNG,通过我的 PNG 优化器运行它,并将编码缩减到大约 200 个字符,这对我来说似乎非常合理。
虽然 Base64 编码是节省 HTTP 请求的一种好方法,但其他解决方案也与分辨率无关。
@Josh Johnson、@Jason、@Steve Schrab:还没有完全想通,但是兼具两者的优点怎么样?
将 SVG 嵌入到您的样式表中(因为它不是二进制的,所以也不需要进行 Base64 编码)。我知道 IE(至少是旧版本的 IE)只支持“图像”的 data URI 嵌入,所以不确定是否包括 SVG,但作为未来的想法……将 SVG 嵌入样式表中——听起来很酷!
与 PNG 相比,SVG 与分辨率无关,而且更容易维护(无需保留定期重新编码/重新嵌入的 PNG 文件,可以在样式表中直接维护 SVG!)。
与 Unicode 字符(在 CSS“content”属性中或作为实际 DOM 元素的文本内容)相比,SVG 形状完全灵活,不依赖于任何字体,并且所有浏览器都能可靠地解释。可靠性如何?好吧,大多数字体都没有实现所有 Unicode 字符,这意味着在大多数情况下,字体会回退到实现这些字符的系统默认字体。但是问题是不同的操作系统/浏览器具有不同的默认字体。并且不同的字体以略微不同的方式实现这些字符。
我在 JavaScript 滑块中的按钮上使用“⟨”(U+27E8)作为箭头时遇到了这种情况。我非常喜欢它的形状,并且它让我可以自由地设置文本颜色、大小等的动画。但是当我在大多数 Windows 系统上发现箭头看起来与我信任的 Mac 上有很大不同时,依赖它的高度和间距就成了问题。箭头更宽更短,在我的设计中完全无法使用,太糟糕了。暂时通过使用透明的 PNG 解决了问题(通过在 Photoshop 中键入字符导出)。顺便说一句,当我切换到 PNG 时获得的一个优势是能够轻松地垂直居中对齐它,而不管填充是什么(文本也可以使用 line-height 实现这一点,但不太灵活)。
与双框方法相比,使用嵌入式 SVG 背景图像可以使样式表更简洁易读,并且渲染成本可能更低,节省了一个“:after”(然后可以用于其他用途),并且不太脆弱,因为它不依赖于浏览器在这些“边缘”情况下的盒模型渲染方式(例如 border-radius“bug”(如果它真的是 bug)Safari 过去处理大于框本身的半径的方式与 Firefox 不同)。
我能想到的唯一缺点是与旧版浏览器的兼容性和变化的灵活性(例如,继承自 CSS 类并将其设置为不同的颜色并不容易,可能需要多次复制 SVG,而使用双框方法可以使用共享类并创建一个仅覆盖某些属性的补充类)。
尽管使用(嵌入式 SVG)背景也提供了一些有趣的功能。例如,使用 background-position(center center?)和 background-size(想象一下,对嵌入式 SVG 背景使用“background-size: cover”,并使其自动缩放以覆盖元素的整个大小)。
只是一些随机的(未经测试的)想法,
—— Krinkle
当然,通过使用背景,您无法使用 CSS 来设置实际 SVG 对象的样式/动画。但正如 DED 之前提到的,也可以将 SVG 嵌入到 HTML 中。无需任何类型的库。
[email protected] 我想指出,在我的闪亮的新 Android 平板电脑上,我看到了 4 个方块。字体中似乎没有箭头。这可能是将此与 @font-face 结合使用的论据(如果可能)。
这很棒,但我仍然希望 w3c 可以让这些东西更容易一些~
我已经使用了这种技术,这里有一个专业提示。要使三角形完美对齐,您必须重置字体大小并非常小心地选择字体。渲染效果在不同平台之间会有所不同。
嗨...
一如既往,您做得非常出色..
我从您的帖子中学到了很多东西...
非常感谢...
一切都很好,但是仅仅为了显示一个三角形而使用额外的标记是否很丑陋?我使用 :after-triangle 来显示一些活动状态。
必须说您继续提出一些非常有趣的想法,很可惜没有更简单的方法来做这些事情。毫无疑问,在某个时候会有的,但在那之前,我们只能将就一下。
我也使用边框和阴影制作了 CSS3 三角形,您可以查看我在forrst 上的帖子。
http://forrst.com/posts/CSS3_Triangle_Gradients-XGU
如果您不必支持旧版浏览器,则可以使用边框技巧创建三角形,并向其添加阴影。
您只需使边框的两个相邻边不透明,而不是一个,并将整个图形旋转
45deg
。然后,您可以向三角形添加适当的box-shadow
,如我在此示例中所示http://codepen.io/numbereleven/pen/pFcek