固定元素宽度根据文本的长度缩小字号,超出缩小字号

简介: 固定元素宽度根据文本的长度缩小字号,超出缩小字号

image.png


最终效果


image.png


这是具体的代码片段


image.png


具体实现


这里我使用vue2来进行实现

先给一个盒子固定的长和高,在给他一个边框,便于观察

<div class="app">
        <div class="content" ref='content'>
                掘金
        </div>
</div>
// css
.app {
    width: 100%;
    height: 100%;
    display: flex;
    justify-content: center;
}
.content {
    width: 160px;
    height: 60px;
    box-sizeing: border-box;
    border: 4px solid blue;
    font-size: 48px;
    color: rgb(0, 213, 255);
    display: flex;
    align-items: center;
}

顺便把问题大小和布局也写上 效果就是这样:


image.png


如果内容字数再多一点就会超出来,变成这样:


image.png


添加css,让文本不换行

white-space: nowrap;


image.png


此时文本就会超出边框

添加超出隐藏的代码

overflow: hidden;

这个时候就会导致文本显示不全


image.png


重要的一步来了,如果我给他添加一个横向的滚动

overflow-x: auto;

此时虽然可以拖动滚动条显示,但是也不能完全显示到页面上


image.png


重点来了:当有滚动条时,我们可以监听到DOM元素的滚动长度

  1. 1.使用scrollWidth可以获取的DOM元素的长度
  2. 2.使用offsetWidth获取元素的固定宽度

如果当scrollWidth值大于offsetWidth时,那就说明文本过长,出现了滚动条了

此时就可以用(文本宽度-padding宽度)/ 滚动长度 * 字体基数就可以获取到最佳的字体大小,把这个字体大小赋值给dom元素,就能使文本正常显示在可视区域内

字体基数可以根据初始字体大小设置,为了确保安全,字体基数需要比初始字体大小(40px)小就行了

setFontSize(){
    // 获取dom元素
  const dom = this.$refs.content
  // 获取padding-left值
  const {paddingLeft} = getComputedStyle(dom);
  // paddingLeft 是一个包含 px 的字符串,转化为数字
  const padding = parseFloat(paddingLeft) || 0
  if(dom.scrollWidth > dom.offsetWidth){
      // 设置新的字体大小
    dom.style.fontSize = `${(dom.offsetWidth-padding*2 ) / dom.scrollWidth * 38}px`;
  }
}

在挂载元素的时候调用这个方法,就可以将文本正常显示到页面中了


image.png


需要注意的是,字体字号最小就是12px,超过这个字号,即使再小也会显示12px的大小

动手尝试一下吧:


image.png


知识点


  • getComputedStyle该方法需要传入一个dom节点,并且会返回一个对象,该对象包含所有 CSS 属性的值。 私有的 CSS 属性值可以通过对象提供的 API 或通过简单地使用 CSS 属性名称进行索引来访问。
  • offsetWidth 属性是一个只读属性,它返回该元素的像素宽度


image.png


  • scrollWidth属性是一个只读属性,它返回该元素的像素宽度,高度包含内边距(padding)


image.png




目录
相关文章
|
4月前
|
前端开发 容器
css 动态文本对齐自适应 — 文本宽度小于容器宽度时居中对齐,文本宽度大于容器宽度时居左对齐
css 动态文本对齐自适应 — 文本宽度小于容器宽度时居中对齐,文本宽度大于容器宽度时居左对齐
39 2
|
6月前
根据字符串内容、最大宽度和字体计算行宽和高度
根据字符串内容、最大宽度和字体计算行宽和高度
39 0
|
6月前
|
前端开发 容器
CSS 超出内容... 或者多行省略及两端对齐及超出多行居中显示
该文本是关于CSS样式技巧的摘要:包括单行和多行文本超出时的省略显示方法,以及Flex布局的两端对齐和一行超出后多行居中的示例代码。
字体等比例缩小
字体等比例缩小
62 0
|
算法 前端开发 JavaScript
图片转ASCII字符图案的原理(可调整亮度对比度 宽高度)
平时看代码会看到很多标点符号的字符拼起来的图案, 特别有趣, 像kong(一个高性能API网关), 除了源代码里面有图案, 命令行也藏了彩蛋. 我今天要玩的会深入一点: 基于图片的灰度值来生成图案. 此时的图片不单单有轮廓, 还有光影效果, 也就是素描中提及的黑白灰.
93 0
font-size: 0消除空白字符导致的行内元素额外间距
`font-size: 0` 设置字体大小为0,但是它要实现的效果却不是字体为0看不见,而是消除子行内元素间额外多余的空白。最推荐的方式是,去掉标签之间的空格、换行等空白字符,这也是压缩...
563 0
font-size: 0消除空白字符导致的行内元素额外间距
|
Web App开发 XML 编解码
01-CSS中的长度尺寸单位和颜色
01-CSS中的长度尺寸单位和颜色
255 0
01-CSS中的长度尺寸单位和颜色
|
前端开发 Serverless
两个盒子,左边固定宽,右边自适应,你能想到几种方法?
最近不是又要秋招了吗? 有的小伙伴就说了,你的面试专栏可是鸽了有一段时间了奥,再不更新我就取关拉! 这这这,我这不来更新了吗,三个招聘季节,更新了三篇,**合情,合理~** ~~再也不画饼了~~
|
Windows
如何确定元素的尺寸
排查一个线上问题时发现 getBoundingClientRect() 方法返回的元素尺寸和元素实际渲染的尺寸不一致,而用 offsetWidth 和 offsetHeight 就是对的,有些奇怪,遂探究之。
156 0