在这篇文章中,我们将带领您了解计算文本宽度的全貌,包括计算文本宽度的函数的相关情况。同时,我们还将为您介绍有关css–SVG或HTML中像素完美一致的文本宽度、css–使背景与文本宽度相同,但高度不同
在这篇文章中,我们将带领您了解计算文本宽度的全貌,包括计算文本宽度的函数的相关情况。同时,我们还将为您介绍有关css – SVG或HTML中像素完美一致的文本宽度、css – 使背景与文本宽度相同,但高度不同、css – 如何设置输入宽度以匹配占位符文本宽度、css – 将边框宽度限制为块元素中的文本宽度的知识,以帮助您更好地理解这个主题。
本文目录一览:- 计算文本宽度(计算文本宽度的函数)
- css – SVG或HTML中像素完美一致的文本宽度
- css – 使背景与文本宽度相同,但高度不同
- css – 如何设置输入宽度以匹配占位符文本宽度
- css – 将边框宽度限制为块元素中的文本宽度
计算文本宽度(计算文本宽度的函数)
计算文本宽度
1. 前言
有时候在绘制一行文本前可能想事先知道它的宽度,为什么会有这种需求呢?
比如,我们想给文本绘制个背景或者边框,这时候就需要知道确切的文本宽度了。
2. 计算文本宽度
canvas 为我们提供了一个计算文本宽度的方法:measureText
方法,方法返回一个 TextMetrics
对象,包含关于文本尺寸的信息,里面就有文本宽度。
我们看一个案例:
<!DOCTYPE html>
<html>
<head>
<Meta charset="utf-8">
<title>网Wiki</title>
<style>
#imooc{
border:px solid #ccc;
}
</style>
</head>
<body>
<canvas id="imooc">您的浏览器不支持 HTML5 canvas 标签</canvas>
<script>
const canvas = document.getElementById(''imooc'');
canvas.width=;
canvas.height=;
const ctx = canvas.getContext(''2d'');
function drawBtn(str, x, y ){
var w = ctx.measureText(str).width; // 获取绘制文本的宽度
var h = parseInt(ctx.font)
ctx.fillStyle="#456795";
ctx.fillRect(x,y,w+,h+)
ctx.fillStyle="#fff";
ctx.textBaseline="hanging"
ctx.fillText(str,x,y)
}
ctx.font="16px 微软雅黑";
drawBtn("Wiki",,)
ctx.font="18px 微软雅黑";
drawBtn("Imooc教程 Hello World", , )
ctx.font="20px 微软雅黑";
drawBtn("确认", , )
</script>
<body>
</html>
运行结果:
上面案例中,我们封装了一个函数,可以绘制自适应大小的按钮,让我们拆分讲解一下主要代码。
-
先看绘制按钮的封装函数
drawBtn
,函数传入了三个参数,分别是绘制文本以及绘制文本的起点坐标 (x, y)。function drawBtn(str, x, y ){ ... }
(1)获取到绘制文本的宽度和高度,其实文本的高度就是设置的文本字体的大小值,这里我们用了一个小技巧拿到了设置的文本大小。
var w = ctx.measureText(str).width; // 获取到绘制文本的宽度w var h = parseInt(ctx.font) // 通过小技巧获取到了文本高度h
(2)设置按钮背景为 #456795 这个颜色,并且绘制了一个矩形,这里矩形坐标我们向左上方移动了10个像素,目的是给按钮添加一个内边距,美观一些,因为左侧有10个像素边距,右侧也有10个像素边距,所以我们给背景的矩形框的长度增加了20个像素,高度同理,也增加了20个像素。
ctx.fill; ctx.fillRect(x-10,y-10,w+20,h+20)
(3)设置文字的颜色为白色,把文字的基线设置为
hanging
,这样做的目的是将文本左上角和基线对齐,方便计算,我们也可以设置为其他值,不过计算起来会比较麻烦。ctx.fill; ctx.textBaseline="hanging"
(4)绘制文本。
ctx.fillText(str,x,y)
-
设置字体大小为16像素,调用封装函数绘制文字。
ctx.font="16px 微软雅黑"; drawBtn("Wiki",40,40)
-
设置字体大小为18像素,调用封装函数绘制文字。
ctx.font="18px 微软雅黑"; drawBtn("Imooc教程 Hello World", 40, 90)
-
设置字体大小为20像素,调用封装函数绘制文字。
ctx.font="20px 微软雅黑"; drawBtn("确认", 40, 140)
3. 方法整理
本小节我们学习了 measureText
方法 , 它们是 canvas 2D API 提供的获取绘制文本的相关属性的方法,该方法返回一个 TextMetrics
对象,该对象包含关于文本尺寸的信息,里面就有文本宽度。
3.1 文本宽度 TextMetrics.width
TextMetrics.width 说明
- TextMetrics.width 是当前要绘制文本在画布上将要占用的宽度。
语法:
ctx.measureText(value);
变量说明:
属性名 | 类型 | 说明 |
---|---|---|
value | String | 将要绘制的文本字符串。 |
4. 总结
本小节我们主要学习了利用 measureText
方法获取绘制文本宽度。
css – SVG或HTML中像素完美一致的文本宽度
>我有一个svg路径是粗糙的(99.99%)圆形
>沿着这条路径,我使用’textpath’svg元素放置文本
>我希望文本的结尾尽可能准确地与开头相遇(理想情况下像素完美),以便形成连续的文本循环
这是代码的摘录(删除所有文本值):
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 480 480" preserveAspectRatio="xMidYMid" height="100%" width="100%"> <defs> <style type="text/css"> /* for some reason,SVG font import doesn't work in Chrome or Firefox! */ @font-face { font-family: Libertine; src: url(LinLibertine_R.svg#LinLibertineO); } @font-face { font-family: Libertine2; src: url(LinLibertine_Rah.ttf); } /* Chrome seems to round to the nearest 0.5 em; also,does not display em-widths consistently with Firefox (though px-widths are consistent) */ .ex1 { font: 0.85em Libertine2; } .measurement { font: 1.0em monospace; } </style> <text id="day1">...</text> <text id="day2">...</text> <text id="day3">...</text> <text id="day4">...</text> <text id="day5">...</text> <text id="day6">...</text> <text id="day7">...</text> </defs> <g transform="translate(240,240)"> <g transform="translate(-240,-240)"> <circle r="1" cx="240" cy="27" fill="black" /> <path id="circle" d="M 240,20 a 220,220,0 1,1 -0.0001,0.0000 Z" fill="none" stroke="red" stroke-width="0" /> <path id="inner-circle" d="M 240,40 a 200,200,0.0000 Z" fill="none" stroke="red" stroke-width="0" /> <textfill="black"> <!-- this RTL text-along-path is displayed backwards (ie sdrawkcab) in Chrome; manual CSS overrides (e.g. unicode-bidi) cause blank/white screen --> <textPath xlink:href="#circle" method="stretch">...</textPath> </text> <textfill="grey"> <textPath xlink:href="#inner-circle" method="stretch">A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 G0 G1 G2 G3 G4 G5 G6 G8 G9</textPath> </text> </g> </g> </svg>
到目前为止,我能做的最好的事情是通过CSS导入字体,这大致标准化了浏览器的宽度.
请注意,Chrome不会读取微调的字体大小值(例如,它似乎将0.87em舍入到0.85em),并且似乎与Firefox有不同的文本呈现引擎,即使字体大小一致.例如,1em的字体大小将上面示例中的内部“测量圆圈”渲染为Firefox中的刻度“F9”中的F,其中Chrome几乎渲染到刻度“F4”的开头,这个问题减少到在字体大小中使用px单位时,单字符宽度差异.
您还会注意到Chrome错误地呈现从右到左(RTL)文本,并且手动CSS覆盖(使用’unicode-bidi’和’direction’指令)导致完全失败(根本没有SVG渲染).
不言而喻 – 有很多问题.到目前为止,这是一个有趣的实验,但任何标准化的帮助将不胜感激.
至于我自己的解决方案;我正在考虑使用LinuxLibertine svg-font中的字体规范手动指定每个字符的位置,这是一个非常俗气的替代方法,可以找出渲染不一致的根源.
解决方法
http://www.fontsquirrel.com/tools/webfont-generator
我的经验法则是对特定浏览器使用以下格式.这似乎只是使用SVG / TTF的2倍,但实际上并非如此,并且在像素完美方面会让你如此头疼.
TTF – 适用于大多数浏览器,但缺少IE和iOS Safari.
EOT – 仅限IE.
WOFF – 压缩的新兴标准.
SVG – iPhone / iPad.
此CSS将涵盖一个系列中的所有格式:
@font-face { font-family: 'Libertine'; src: url('Libertine-webfont.eot'); src: url('Libertine-webfont.eot?#iefix') format('embedded-opentype'),url('Libertine-webfont.woff') format('woff'),url('Libertine-webfont.ttf') format('truetype'),url('Libertine-webfont.svg#LibertineRegular') format('svg'); font-weight: normal; font-style: normal; }
然后连接HTML:
<style type="text/css" media="screen"> .ex1 {font: 18px/27px 'Libertine',Arial,sans-serif;} } </style>
希望这会有所帮助,或者不仅仅是让你更加困惑. :/我倾向于这样做.
css – 使背景与文本宽度相同,但高度不同
我有的是:
<h2> <a>TITLE</a> </h2>
我希望文本“title”的黑色背景与文本的宽度相同,但高度不同.
我试过这是各种排列:(即链接中的跨度,h2中的跨度,h2显示内联和跨度块)
<h2> <a href="<?PHP echo site_url(); ?>/artwork/illustrations" > Illustrations<span></span> </a> </h2>
如果我得到正确的宽度,我无法改变高度,因为span是一个内联元素.如果通过使跨度成为块来获得高度,我无法更改将宽度精确地设置为文本的宽度,因为它现在是块级元素并且扩展为页面的整个宽度.
任何想法,或者我只需要使用图像?
解决方法
像这样:http://jsfiddle.net/minitech/3uzbV/
css – 如何设置输入宽度以匹配占位符文本宽度
如果您有一个长占位符,默认情况下的输入不足以显示所有占位符文本。
例如
<input placeholder="Please enter your name,address and shoe size">
没有设置固定宽度,最好没有javascript,你可以设置输入来显示所有的占位符文本吗?
解决方法
input.setAttribute('size',input.getAttribute('placeholder').length);
这是一个代码,适用于所有输入:
http://jsfiddle.net/KU5kN/
css – 将边框宽度限制为块元素中的文本宽度
但是h2元素的width属性仍然是238px,没有任何换行符.
我想在文本下面设置一个边框底部,而不是在h2元素的整个宽度下,我不知道如何使用CSS来实现这一点.
你可以在这里看到我的意思:http://jsfiddle.net/np3rJ/2/
谢谢
解决方法
HTML不会更改:
<div> <h2>Horizon 2020,nouvelles opportunités</h2> </div>
您可以应用以下CSS:
.zone_33 { width: 238px; padding: 0px; margin: 0px; } .zone_33 .dossier_titre { margin: 0px 0px 20px 0px; } .zone_33 h2 { color: #616263; font-size: 150%; font-weight: lighter; padding: 0px 0px 12px 0px; background: none; border-bottom: 1px solid grey; display: table-cell; text-transform: uppercase; } .zone_33 .dossier_titre:after { content: ""; display: table-cell; width: 100%; }
对于< h2>元素,设置显示:table-cell,并在.dossier_titre(头/标题元素的包含块)之后添加一个伪元素.伪元素也是一个表格单元格,宽度为100%(这是关键字).
此外,由于h2不再是块元素,所以将边距添加到.dossier_titre以维护我们的布局中的视觉间距.
如何运作
我正在创建具有宽度为100%的第二个单元格(伪元素)的双单元格表.这将触发浏览器计算包含标题文本的第一个单元格(h2)的缩小到适合宽度.因此,第一个单元格的宽度是显示文本所需的最小值.底部边框与表单元格中文本块中最长的文本行一样长.
限制
IE7中不支持桌面单元格,但是它的解决方法是相当熟知的,如果需要,可以找到它.
如果标题有很多短语,你可能会在意想不到的地方找到线.您需要根据需要插入& nbsp以保持特定的单词.
小提琴:http://jsfiddle.net/audetwebdesign/h34pL/
关于计算文本宽度和计算文本宽度的函数的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于css – SVG或HTML中像素完美一致的文本宽度、css – 使背景与文本宽度相同,但高度不同、css – 如何设置输入宽度以匹配占位符文本宽度、css – 将边框宽度限制为块元素中的文本宽度等相关知识的信息别忘了在本站进行查找喔。
本文标签: