html - 如何在没有 javascript 和跨浏览器一致性的情况下渐变填充由约束 textLength 值缩小的 svg 文本?
问题描述
我在我的网站上想要的是一行渐变填充文本。我希望能够修改文本、添加和删除字符,而不用担心它如何适合或对齐单行。即使某人的设备无法加载我设计文本所用的字体,文本的整体宽度也不应该改变,文档承诺我可以这样做textLength
:
通过使用 textLength,您可以确保您的 SVG 文本以相同的宽度显示,而不管包括 Web 字体无法加载(或尚未加载)在内的情况。
我没有向您展示我的整个网站,而是拼凑了一个玩具网站 来说明我正在努力实现的目标。这是它在桌面 chrome 中正确呈现的屏幕截图。
下面是代码:
<html>
<head>
<style>
svg{
width:800px;
height:960px;
background-color:#cccccc;
}
</style>
</head>
<body>
<svg viewBox="0 0 100 120">
<linearGradient
id="grad"
x1="0" x2="0" y1="0" y2="100%"
gradientUnits="objectBoundingBox"
>
<stop stop-color="cyan" offset="15%"/>
<stop stop-color="blue" offset="40%"/>
<stop stop-color="magenta" offset="65%"/>
<stop stop-color="red" offset="80%"/>
</linearGradient>
<text
textLength="100"
lengthAdjust="spacingAndGlyphs"
font-size="20"
x="0"
y="20"
fill="url(#grad)"
>
This line will shrink if "textLength" is set to a small enough value
</text>
</svg>
</body>
</html>
在我<text>
使用的标签textLength="100"
中,视图框也设置为宽度 100: viewBox="0 0 100 120"
,这就是为什么即使我在那里塞满了许多字符,所有东西都整齐地放在一行上。
但是,当我在 iPhone 上访问玩具网站时,一切都失败了,正如您在此屏幕截图中看到的那样。
Chrome、safari、firefox——没关系,它们都失败了,看起来都一样。曾经大约 80 个字符的文本,现在似乎被缩减为 13 个字符。奇怪的是,剪裁似乎发生在 SVG 视图框的中间,而可见字母似乎正在正确地压缩/压缩,就好像 textLength 属性正在做它的工作一样。
我做了一些相当广泛的测试,最后把另一个不太玩具的网站放在一起,比较了textLength
和fill
属性的各种组合,得出的结论是,唯一一次搞砸的时候是使用渐变填充和 textLength结合起来,由于浏览器特定的错误呈现而没有记录解释。
无论如何,我可以更改上面的代码以使我的玩具网站正确呈现,还是我必须求助于 JavaScript 并等待其他浏览器上场?
解决方案
推荐阅读
- python - 如何将标准输出动态保存到变量、列表或 numpy 数组中?
- c++ - 如何在内核 C++ 中使用 1920x1080x16M 图形或具有 16M 颜色的类似图形?(VGA)
- apache-storm - Apache Storm:WindowedBoltExecutor 如何处理 FailedException?
- xamarin - VS Community 2019:内存无法读取
- powershell - Intune 使用 Graph API 恢复特定配置
- flutter - 我如何在颤振中自定义 flappy_search_bar
- next.js - 如何在 NextJS 中动态创建子页面/子路由?
- java - 一对一关系的方法 POST
- docker - 错误:- 来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:349:启动容器进程导致“
- xamarin - 使用 Xamarin 表单进行剃须刀支付