我知道这可以很容易地用Javascript解决,但我只对纯CSS解决方案感兴趣。

我想要一种动态调整文本大小的方法,以便它总是适合固定的div。下面是示例标记:

<div style="width: 200px;身高:1 em;溢出:隐藏;" > <p>这里的一些示例动态文本量</p> < / div >

我在想,也许这可以通过在ems中指定容器的宽度,并获得字体大小继承该值?


当前回答

因为公认的答案并不能真正解决问题,所以我基于jkrei0的答案在React中创建了一个解决方案。这将使动态文本根据其长度增长/收缩,就像在PowerPoint中一样。

这里是代码盒的链接:https://codesandbox.io/s/relaxed-rosalind-ielb8o

其他回答

试试MartijnCuppens的RFS(响应式字体大小)库,它可能会在Bootstrap中实现

正如许多人在@DMTinter的帖子的评论中提到的,OP询问的是字符变化的数量(“数量”)。他还问了关于CSS的问题,但正如@Alexander所指出的,“只有CSS是不可能的”。据我所知,在这个时候这似乎是正确的,所以人们想知道下一个最好的事情似乎也是合乎逻辑的。

我对此并不感到特别自豪,但它确实有效。似乎要写太多的代码来完成它。这就是核心:

function fitText(el){
  var text = el.text();
  var fsize = parseInt(el.css('font-size'));
  var measured = measureText(text, fsize);

  if (measured.width > el.width()){
    console.log('reducing');
    while(true){
      fsize = parseInt(el.css('font-size'));
      var m = measureText(text, fsize );
      if(m.width > el.width()){
        el.css('font-size', --fsize + 'px');
      }
      else{
        break;
      }
    }
  }
  else if (measured.width < el.width()){
    console.log('increasing');
    while(true){
      fsize = parseInt(el.css('font-size'));
      var m = measureText(text, fsize);
      if(m.width < el.width()-4){ // not sure why -4 is needed (often)
        el.css('font-size', ++fsize + 'px');
      }
      else{
        break;
      }
    }
  }
}

这是一个JS Bin: http://jsbin.com/pidavon/edit?html,css,js,console,output 请建议可能的改进(我不是真的对使用画布来测量文本感兴趣…看起来开销太大了(?))。

感谢@Pete的measureText函数: https://stackoverflow.com/a/4032497/442665

编辑:注意attr()它与css中的calc()有关。将来你也许能做到。

不幸的是,目前没有css唯一的解决方案。这就是我建议你做的。给元素一个title属性。并使用文本溢出省略号来防止设计的破坏,让用户知道有更多的文本在那里。

<div style="width: 200px; height: 1em; text-overflow: ellipsis;" title="Some sample dynamic amount of text here">
 Some sample dynamic amount of text here
</div>

.

.

.

或者,如果您只是想根据视口减小大小。CSS3支持相对于视图端口的新维度。

body {
   font-size: 3.2vw;
}

3.2vw =视口宽度的3.2% 3.2vh =视口高度的3.2% 3.2vmin =小于3.2vw或3.2vh 3.2vmax =大于3.2vw或3.2vh 看到css-tricks.com/..。也可以看看caniuse.com/....

calc(42px + (60 - 42) * (100vw - 768px) / (1440 - 768));

用这个方程。

对于大于或小于1440和768的任何值,您可以给它一个静态值,或者应用相同的方法。

vw解决方案的缺点是你不能设置缩放比例,比如在屏幕分辨率1440下的5vw最终可能是60px的字体大小,这是你的想法字体大小,但当你将窗口宽度缩小到768时,它可能最终是12px,而不是你想要的最小尺寸。使用这种方法,您可以设置上边界和下边界,字体将在两者之间自行缩放。

创建一个查找表,根据<div>中的字符串长度计算字体大小。

const fontSizeLookupTable = () => {
  // lookup table looks like: [ '72px', ..., '32px', ..., '16px', ..., ]
  let a = [];
  // adjust this based on how many characters you expect in your <div>
  a.length = 32;
  // adjust the following ranges empirically
  a.fill( '72px' ,     );
  a.fill( '32px' , 4 , );
  a.fill( '16px' , 8 , );
  // add more ranges as necessary
  return a;
}

const computeFontSize = stringLength => {
  const table = fontSizeLookupTable();
  return stringLength < table.length ? table[stringLength] : '16px';
}

通过实证测试对所有参数进行调整和调优。