【问题标题】:Resizing font based on html length根据 html 长度调整字体大小
【发布时间】:2015-08-28 19:02:18
【问题描述】:

我知道有很多类似的帖子,但我至今没能解决这个问题。

上下文:
用户选择一个家,
房屋有独特的标题,
根据标题,调整字体大小以防止溢出

JS 小提琴:https://jsfiddle.net/9uvpun5o/3/

$(function() {
    var that = $('#title'),
        planName = that.html().length
    ;
    // depending on html length, update font-size
    if(planName > 30) {
        that.css('font-size', '10px');
    } else if(planName > 20) {
        that.css('font-size', '12px');
    } else if(planName > 10) {
        that.css('font-size', '15px');
    }
});

字体根据 html 长度调整大小,但我需要它是响应式的。我尝试创建一个 .on("change") 事件,但未能正确实施。帮忙?

现在我只是从控制台更新标题,
$('#title').html("big long description thing");

但是,这将在未来通过从模式菜单中进行选择来完成。

【问题讨论】:

  • User selects a unit 怎么样?您发布的代码根本没有实现它
  • 没有看到更多的 HTML 很难确定,但您可以查看 css 属性 word-wrap w3schools.com/cssref/css3_pr_word-wrap.asp
  • @A.Wolff 是的,它会更倾向于在那里说上下文。该代码的其余部分尚未编写。据我了解,jQuery 的“更改”功能需要某种 dom 事件。我也许可以把这段代码放在一起。
  • MDN 是更好的信息来源than w3schools

标签: javascript jquery css font-size


【解决方案1】:

编辑

好的,现在我明白了。你的 JS 应该是这样的:

$(function() {
    $('#title').on('DOMSubtreeModified', function() {
        var title = $('#title'),
            planName = title.html().length;

        // depending on html length, update font-size
        if(planName > 30) {
            title.css('font-size', '10px');
        } else if(planName > 20) {
            title.css('font-size', '12px');
        } else if(planName > 10) {
            title.css('font-size', '15px');
        }
    });

     $('li').on('click', function() {
         $('#title').text( $(this).text() );
     });
});

DOMSubtreeModified 应该在元素内容发生变化时触发(因为这会修改 DOM 子树)。 “点击”部分不是必需的,但我将其保留用于测试目的。

根据DottoroOpera 不支持此事件,IE 9 及以下版本可能不支持或存在错误。

有关更多选项和信息,请查看其他 StackOverflow 问题:


如你所说,用户将“选择一个单元”:

用例: 用户选择单位, 单位有独特的头衔, 根据标题,调整字体大小以防止溢出

因此,您需要在此操作中更改字体大小。我用你的代码做了一个例子:

HTML

<ul>
    <li>On load, font size is set depending on length of title.</li>
    <li>However, I want this to be reactive...</li>
    <li>Change the length of Title and hit run</li>
    <li>Try clicking these itens</li>
    <li>You will see</li>
<ul>
<br/><br/>
<span id="title">TEST TEST</span><br/>

JS

$(function() {
    $('li').on('click', function() {
       var titleEl = $('#title').text( $(this).text() ),
           planName = titleEl.text().length;

        // depending on text length, update font-size
        if (planName > 30) {
            titleEl.css('font-size', '10px');
        } else if (planName > 20) {
            titleEl.css('font-size', '12px');
        } else if(planName > 10) {
            titleEl.css ('font-size', '15px');
        } 
    });
});

尝试在列表中单击。你看?作为对“更改单位”的回应,标题和字体大小会发生变化。

如果此答案对您没有帮助,请提供更多详细信息。

【讨论】:

  • 感谢您的回复,不过我想我需要编辑我的描述。您的代码是正确的,并且满足了 'change' 寻找的 dom 事件触发。但是我只想要一个检测长度何时改变的函数,然后改变字体大小。
  • 好的,添加了新信息。看看我的回答是否能解决你的问题。
  • 就是这样。谢谢你,聪明的人类!我会对此表示赞成,但我还需要 1 个代表。我很快就会写一篇博文,并且会给你(以及其他帮助过的人,比如@Jeff Clarke)所有的功劳。谢谢,谢谢。
  • 很高兴知道它对您有所帮助:)。您可以(并且应该,如果它解决了您的问题)将此标记为正确答案。
【解决方案2】:

这会起作用。试试这个

var planName = $("#title").text().length;

if(planName > 30) {
    $('#title').css("fontSize", "16px");
}else{ if(planName > 20) {
    $("#title").css("fontSize", "12px");
}else if(planName > 8) {
    $("#title").css("fontSize","24px")
}

【讨论】:

    【解决方案3】:

    我可能会结合一些 CSS 来防止文本换行,然后我会使用一些脚本来测量渲染文本的长度。如果它比您预定的最大宽度长,请使用脚本应用 CSS 转换。

    #title {
      white-space: nowrap;
      display: inline-block; /* necessary for the scale to actually work */
      transform-origin: 0% 100%; /* set transform origin to bottom left corner of the title element */
    }
    
    .maxwidth-container {
      width: 400px;
    }
    

    然后在你的脚本中:

    var scaleTitle = function() {
    
      var $title = $("#title");
      var maxWidth = $(".maxwidth-container").width();
      $title.css("transform","scale(1,1)"); //reset to normal scale in order to measure natural width
    
      if ($title.width() > maxWidth) {
        var scaleAmt = maxWidth / $title.width();
        $title.css("transform" , "scale(" + scaleAmt + "," + scaleAmt + ")");
      }
    
    };
    

    在您的情况下,我已将您的 #title 元素包装在一个指定最大尺寸的容器中,但您可以使用明确的设置数量。

    每次用户选择一个家时调用这个函数。

    这里的例子: https://jsfiddle.net/9uvpun5o/5/

    【讨论】:

    • 感谢您的酷回答!这确实遇到了我遇到的同样的问题——如何使函数反应。我意识到这是一个主要话题,也是开发许多工具的原因之一,但我必须相信有一种简单的方法可以使用 jQuery 实现这一目标。
    • 我尝试在 CSS 中使用 calc() 以使其成为唯一的 CSS 解决方案,但我不知道如何引用 #title 元素的渲染宽度。但是transform: scale( calc(400/450), calc(400/450) ); 似乎可以在支持calc 的浏览器中工作。如果您能弄清楚如何将上面示例中的450 替换为元素的渲染宽度,那么您将拥有纯 CSS 解决方案。
    • 据我所知,没有办法直接使用 css 获取 html 属性。这将是一个了不起的功能。需要注意的是, calc() 得到了广泛的支持:caniuse.com/#search=calc
    • 这可能是使用 AngularJS 更容易做到的事情。为#title 名称创建一个变量,并在每次更改时对其进行监视。然后调用你的例程来测量和缩放它。
    • 当然。任何与 object.observe 产生类似效果的东西都可以,不过我真的希望找到一个纯 jQuery 解决方案。
    猜你喜欢
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 2013-08-28
    • 2012-11-11
    • 2014-07-24
    相关资源
    最近更新 更多