介绍
Shadcn 是 React 项目中复制粘贴 UI 组件的首选库。一个常用的组件是 Tooltip,它构建在 @radix-ui/react-tooltip 之上。
默认工具提示如下所示:
添加工具提示箭头
虽然提供的组件开箱即用,但我发现自己想要添加更多自定义功能,例如向工具提示添加箭头。为了获得灵感,我转向了 tremor.so 的 Tooltip 组件,它也是基于 @radix-ui/react-tooltip。
幸运的是,添加箭头很简单,因为 @radix-ui/react-tooltip 包含一个 Arrow 组件。您只需将其包含在内容组件中即可。
import * as TooltipPrimitives from '@radix-ui/react-tooltip' export default () => ( <tooltipprimitives.provider> <tooltipprimitives.root> <tooltipprimitives.trigger></tooltipprimitives.trigger> <tooltipprimitives.portal> <tooltipprimitives.content> <tooltipprimitives.arrow></tooltipprimitives.arrow> // Add the Arrow component here </tooltipprimitives.content> </tooltipprimitives.portal> </tooltipprimitives.root> </tooltipprimitives.provider> )
但是,如果您想在整个工具提示周围添加边框(包括箭头)怎么办?
添加工具提示边框
要实现此目的,您需要设置箭头组件的样式。让我们探索一些方法:
天真的方法
使用 Tailwind 类直接向箭头添加边框似乎是一个很好的起点:
<tooltipprimitives.arrow classname="border border-[var(--tooltip-border-color)] fill-[var(--tooltip-color)]" width="{12}" height="{7}" aria-hidden="true"></tooltipprimitives.arrow>
但是,这种方法并没有达到预期的效果。 border 属性适用于元素的矩形边界,而不是箭头形状本身。
使用描边属性
由于箭头是 SVG 元素,因此您可以使用描边属性来定义边框:
<tooltipprimitives.arrow classname="border-none fill-[var(--tooltip-color)]" stroke="var(--tooltip-border-color)" stroke-width="2" width="{12}" height="{7}" aria-hidden="true"></tooltipprimitives.arrow>
这样效果更好,但箭头的顶部边框仍然可见。为了解决这个问题,我们来探索另一种方法。
探索投影选项
另一种方法是使用投影来模拟边框:
<tooltipprimitives.arrow classname="-my-px border-none fill-[var(--tooltip-color)] drop-shadow-[0_1px_0_red]" width="{12}" height="{7}" aria-hidden="true"></tooltipprimitives.arrow>
这会创建一个带有箭头和边框的视觉上无缝的工具提示,但根据您的用例,它可能并不总是最精确的解决方案。
值得一提的是,该解决方案的灵感来自于 Origin UI 中的 Tooltip 组件,它提供了各种可定制的工具提示变体,可以节省开发时间。
如何设计更多样式,例如使用我自己的自定义 SVG?
自定义 SVG 箭头
我经常访问Vercel的网站,他们的下拉导航栏引起了我的注意,特别是箭头。
出于对它的设计方式的好奇,我打开了开发工具,检查了元素,并找到了 SVG 箭头。然后我将其复制并粘贴到 Figma 中仔细查看。
我认为这对于工具提示箭头来说可能是一个有趣的设计选择。
定位
SVG 箭头的定位取决于工具提示的位置 - 顶部、底部、左 或 右。内容组件公开了一个数据侧属性,您可以使用该属性动态调整定位:
import * as TooltipPrimitives from '@radix-ui/react-tooltip' export default () => ( <tooltipprimitives.provider> <tooltipprimitives.root> <tooltipprimitives.trigger></tooltipprimitives.trigger> <tooltipprimitives.portal> <tooltipprimitives.content> <tooltipprimitives.arrow></tooltipprimitives.arrow> // Add the Arrow component here </tooltipprimitives.content> </tooltipprimitives.portal> </tooltipprimitives.root> </tooltipprimitives.provider> )
接下来,我们可以用我们的自定义设计替换内置的工具提示箭头组件。应该可以完美运行吧?
嗯,还没有。看看这个:箭头卡在工具提示的中心,而不是位于触发器附近。
发生这种不良行为是因为我们只为每一侧定义了一个静态位置。相反,我们需要使用动态位置来解决这个问题。
动态位置
让我们再次使用内置的 Arrow 组件开始。如果您在模拟工具提示位置更改时检查开发工具中的箭头组件,您会注意到 SVG 元素被包裹在具有 left CSS 属性的跨度中。
该值根据工具提示的位置动态变化。我们可以捕获这个左侧 CSS 值并将其应用到我们的自定义箭头组件。
为了跟踪这个左值,我们需要使用 MutationObserver 来观察它。
<tooltipprimitives.arrow classname="border border-[var(--tooltip-border-color)] fill-[var(--tooltip-color)]" width="{12}" height="{7}" aria-hidden="true"></tooltipprimitives.arrow>
最终结果
现在按预期工作了??
P.S.如果您喜欢在左侧或右侧显示工具提示,您可能需要调整顶部位置。
结论
虽然这种方法有效,但我确信有一些 UI 库可以实现更简单、更灵活的工具提示样式。然而,找到解决方法是值得的。如果您有兴趣探索其他选项,您可能想查看此讨论。
以上是自定义 Shadcn 工具提示箭头的 Hacky 方法的详细内容。更多信息请关注PHP中文网其他相关文章!

在这篇文章中,布莱克·莫里(Blackle Mori)向您展示了一些骇客,同时试图推动同位HTML支持的极限。如果您敢于使用这些,以免您也被标记为CSS罪犯。

具有CSS的自定义光标很棒,但是我们可以将JavaScript提升到一个新的水平。使用JavaScript,我们可以在光标状态之间过渡,将动态文本放置在光标中,应用复杂的动画并应用过滤器。

互动CSS动画和元素相互启动的元素在2025年似乎更合理。虽然不需要在CSS中实施乒乓球,但CSS的灵活性和力量的增加,可以怀疑Lee&Aver Lee&Aver Lee有一天将是一场

有关利用CSS背景滤波器属性来样式用户界面的提示和技巧。您将学习如何在多个元素之间进行背景过滤器,并将它们与其他CSS图形效果集成在一起以创建精心设计的设计。

好吧,事实证明,SVG的内置动画功能从未按计划进行弃用。当然,CSS和JavaScript具有承载负载的能力,但是很高兴知道Smil并没有像以前那样死在水中

是的,让#039;跳上文字包装:Safari Technology Preview In Pretty Landing!但是请注意,它与在铬浏览器中的工作方式不同。

此CSS-tricks更新了,重点介绍了年鉴,最近的播客出现,新的CSS计数器指南以及增加了几位新作者,这些新作者贡献了有价值的内容。

在大多数情况下,人们展示了@Apply的@Apply功能,其中包括Tailwind的单个property实用程序之一(会改变单个CSS声明)。当以这种方式展示时,@Apply听起来似乎很有希望。如此明显


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

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

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

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

Atom编辑器mac版下载
最流行的的开源编辑器

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)