jym好!我是珑墨
在本文中,我将分享从HTML文本元素生成圆形文本的CSS和JS代码。此技术为每个字母创建一个 span 元素并稍微旋转它。
你可以通过调整字体大小和圆半径来生成圆形文本。
圆形文本代码
- 代码演示:
- 码上掘金: code.juejin.cn/pen/7242159…
让我们分解一下使用一点JS和CSS创建弯曲文本或圆形文本的步骤。
圆形文本 HTML 代码
<div>
<fieldset>
<label>Text:</label>
<input type="text" class="text" value="CURVED TEXT">
<label>Radius:</label>
<input class="radius" type="range" min="100" max="1000" value="500">
</fieldset>
</div>
<div class="curved-text">CURVED TEXT</div>
<br/>
<footer>
Check out MockoFun Online: <a href="https://www.mockofun.com/tutorials/curved-text-generator/">Curved Text Generator</a>
</footer>
HTML代码非常简单。该元素实际上是唯一重要的元素,因为这是我们编写圆形文本的地方。div.curved-text
另一个元素仅包含曲线文本的配置选项:
div
- 用于输入弯曲文本内容的输入文本
- 用于调整圆圈文本半径的半径滑块
圆形文本 CSS 代码
:root{
background:black;
color:white;
font-family:monospace;
overflow:hidden;
}
footer{
text-align:center;
position:absolute;
bottom:0;
padding:10px;
}
a{
font-weight:bold;
color:orange;
}
.curved-text{
position:relative;
display:inline-block;
margin:0 auto;
font-size:100px;
}
.curved-text span{
min-width:0.5em;
text-align:center;
padding:0;
margin:0;
}
为了创建圆形文本效果,我们只使用两个 CSS 类:
.curved-text:用于弯曲圆文本将驻留的包装器元素的 CSS 类.curved-text span:用于构成圆形文本的每个字母的 CSS 类
圆形文本 js 代码
import jquery from "https://cdn.skypack.dev/jquery@~3.5.1";
let $= jquery
function updateCurvedText($curvedText, radius) {
$curvedText.css("min-width", "initial");
$curvedText.css("min-height", "initial");
let w = $curvedText.width(),
h = $curvedText.height();
$curvedText.css("min-width", w + "px");
$curvedText.css("min-height", h + "px");
let text = $curvedText.text();
let html = "";
Array.from(text).forEach(function (letter) {
html += `<span>${letter}</span>`;
});
$curvedText.html(html);
let $letters = $curvedText.find("span");
$letters.css({
position: "absolute",
height:`${radius}px`,
// backgroundColor:"orange",
transformOrigin:"bottom center"
});
let circleLength = 2 * Math.PI * radius;
let angleRad = w/(2*radius);
let angle = 2 * angleRad * 180/Math.PI/text.length;
$letters.each(function(idx,el){
$(el).css({
transform:`translate(${w/2}px,0px) rotate(${idx * angle - text.length*angle/2}deg)`
})
});
}
let $curvedText = $(".curved-text");
updateCurvedText($curvedText,500);
function settingsChanged(){
$curvedText.text($(".text").val());
updateCurvedText($curvedText,$(".radius").val());
}
$(".radius").on("input change",settingsChanged);
$(".text").on("input change",settingsChanged);
js 是圆圈文本的实际魔力发生的地方。
首先,我们导入 jQuery 库。您可能可以在不使用jQuery的情况下逃脱,但是在这种情况下,我只是发现操作圆形文本设置的HTML元素很方便。
该函数接受两个参数:updateCurvedText()
$curvedText,它是对弯曲文本包装器元素的引用radius:曲线/圆形文本的半径
让我们看看这个函数是如何工作的,以及它是如何创建我们的圆形文本的:
$curvedText.css("min-height", "initial");
var w = $curvedText.width(),
h = $curvedText.height();
$curvedText.css("min-width", w + "px");
$curvedText.css("min-height", h + "px");
var text = $curvedText.text();
首先,我们重置包装器的 and 属性。这将使我们能够以正常的直线形式实际测量文本的尺寸。min-width``min-height
我们这样做是因为当我们弯曲文本时,我们最终会得到一个我们不想小于原始文本的元素。否则,元素在调整其半径时会跳到处都是。
我们存储宽度(),高度()以及供以后使用。w``h``text
var html = "";
Array.from(text).forEach(function (letter) {
html += `<span>${letter}</span>`;
});
$curvedText.html(html);
接下来,我们需要将要弯曲的文本的每个字母包装成元素。我们只需浏览文本的每个字符并在其周围添加一个元素。然后,我们将包装器的内容替换为新的 HTML 代码。span``span
请注意,这些元素将使用我们之前定义的 CSS 代码。span
再走几步,我们就完成了!
var $letters = $curvedText.find("span");
$letters.css({
position: "absolute",
height:`${radius}px`,
transformOrigin:"bottom center"
});
想象一下,弯曲文本的每个字母都变成了一个矩形元素,其高度设置为所需圆形文本的半径值。我们还需要将 设置为 矩形的底部中心,因为我们希望将每个字母旋转一定角度以将字母分布在圆圈上。transformOrigin
上图只是为了让您了解元素是如何转换的。我们添加 CSS 样式,因为我们希望所有字母最初重叠。我们想要这个,因为我们想围绕相同的原点旋转这些矩形。position:absolute
现在,最后一步 — 在圆圈中写入文本的实际旋转:
var circleLength = 2 * Math.PI * radius;
var angleRad = w/(2*radius);
var angle = 2 * angleRad * 180/Math.PI/text.length;
6
$letters.each(function(idx,el){
$(el).css({
transform:`translate(${w/2}px,0px) rotate(${idx * angle - text.length*angle/2}deg)`
})
});
让我解释一下代码:
该变量实际上并未使用。这只是提醒如何计算圆的长度。circleLength
这有助于我们在拥有切片边缘的长度时确定圆形切片的角度。我们简单地将这个长度除以整个圆半径的两倍。
在我们的例子中,圆形切片的长度是原始文本的宽度。这里的想法是,无论您如何弯曲文本,字母的组合宽度将始终相同。使用提到的公式可以给我们一个弧度角度。CSS喜欢使用学位。angleRad = w/(2*radius)
因此,我们只需要将弧度转换为度数。然后我们将其除以文本中的字母数。这将为我们提供旋转每个字母所需的角度步长。
计算角度后,我们应用 CSS 将每个字母翻译到单词的中心,然后以相同的角度乘以单词中字母的索引旋转每个字母。
当我们旋转每个字母时,因为我们从角度值 0 开始,所以我们最终会得到一个从顶部开始的弯曲文本。
很好,但如果圆圈中的文本居中并向左右平衡,看起来会好得多。因此,我们只需要在每次旋转字母时减去即可。text.length*angle/2
结语
希望jym能通过本文get到干货,有更好的建议欢迎放在评论区😘
感谢jym浏览本文🤞,若有更好的建议,欢迎评论区讨论哈🌹。
如果jym觉得这篇干货很有用,加个关关🥰,点个赞赞🥰,后面我会继续卷,分享更多干货!感谢支持!😍