在 svg 或画布中将文本环绕成圆形 [英] Wrap text to a circle shape in svg or canvas
本文介绍了在 svg 或画布中将文本环绕成圆形的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
将文本拟合到网站上的圆形,使其随圆形的曲线而不是矩形边界框流动,有什么好的解决方案?
这是我想要实现的目标:页面上有许多黑色圆圈(固定大小),每个圆圈旁边都有一个文本区域.当文本输入到 textarea 时,它会出现在黑色圆圈中,它以两个轴为中心.如果输入的文本太多,该行变得比圆的半径长,减去指定的边距值,该行将像您期望的常规换行一样中断,文本块仍居中.当然,靠近顶部或底部的线条会比靠近中间的线条短.
文本将具有固定大小,当圆圈被文本填充时,不应显示额外的内容(如溢出隐藏).
带有文字的黑色圆圈实际上是气泡,旨在打印并粘在海报上.
是否有任何出色的 SVG/Canvas 库支持这一点,还是我必须从头开始设计我们的方法?
解决方案
有一个提议的 CSS 功能称为排除",可以在定义的区域内流动文本:
<html lang="zh-cn"><头><风格>身体{背景颜色:象牙色;填充:20px;}画布{边框:1px纯红色;}</风格><script src="http://code.jquery.com/jquery-1.9.1.js"></script><脚本>$(函数(){var canvas=document.getElementById("canvas");var ctx=canvas.getContext("2d");var text = "'那是圣诞节的前一天晚上,整个房子里,没有一个生物在动,甚至没有一只老鼠.圣诞节那天的故事就这样开始了";var font="12pt verdana";var textHeight=15;var lineHeight=textHeight+5;var 行=[];var cx=150;变量 cy=150;无功r=100;initLines();wrapText();ctx.beginPath();ctx.arc(cx,cy,r,0,Math.PI*2,false);ctx.closePath();ctx.strokeStyle="天蓝色";ctx.lineWidth=2;ctx.stroke();//预先计算圆的每个水平弦的宽度//这是文本允许的最大宽度函数 initLines(){for(var y=r*.90; y>-r; y-=lineHeight){var h=Math.abs(r-y);if(y-lineHeight<0){ h+=20;}var length=2*Math.sqrt(h*(2*r-h));if(长度&&长度>10){线.推({ y:y,maxLength:长度});}}}//在圆的每一行上绘制文本函数 wrapText(){变量 i=0;var words=text.split(" ");while(i0){线=线[i++];var lineData=calcAllowableWords(line.maxLength,words);ctx.fillText(lineData.text, cx-lineData.width/2, cy-line.y+textHeight);word.splice(0,lineData.count);};}//计算一行中可以容纳多少个单词函数 calcAllowableWords(maxWidth,words){var wordCount=0;var testLine="";无功间隔=";var fitWidth=0;var fitText="";ctx.font=字体;for(var i=0;i最大宽度){返回({计数:我,宽度:拟合宽度,文本:拟合文本});}适合宽度=宽度;安装文本=测试线;}}});//结束 $(function(){});头部><身体><p>文本包裹并夹在圆圈内</p><canvas id="canvas" width=300 height=300></canvas>