非CSS解决方案:容器内的文本长度重新调整字体大小

  作为参考,非 CSS 解决方案:

  下面是一些 JS,它根据容器内的文本长度重新调整字体大小。

  代码笔代码略有修改,但与下面的想法相同:

   function scaleFontSize(element) {

  1. var container = document.getElementById(element);
  2. // Reset font-size to 100% to begin
  3. container.style.fontSize = "100%";
  4. // Check if the text is wider than its container,
  5. // if so then reduce font-size
  6. if (container.scrollWidth > container.clientWidth) {
  7. container.style.fontSize = "70%";
  8. }

  对我来说,当用户在下拉列表中进行选择时,我调用此函数,然后我的菜单中的一个 div 被填充(这是我出现动态文本的地方)。

  scaleFontSize("my_container_div");

  此外css 字体,我还使用 CSS 省略号 (“…”) 来截断甚至更长文字也是css 字体,像这样:

   #my_container_div {

  1. width: 200px; /* width required for text-overflow to work */
  2. white-space: nowrap;
  3. overflow: hidden;
  4. text-overflow: ellipsis;

  所以,最终:

  您还可以探索使用 CSS 字母间距来使文本变窄,同时保持相同的字体大小。
  正如@DMTinter 帖子的评论中提到的那样,OP 正在询问字符更改的数量(“数量”)。他还询问了 CSS,但正如@Alexander 指出的那样,“仅使用 CSS 是不可能的”。据我所知,目前这似乎是正确的,所以人们想知道次优的事情似乎也是合乎逻辑的。

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

   function fitText(el){

  1. var text = el.text();
  2. var fsize = parseInt(el.css('font-size'));
  3. var measured = measureText(text, fsize);
  4. if (measured.width > el.width()){
  5. console.log('reducing');
  6. while(true){
  7. fsize = parseInt(el.css('font-size'));
  8. var m = measureText(text, fsize );
  9. if(m.width > el.width()){
  10. el.css('font-size', --fsize + 'px');
  11. }
  12. else{
  13. break;
  14. }
  15. }
  16. }
  17. else if (measured.width < el.width()){
  18. console.log('increasing');
  19. while(true){
  20. fsize = parseInt(el.css('font-size'));
  21. var m = measureText(text, fsize);
  22. if(m.width < el.width()-4){ // not sure why -4 is needed (often)
  23. el.css('font-size', ++fsize + 'px');
  24. }
  25. else{
  26. break;
  27. }
  28. }
  29. }

  这是一个 JS Bin:,css,js,控制台,输出

  请提出可能的改进建议(我对使用画布测量文本并不感兴趣……似乎开销太大(?))。

  感谢@Pete 的 measureText 功能:

文章由官网发布,如若转载,请注明出处:https://www.veimoz.com/1639
0 评论
898

发表评论

!