在圆形(或任何曲线)上设置网页文本没有非常简单且标准化的方式。但它可以做到!我们将在本文中探讨一种方法。但请注意,我们将使用一些 CSS3 和 JavaScript,并且不会理会不支持某些必需技术的旧版浏览器。如果您对实际项目感兴趣,此类内容可能仍然最适合使用带有适当alt
文本的图像,或进行适当的功能检测,以便在能够处理此花哨技术的浏览器中使用图像替换此技巧。
一个示例

让我们从一些更简单的东西开始。
整个过程
让我们以一个简单的短语为例

想象一下,如果我们将尝试在圆圈中设置的单词分解成单个字母。

让我们使用等宽字体确保每个框的大小完全相同。

现在,让我们将每个框拉长,就像自行车轮的辐条。

然后,我们将所有这些辐条捆绑在一起,使它们都位于彼此的顶部。

现在想象一下,我们将这些辐条的末端固定到一个中央轮毂上。我们旋转每个辐条,使其比上一个辐条多旋转一点。

如果我们逆时针旋转父元素并移除红色指南,我们就在圆圈上得到了一些文本!

技术细节
为了能够像那样操作每个字母,您必须将它们包装在另一个元素中。Lettering.js 可以轻松地为您做到这一点(jQuery 和插件依赖项)。
所以你有这个。
<h1>Established 2012</h1>
您加载 jQuery 和 Lettering.js,然后调用此代码
$("h1").lettering();
它在 DOM 中变成了这样
<h1>
<span class="char1">E</span>
<span class="char2">s</span>
<span class="char3">t</span>
<span class="char4">a</span>
<span class="char5">b</span>
<!-- you get the idea -->
</h1>
这实际上只适用于等宽字体。即使您通过将每个 span 设置为固定宽度来强制使用等宽,每个字母之间的间距也会不正确,并且看起来很奇怪。如果您很疯狂,可以通过手动调整每个旋转来手动调整字距。
对于每个 span,您都需要设置高度,将它们全部放置在同一个位置,然后将 transform-origin 设置到框的底部(以便它们围绕该中心旋转。添加供应商前缀)。
h1 span {
font: 26px Monaco, MonoSpace;
height: 200px;
position: absolute;
width: 20px;
left: 0;
top: 0;
transform-origin: bottom center;
}
现在您需要一大堆类名选择器,每个选择器都稍微旋转一点。
.char1 { transform: rotate(6deg); }
.char2 { transform: rotate(12deg); }
.char3 { transform: rotate(18deg); }
/* and so on */
查看 CSS-Tricks 的 CodePen 在圆圈上设置文本 – 2012 (@css-tricks) 在 CodePen 上。
但是,这可能会变得乏味且杂乱。使用 Sass 和 Compass,它只需要三行代码
@for $i from 1 through 100
.char#{$i}
+transform(rotate(($i*6)+deg))
更新
这是一个来自 Chris Eppstein 的 Sass (.sass) 混合宏,用于更可扩展的文本旋转混合宏
=rotated-text($num-letters: 100, $angle-span: 180deg, $angle-offset: 0deg)
$angle-per-char: $angle-span / $num-letters;
@for $i from 1 through $num-letters
.char#{$i}
+transform(rotate($angle-offset + $angle-per-char * $i))
这是一个非常巧妙的技巧。
圆形徽标现在在互联网上变得非常流行。这应该会让它变得更好!
如果有一个 JavaScript 插件也能做到这一点就好了;您只需设置高度(半径),它就会为您完成。
是的,一个 JavaScript 插件会很棒。 :)
不过,这篇文章非常有用。谢谢!
所以如果我的脑袋理解正确,那么我的示例仍然是歪斜的,因为使用了 Helvetica?
变换原点有所帮助,但文本看起来仍然很糟糕。
http://codepen.io/grayghostvisuals/pen/volume-knobs/34
很棒的示例,Grey Ghost!您可能已经知道这一点,但我认为数字在刻度盘上看起来有点歪斜的部分原因是您使用了标签,并且默认情况下它们的字体样式为“斜体”。
如果您添加
i {font-style: normal;}
到您的 CSS 中,它会得到改善(我认为)。可能仍然不完美,但它会欺骗大多数人的眼睛……
是的,斜体字体会使它看起来很奇怪,但它仍然是一个好主意。
这里还有另一个提示供您参考
悬停时,您旋转旋钮,看起来很棒,但阴影也会旋转。这使得整个旋钮围绕错误的重点摇摆。您可以通过在旋钮后面创建一个单独的伪元素来投射阴影,并且不旋转该元素来避免这种情况。我认为这可以通过仅使用伪元素来实现,但我已经将它们用于外环。
非常酷的技术 :)
可能也值得考虑一下 SVG 沿路径的文本。请参阅我的 围绕圆形路径的文本演示(奖励令人作呕的 CSS 动画)。
@david,
很棒的示例!这确实是 SVG 的绝佳用途。我想我会将其复制到我自己的 CodePen 中以供将来参考 :)
哇,太棒了。
我想那样做,怎么做?
测试技术的极限总是一件好事,但我认为这并不适合生产网站。而且永远不会。
将每个字母都放在一个 span 中,这对可访问性有什么作用?可能会使文本难以阅读。SEO?一文不值。
SVG 是这项工作的工具。是的,Google 现在确实会索引 SVG。
很棒的工作!
@Billy:我之前做了一个名为 Arctext.js 的 jQuery 插件,它的工作原理类似,并且文本也可以进行动画处理。
非常类似于此,但您无需键入任何 CSS
但能够从头开始生成代码和酷炫效果是一种很好的实践,不是吗?
嘿,Dan。这是一个很棒的建议。我正在寻找类似的东西。我甚至可以从代码中创建链接。非常感谢您分享它
SVG!
太棒了,正是我一直在搜索的。谢谢兄弟;)
这是我尝试使用可变宽度字体的结果
http://codepen.io/carlbennettnz/pen/1/2
不过,我同意你们其他人,SVG 将是完成此任务的更好方法。
嘿,
Chris,我喜欢这个…!
很棒的技术,只是字体渲染有点像素化,太严重了,以至于不值得在实际应用中使用它,反而不如使用图片。
<语法纳粹模式>
不关心不支持的旧浏览器
-> 浏览器**不支持**……
</语法纳粹模式>
不过文章不错。
你好!
我在 CodePen 上说过,这种技巧非常巧妙。可惜没有像 SASS 这样的工具,实现起来很麻烦。循环(尤其是 For 循环)真的有必要在 CSS 标准中实现。
无论如何,感谢分享,很棒的演示!
它们确实有点像。你可以在 nth-child(n) 的情况下使用计数器,最终得到类似循环的效果。
非常酷的技术。我使用 em 稍微重构了一下,递归绘制螺旋,从而使 CSS 和 HTML 文件大大缩小。我喜欢 Sass 循环,但它们可能会输出大量代码。
http://codepen.io/scottkellum/pen/101/
另一篇非常棒的文章。我会尝试一下。谢谢。
为什么这如此令人惊叹?
SCSS、Compass 和 CSS3 的组合简直太棒了。很棒的东西,Chris。
这太漂亮了。正如上面一位读者所说——这对 SEO 不太友好,当然,你也可以始终使用图形来代替。尽管如此,我仍然印象深刻。这是一个多么美丽而优雅的 CSS 应用。
这太棒了。
但是我们可以使用单个 CSS 类来旋转每个字符。不需要为每个字符创建每个 CSS 类。
在这里尝试一下乐趣
http://jsfiddle.net/3EUfs/
不错!我想我将来会用上它! :)
如果你只关心现代浏览器,那么 SVG 会更好地满足需求。以下是我如何在我的贴纸中使用它:http://lea.verou.me/sticker.svg
这真是一个很酷的技巧。
这真的很酷,但是正如 Gilbert 在上面所说,这对 SEO 方面有什么影响?
我想你会把它用作徽标,通常徽标是带有替代文本的图像,所以我想这不会对你的 SEO 造成太大影响,如果有的话?
现在这篇文章有很多评论,归根结底都集中在以下两种观点之一
a. “这太酷了”、“我会用它”
b. “SVG 更适合这项任务”。
由于仍然有很多来自 (a) 群体(那些不阅读先前评论就发表评论的读者?)的评论,是否可以请求更新一下引言段落,提及 SVG 的优越性,而不仅仅是使用 alt-text 的图像?
重申一下,为什么 SVG 更好?
1. SEO
2. 可访问性
3. 简单性,使更新、重用或调整文本变得更容易
4. 强大:你可以向文本添加更多图形效果。
我希望这能起作用
然后将计数器设置为按所需的度数增量,使其正常工作。
对 LESS CSS 比较陌生,所以请原谅我的无知,但你能像你在 Sass 中指定的那样创建一个类似的变量方程吗?
我应该澄清一下,我只是想知道这是否可能。不是请求别人实际编写它。
LESS 通常不以这种方式执行循环。可能有一些奇特的方法可以使用递归 mixin 来实现,但这看起来有点复杂(我的观点)。
使用 Sass 很酷,但编写纯 CSS 只是浪费。
不错,在 SCSS 中尝试了一下
太棒了太棒了,螺旋文本让我的一天都变得美好!!;)
我相信谷歌会为此而喜欢你:3
-Miles
这很酷,但不实用。用 Illustrator 或 Photoshop 制作这个徽标所花费的时间比使用代码来实现它要少。
超级酷!感谢分享。我希望其他评论者不要成为喷子,而是欣赏这个 CSS 的本来面目。我们这里都是知识渊博的开发者,我们可以确定这个技巧的正确应用场景。
哇!有趣且完美的例子,干得好。
顺便说一句,我想我们可以使用一些过渡来实现很酷的效果。
当然,使用一些 css-trig,伙计们。
很棒的技巧,惊人的效果。文本在圆圈中看起来很棒。
就像一些人所说的,使用 svg 会更容易且更一致。如果你使用 raphael js,你甚至可以使其在 ie6 上工作。
这有点跑题了:但是 CodePen 用于语法高亮的配色方案叫什么名字?它真的很棒。 :)
在螺旋上设置文本就像坐过山车一样
试图掌握 mixin……我有一个旋转文本示例的 .SCSS 变体,我不确定如何使其“执行”。现在,它没有为 .char# 添加任何 CSS。
我尝试的任何操作都会导致 CodeKit 中出现错误。这是我拥有的内容
我还需要“做”什么才能实现这一点?
不错的技巧。但这只能弯曲一个句子。是否可以弯曲一系列组成多个句子的 div?例如,毛茸茸的鳄鱼 (0 度);蓝猫 (30 度);棕狐狸 (60 度);紫色蜥蜴 (90 度);白色无牙狮子 (120 度);绿色澳洲野犬 (150 度)……