使用CSS创建圆形文本段落

24

我一直在寻找一个快速而合适的解决方案,将段落文本放置在圆形内。我发现有两种解决方案。

解决方案1

将多个相同高度的div浮动到文本左右两侧,并通过更改div的width来调整留给文本的空间。

解决方案2

使用相同功能的生成器,http://www.csstextwrap.com/index.php

BONUS(不是问题的一部分,只是一个提示)

我不是在寻找这个,但也许有人需要,我认为将其作为一个链接很好 > http://csswarp.eleqtriq.com/ 这是一个基于Web的生成器,可帮助您将文本围绕圆形包装。

问题是什么?

除了添加浮动div和其他标记之外,是否有更简单的解决方案可将段落文本放入圆形中。使用包含该文本的图像也不是解决方案。最理想的情况下,解决方案将具有干净的HTML标记,并在CSS中进行少量调整。


2
像这样吗?http://jsfiddle.net/Kyle_Sevenoaks/Q9k6v/ - Kyle
@KyleSevenoaks,我回答了您的问题并提到了您的范例代码,谢谢! - Marc Audet
2
@KyleSevenoaks 哈哈,这不是我要的 Kyle。我喜欢这个大圆圈和一切,但它跟我要的完全不一样。无论如何,感谢你的回复。 - Nemanja
我认为这是一个很棒的答案。我来到这里是为了寻找Kyle提供的解决方案。我认为问题有些误导,所以感谢Kyle提供的答案。 - MichaelMcCabe
1
你有看过 CSS 区域吗? - user663031
显示剩余2条评论
5个回答

23

Eric Meyer的书"Eric Meyer on CSS"谈到了这个问题(项目10),而你找到的文本换行解决方案使用了相同的原则。

简单地使用border-radius:50%不会影响内容框的形状,它们目前仍然是矩形的。例如,可以查看Kyle Sevenoaks的演示

有一个CSS3模块正在开发中,可以解决这个问题:

http://dev.w3.org/csswg/css-shapes

然而,该规范仍处于草案阶段,目前还没有得到支持,可能需要一两年的时间。

简短的回答是否定的,但希望评论能提供一些见解。


是啊,我也意识到了。我尽力避免额外的标记,但似乎做不到。您已经证实了我的疑虑。谢谢您和所有回复的人。 - Nemanja
1
2015年即将结束,CSS Shapes仍然没有得到广泛支持。我认为,如果现在有人真的需要将文本包裹在一个圆形内,他们最好的选择是SVG + D3plus或者Canvas/SVG + vanilla JS - thdoan

2

你好,我认为如果不使用JavaScript,这是不可能实现的,因此请使用JavaScript和CSS3。

.badge {
  position: relative;
  width: 400px;
  border-radius: 50%;
  -webkit-transform: rotate(-50deg);
  -moz-transform: rotate(-50deg);
  -ms-transform: rotate(-50deg);
  -o-transform: rotate(-50deg);
  transform: rotate(-50deg);
}

h1 span {
  font: 26px Monaco, MonoSpace;
  height: 200px;
  position: absolute;
  width: 20px;
  left: 0;
  top: 0;
  -webkit-transform-origin: bottom center;
  -moz-transform-origin: bottom center;
  -ms-transform-origin: bottom center;
  -o-transform-origin: bottom center;
  transform-origin: bottom center;
}

.char1 {
  -webkit-transform: rotate(6deg);
  -moz-transform: rotate(6deg);
  -ms-transform: rotate(6deg);
  -o-transform: rotate(6deg);
  transform: rotate(6deg);
}

.char2 {
  -webkit-transform: rotate(12deg);
  -moz-transform: rotate(12deg);
  -ms-transform: rotate(12deg);
  -o-transform: rotate(12deg);
  transform: rotate(12deg);
}



<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script src="http://css-tricks.com/examples/BlurredText/js/jquery.lettering.js"></script>
<script>
    $(function() {
        $("h1").lettering();
    });
</script>

</head>

<body>

    <div id="page-wrap">

        <div class="badge">
          <h1>Established 2012</h1>
        </div>

    </div>

</body>

</html>

我曾希望可以不用JS实现,但似乎没有圆形内部支持的情况下这是不可能的。 - Joe Corby

1
<!DOCTYPE HTML>
<html>
  <head>
    <style>
      body {
        margin: 0px;
        padding: 0px;
      }
    </style>
  </head>
  <body>
    <canvas id="myCanvas" width="578" height="250"></canvas>
    <script>
      function drawTextAlongArc(context, str, centerX, centerY, radius, angle) {
        var len = str.length, s;
        context.save();
        context.translate(centerX, centerY);
        context.rotate(-1 * angle / 2);
        context.rotate(-1 * (angle / len) / 2);
        for(var n = 0; n < len; n++) {
          context.rotate(angle / len);
          context.save();
          context.translate(0, -1 * radius);
          s = str[n];
          context.fillText(s, 0, 0);
          context.restore();
        }
        context.restore();
      }
      var canvas = document.getElementById('myCanvas'), 
        context = canvas.getContext('2d'),
        centerX = canvas.width / 2,
        centerY = canvas.height - 30,
        angle = Math.PI * 0.8,
        radius = 150;

      context.font = '30pt Calibri';
      context.textAlign = 'center';
      context.fillStyle = 'blue';
      context.strokeStyle = 'blue';
      context.lineWidth = 4;
      drawTextAlongArc(context, 'Text along arc path', centerX, centerY, radius, angle);

      // draw circle underneath text
      context.arc(centerX, centerY, radius - 10, 0, 2 * Math.PI, false);
      context.stroke();
    </script>
  </body>
</html>

点击这里查看另一种解决方案(jsfiddle)。


5
您会考虑增加一些叙述性内容来说明这段代码为什么有效,以及它是如何回答这个问题的吗?这对于提问者和其他任何人都将非常有帮助。 - Andrew Barber
1
沿圆弧绘制文本与将文本包装在圆形内部不是同一件事。 - thdoan

1
一个原始的(?)...封面!
    function writeInCircle(phrase, cx, cy, fontSize) {
        var num = phrase.length
        var r = num * fontSize / 6
        var d = $("<div>").addClass("writeInCircle").appendTo("body")
        $(d).css({position:"absolute",
                   width: (2*r) + "px",
                  height: (2*r) + "px",
                  left: (cx-r) + "px",
                  top:  (cy-r) + "px"})
        for (var i=0; i < num; i++) {
           var s = $("<span>").html( phrase.charAt(i)).appendTo(d)
           a = i/num *2*Math.PI
           var x = cx   + r*Math.cos(a) 
           var y = cy  + r*Math.sin(a)
           $(s).css({"position":"absolute",
                 left: x + "px", top: y + "px",
                 "fontSize": fontSize, "transform":"rotate(" + a + "rad)" })
           console.log(z.charAt(i) + " " + x + "," + y)
        }
    }   

请查看以下链接:http://jsfiddle.net/alemarch/42o8hqb7/ http://jsfiddle.net/alemarch/42o8hqb7/1/ http://jsfiddle.net/alemarch/42o8hqb7/2/ http://jsfiddle.net/alemarch/42o8hqb7/3/


说得好,花哨的圆形文本看起来很不错,但它并不是通常定位的文本,而是包裹在一个圆圈内。如果我表达不清楚,对不起。 - Joe Corby

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接