有没有办法使用CSS3 / Canvas曲线/弧形文本

时间:2010-05-15 16:29:59

标签: javascript html css canvas css3

我正在尝试使用CSS3,HTML Canvas甚至SVG制作曲线文本效果(例如,见下图)?这可能吗?如果是这样,我怎么能达到这个效果?

更新:澄清一下:以这种方式设置样式的文字将是动态的。

Arched or Curved Text Example

12 个答案:

答案 0 :(得分:33)

SVG直接支持文本路径,但不会沿路径“弯曲”各个字形。以下是an example如何创建它:

...
<defs>
  <path id="textPath" d="M10 50 C10 0 90 0 90 50"/>
</defs>
<text fill="red">
  <textPath xlink:href="#textPath">Text on a Path</textPath>
</text>
...

答案 1 :(得分:21)

你当然可以用canvas做到,试试这段代码作为例子:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Testing min-width and max-width</title>
    <style type="text/css">

    </style>

  </head>
  <body>
      <canvas id="cnv"></canvas>
      <script type="text/javascript" charset="utf-8">
          cnv = document.getElementById("cnv");
          cnv.width = 500;
          cnv.height = 300;
          ctx = cnv.getContext("2d");
          ctx.font = "bold 12px sans-serif";
          text = "abcdefghijklm"
          for (i = 0; i < text.length; i++) {
              ctx.fillText(text[i], 300, 100);
              ctx.rotate(0.1);
          }
      </script>
  </body>
</html>

它做得并不完全正确,但我确定你会设法将它调整为你的比喻;)

答案 2 :(得分:13)

或者你可以使用一些CSS来做,但我相信你不会很快就能在IE上运行它。另一方面,很酷的是文本是可选择的:D

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Testing min-width and max-width</title>
    <style type="text/css">
        .num1 {
            -webkit-transform: translate(0px, 30px) rotate(-35deg); 
        }
        .num2 {
            -webkit-transform: translate(0px, 25px) rotate(-25deg); 
        }
        .num3 {
            -webkit-transform: translate(0px, 23px) rotate(0deg); 
        }
        .num4 {
            -webkit-transform: translate(0px, 25px) rotate(25deg); 
        }
        .num5 {
            -webkit-transform: translate(0px, 30px) rotate(35deg); 
        }

       span {display: inline-block; margin: 1px;}
    </style>

  </head>
  <body>
    <div style="width: 300px; height: 300px; margin: 50px auto">
      <span class="num1">a</span><span class="num2">b</span><span class="num3">c</span><span class="num4">d</span><span class="num5">e</span>
    </div>
</body>
</html>

答案 3 :(得分:8)

这不是纯粹的CSS解决方案,但CircleType.js适用于弧形文本。

http://circletype.labwire.ca/

答案 4 :(得分:3)

有一个jQuery插件可以使用名为arctext.js的CSS3来修改文本。它非常好,有一系列配置选项。我猜它在IE8上不起作用,但我猜大多数CSS3都不行!

还有一个演示页面,其中包含一些实例here

答案 5 :(得分:2)

<embed width="100" height="100" type="image/svg+xml" src="path.svg">
  <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <defs>
      <path id="textPath" d="M10 50 C10 0 90 0 90 50"/>
    </defs>
  </svg>
</embed>

答案 6 :(得分:1)

你可以尝试这个jQuery插件http://codecanyon.net/item/jquery-text-arch/3669779
它有很多自定义文本拱门和文本圈的选项 适用于所有主流浏览器和操作系统

答案 7 :(得分:0)

我能够运行示例 http://apike.ca/prog_svg_text.html进入Chrome,但在IE中无效。

您可以使用SVGWeb,http://code.google.com/p/svgweb/

或者,您可以在服务器站点(在.NET / PHP中)编写自己的图像生成实用程序,如Http Handler,并将文本传递给它,它将通过使用图形库和动态渲染图像返回GIF / PNG对你而言。

答案 8 :(得分:0)

我意识到这已经晚了一年,但这是我的解决方案

JS Fiddle snippet

它包装文本但我无法弄清楚如何沿着底部垂直翻转字母,因为我真的非常讨厌画布转换而我无法绕过如何对文本进行两次旋转(沿y轴翻转一次,再绕假想圆的中心翻转。)

答案 9 :(得分:0)

这个tutorial向您展示了如何使用HTML5和canvas进行操作。上面的其他回复之一有类似的想法,使用canvas.rotate方法。这个也使用canvas.translate。

答案 10 :(得分:0)

我使用上面提到的教程(Simon Tewsi)编写了一个关于字距调整问题的更好的解决方案。不使用库,纯JS。

http://jsfiddle.net/fidnut/cjccg74f/

上查看
function drawTextAlongArcInside(ctx, str, font, color, radius, angle, centerX, centerY, wspace)

注意:SO要求我把JSFiddle的所有代码放在这里。我不认为这是明智的,代码太多,所以我只添加了函数的名称。

答案 11 :(得分:0)

你可以像这样使用SVG和TextPath:

&#13;
&#13;
<html>
<head>
<script>
 function updateMessage(str) {
document.getElementById("MyMessage").textContent = str;
 }
</script>
</head>
<body >
<button onClick="updateMessage('The text has changed');">Change the text</button>
  <svg viewBox="0 0 1000 300" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <defs>
    <path id="CurvedPath"
          d="M 0 150 Q 325 50 650 150 " />
  </defs>
<text font-size="54" x='325' y='50'  text-anchor="middle"  fill="darkgreen" font-family=Arial,Helvetica  style="text-shadow: 2px 2px 3px gray;"
>       <textPath id='MyMessage' xlink:href="#CurvedPath" >
THIS TEXT IS CURVED
    </textPath>
  </text>
</svg>
</body>

</html>
&#13;
&#13;
&#13;