获取字符串的在html页面上的宽度并且若文字过长则缩小字体填充

news/2024/10/11 16:51:02

某个页面有这样一个需求:一个固定宽度的div,若文字过长,则缩小字体填充。

看到同事采用的是用php的GD库的imagettfbbox函数来计算文字的宽度。

imagettfbbox(float $size,float $angle,string $font_filename,string $string,array $options = []): array|false

 取得使用 TrueType 字体的文本的边界框,返回四个顶点的x和y坐标值数据或者false

size字体的尺寸,单位:点(磅)。

angle测量字符串的角度(以度为单位)。

fontfile想要使用的 TrueType 字体的路径。

string要测量的字符串。

<?phpfunction getFontSize($text)
{$base_fs = 14;$base_width = 150;$fontfile = './fonts/Arial.ttf';// 取得使用 TrueType 字体的文本的边界框//第一个参数单位pt,绝对尺寸单位,而px是相对尺寸单位和DPI有关,当DPI为72时,1pt等于1px,本例中假定DPI=72$font_box = imagettfbbox($base_fs, 0, $fontfile, $text);$width = $font_box[2] - $font_box[0];if ($width > $base_width) {$font_size = round($base_fs * ($base_width / ($font_box[2] - $font_box[0])), 2);} else {$font_size = $base_fs;}return compact('text', 'width', 'font_size');
}$text_arr = ['A1-I have a good time every day.','A2-I come from China.','M3-I enjoy going fishing.',"我乐于和平地生活。","我来自中国。","我喜欢去钓鱼。"
];$res = [];
foreach ($text_arr as $text) {$val = getFontSize($text);$res[] = $val;
}
?><style>* {margin: 0;padding: 0}div.text {border: 1px solid red;width: 150px;height: 20px;line-height: 20px;font: normal 14px Arial;}
</style>
<script>console.log(<?= json_encode($res) ?>)
</script>
<div><?php foreach ($res as $row): ?><div class="text" style="font-size: <?= $row['font_size'] ?>px;"><?= $row['text'] ?></div><?php endforeach ?>
</div>

     

计算文字大小和客户端的DPI有关,在server上计算感觉不是很适合,看看有没有客户端的解决方案。

<style>* {margin: 0;padding: 0;}div.text {border: 1px solid red;width: 150px;height: 20px;line-height: 20px;font: normal 14px Arial;}
</style>
<div id="content"></div>
<div id="content_canvas"></div>
<script>function getTextWidth(text) {const font = "normal 14px Arial";const element = document.createElement("span");element.style.font = font;element.style.visibility = "hidden";element.textContent = text;document.body.appendChild(element);const width = element.offsetWidth;document.body.removeChild(element);return width;}function getTextWidthByCanvas(text) {const font = "normal 14px Arial";const canvas = document.createElement("canvas");const context = canvas.getContext("2d");context.font = font;const metrics = context.measureText(text);return metrics.width;}function getFontSize(width) {const base_fs = 14;const base_width = 150;let font_size = 14;if (width > base_width) {font_size = (base_fs * (base_width / width)).toFixed(2);}return font_size;}const text_arr = ["I come from China.I have a good time every day.", "A2-I come from China.", "M3-I enjoy going fishing.", "我乐于和平地生活。", "我来自中国。", "我喜欢去钓鱼。"];function renderHtml(domId, type = "canvas") {console.log(type, "--------------");let html = "";for (let text of text_arr) {const width = type == "canvas" ? getTextWidthByCanvas(text) : getTextWidth(text);const font_size = getFontSize(width);console.log(text, width, font_size);html += `<div class="text" style="font-size:${font_size}px;">${text}</div>`;}document.querySelector("#" + domId).innerHTML = html;}renderHtml("content", "elem");renderHtml("content_canvas");
</script>

           

这种就好很多,文字较长时能够缩小字体填充,且填充的宽度几乎可以占满div

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/70276.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

20222302 2024-2025-1 《网络与系统攻防技术》实验一实验报告

1.实验内容 本周学习内容1.熟练掌握了栈和堆的概念。 2.掌握了Linux的基本操作,如shell命令和编译器gcc、调试器gdb的使用。 3.掌握了缓冲区溢出的原理。实验任务 本次实验的对象是一个名为pwn1的linux可执行文件。该程序正常执行流程是:main调用foo函数,foo函数会简单回显任…

github加速

Github一般用于Git的远程仓库,由于服务器位于国外,国内访问速度比较慢,为了提高访问速度,绕过DNS域名解析。 获取Github的IP地址按下ctrl+alt+T打开命令终端,输入: nslookup github.com 获取github.global.ssl.fastly.net的IP地址按下ctrl+alt+T打开命令终端,输入:…

Small Permutation Problem (Easy Version)

算法 考虑转化 每个点 \(p_i\) 在一个平面直角坐标系中表示为点 \((i, p_i)\) 于是转化为一个棋盘问题, 即每一个点不能在 同一行 / 同一列 \(a\) 数组的限制相当于在左下角为 \((0, 0)\), 右上角为\((i, i)\) 中的正方形中, 有 \(a_i\) 个棋子 于是在每一次加入的时候, 都只能…

Flutter功能性组件(2):弹出框

一、showModalBottomSheet(模态底部弹出框) showModalBottomSheet 用于显示一个模态底部弹出框。 属性解析: Future<T?> showModalBottomSheet<T>({required BuildContext context, // 表示底部弹出框所处的上下文,通常来自当前 widget。required WidgetBuild…

Flutter容器(6):页面骨架(Scaffold)

Material 组件库提供了丰富多样的组件,这里介绍一下最常用的 Scaffold 组件,其余的读者可以自行查看文档或 Flutter Gallery 中 Material 组件部分的示例。注意:Flutter Gallery 是 Flutter 官方提供的 Flutter Demo,源码位于 flutter 源码中的 examples 目录下,笔者强烈建…

Golang上下文context

上篇内容我们主要讲解了net/http标准库的使用,其中包含如何创建POST请求、GET请求以及如何携带参数的请求。 Context介绍 context释义为上下文,在我们使用goroutine时一般使用context来进行元数据的传递,非元数据不建议使用context来进行传递。那么我们主要是用context用来做…

2024 最新 IntelliJ IDEA 2024.1.6 激活(亲测可用)

注意:接下来本文分享免费激活 IDEA 等Jetbrains全家桶工具,一直支持到最新版本2024.1.6。 1.下载安装IDEA (mac、window、linux都支持) 大家直接在官网下载最新版本,登陆官网,下载最新版本2024.1.4。一步一步确定安装,然后打开 这里提示输入激活码,先关闭应用!!!2.…

淘宝程序员没活硬整?在 Excel 和 VSCode 中购物!

你可以在 Excel 表格中挑选商品进行购物,还原度极高,这两个图表更是点睛之笔。哪个天才想出来的,把特么广告都整成了 Excel 图表。大家好,我是程序员鱼皮,最近某宝网站的改进,属实是有点 “新” 了。 你敢相信这是一个购物网站么?你可以在 Excel 表格中挑选商品进行购物…