字体自适应大小一行展示

字体自适应大小一行展示,最小为12,若还是超出则css的...代替

代码,以300px宽度为例

复制代码
<template>
       <div class="comparyname" ref="comparyName"><div class="comparyname2">公司名称:目的地看似课的手机待机时间程VS的说几句参加考试的</div></div>
</template>

<script>
import {  onMounted, ref} from 'vue';
export default {
  name: "iwebOffice",
  components:{},
  setup() {
    const comparyName = ref(null)

    /**
      * text:文本
      * maxWidth:文本最大宽度
      * fontFamily:字体
      * minSize:最小字号
      * maxSize:最大字号
      * 
      * 此处设置最小字体为12,若12还超出给定宽度,可以使用css的...来实现一行展示,若不超出,则一点一点加大字体,找到最适合的一个字号,最大为50可更改
    */
    const getNewFont = function(text,maxWidth,fontFamily,minSize=12,maxSize=50){
      //创建画布
      let canvas = document.createElement('canvas')
      let context = canvas.getContext('2d');
      //找出能适应的最大字体
      for(var i=minSize;i<maxSize;i++){
        //给画布设置字体和字体大小,并获取此时宽度,判断是否超出最大宽度,返回合适的值
        context.font = i+"px "+fontFamily;
        const detail = context.measureText(text);
        const width = detail.width;
        if(width==maxWidth){
          return i
        }
        if(width>maxWidth){
          return i-1
        }
      }
      return i>maxSize?maxSize:i;
    }
    onMounted(()=>{
      let dom = comparyName.value
      const text = dom.innerText
      const fontFamily = getComputedStyle(dom).fontFamily
      let swidth = parseInt(getComputedStyle(dom).width)
      let newFont = getNewFont(text,swidth,fontFamily,12,30)
      dom.style.fontSize = newFont+'px'
    })
    return {
      comparyName
    };
  }
}
</script>

<style scoped>
.comparyname{
  margin-left: 100px;
  width: 300px;
}
.comparyname2{
  position: relative;
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  color: #444;
  font-weight: bold;
}
</style>
复制代码

效果图

未超出

avatar

avatar

超出

avatar

截图原因,宽度都是300px

posted @   lijun12138  阅读(118)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示