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

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

时间:2024-10-11 16:46:46浏览次数:8  
标签:size const 填充 text width html base font 页面

某个页面有这样一个需求:一个固定宽度的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要测量的字符串。

<?php

function 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

 

标签:size,const,填充,text,width,html,base,font,页面
From: https://www.cnblogs.com/caroline2016/p/18458800

相关文章

  • Flutter容器(6):页面骨架(Scaffold)
    Material组件库提供了丰富多样的组件,这里介绍一下最常用的Scaffold组件,其余的读者可以自行查看文档或FlutterGallery中Material组件部分的示例。注意:FlutterGallery是Flutter官方提供的FlutterDemo,源码位于flutter源码中的examples目录下,笔者强烈建议用户将F......
  • Flutter可滚动组件(5):PageView与页面缓存
    一、PageView如果要实现页面切换和Tab布局,我们可以使用PageView组件。需要注意,PageView是一个非常重要的组件,因为在移动端开发中很常用,比如大多数App都包含Tab换页效果、图片轮动以及抖音上下滑页切换视频功能等等,这些都可以通过PageView轻松实现。PageView({Key?......
  • 针对SEO方向的页面强制跳转问题
    这篇文章主要是帮助不知道网站代码且想要了解强制跳转问题的小伙伴,快速了解网站优化相关的页面强制跳转问题~什么是网站强制跳转?网站强制跳转,简单来说就是当用户访问某个网页时,页面会自动跳转到另一个页面。这种跳转通常是通过JavaScript代码来实现的。运作原理:JavaScript......
  • html面试题总结
    文章目录1.什么是DOCTYPE,有何作用2.H5有哪些新的元素和新特性3.cookie、sessionStorage和localStorage的区别4.script、scriptasync和scriptdefer的区别5.行内元素有哪些?块级元素有哪些?空(void)元素有哪些?6.页面导入样式时,使用link和@import有什么区别7.title和h1......
  • 前端Vue中如何将Div元素内容转换为图片?html2canvas库助你轻松实现!
    前端在Vue3中,如果你需要将一个div元素的内容转换成图片,可以使用一个高效且流行的库——html2canvas。这个库能够帮助你将DOM元素渲染为Canvas,并进一步将Canvas转换为图片,非常适合在Vue项目中使用。原文可查看在线演示地址:张苹果博客一,安装html2canvasnpminst......
  • 怎样修改织梦网站页面模板
    要修改织梦(Dedecms)网站的页面模板,请按照以下步骤操作:备份现有模板文件在进行任何修改之前,首先备份当前使用的模板文件,以防修改过程中出现问题。定位模板文件登录到织梦网站后台。进入“模板”管理界面,找到你需要修改的页面模板文件。通常模板文件位于/templets/模板风......
  • 5、HTML 常用标签 - 第三集
    通过学习,我们的人生被赋予了更多的选择,创造了更多的可能性。文章目录前言1.表单域form1.1标签描述1.2示例代码1.3运行截图2.表单元素input2.1常用“输入框”类型2.2常用“选择框”类型2.3常用“按钮”类型专栏附录前言在HTML中,一个完整的表单通常......
  • uni-app中 navigateTo、reLaunch、redirectTo、switchTab几种页面路由方式的区别
    navigateTo作用:用于在当前页面内跳转到应用内的某个页面,使用wx.navigateTo跳转时,会把当前页面压入栈中,用户可以通过返回按钮或navigateBack 回到上一个页面。限制:不能跳转到tabBar页面。如果尝试跳转到tabBar页面,会没有反应或报错(具体取决于框架的实现)。使用场景:通常用......
  • markdown的html优雅使用语法(2024/10/10guixiang原创)
    一:图片部分第一范式图2全字段排序 <center><imgstyle="border-radius:0.3125em;box-shadow:02px4px0rgba(34,36,38,.12),02px10px0rgba(34,36,38,.08);"width="500"height="400"src="......
  • 键入网址到页面显示,期间发生了什么?计算机网络学习心得(基础篇2)
    1.HTTP域名解析浏览器做到第一步就是域名解析,解析完后会生成发送给Web服务器的请求信息。有很多域名后面都会跟长长的url(如下图),这个url其实就是请求服务器中的文件资源,通过访问这个文件,大部分这个文件就是首页展示的静态页面,也就是.html文件。有些域名后面没有跟url的(比如百......