根据 html 长度调整字体大小
Resizing font based on html length
我知道有很多类似的帖子,但我至今没能解决这个问题。
上下文:
用户选择一个家,
房屋拥有独特的所有权,
根据标题,调整字体大小以防止溢出
JS Fiddle: 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");
但是,这将在未来通过从模态菜单中进行选择来完成。
编辑
好的,我明白了。那么你的 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 子树)。 'click' 部分不是必需的,但我保留它用于测试目的。
根据Dottoro,Opera不支持此事件,IE 9及以下可能不支持或越野车。
有关更多选项和信息,请查看其他 Whosebug 问题:
根据您所说,用户将 "select a unit":
use case:
User selects a unit,
units have unique titles,
depending on title, resize font to prevent overflow
因此,作为此操作的一部分,您需要更改 font-size。我用你的代码做了一个例子:
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');
}
});
});
尝试点击列表中的项目。你看?作为对 "changing the unit" 的回应,标题和 font-size 发生了变化。
如果此答案对您没有帮助,请提供更多详细信息。
我可能会结合一些 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
元素包装在一个规定最大尺寸的容器中,但您可以使用明确的设定数量。
每次用户选择房屋时调用此函数。
This will work.TRy this
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")
}
我知道有很多类似的帖子,但我至今没能解决这个问题。
上下文:
用户选择一个家,
房屋拥有独特的所有权,
根据标题,调整字体大小以防止溢出
JS Fiddle: 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");
但是,这将在未来通过从模态菜单中进行选择来完成。
编辑
好的,我明白了。那么你的 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 子树)。 'click' 部分不是必需的,但我保留它用于测试目的。
根据Dottoro,Opera不支持此事件,IE 9及以下可能不支持或越野车。
有关更多选项和信息,请查看其他 Whosebug 问题:
根据您所说,用户将 "select a unit":
use case: User selects a unit, units have unique titles, depending on title, resize font to prevent overflow
因此,作为此操作的一部分,您需要更改 font-size。我用你的代码做了一个例子:
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');
}
});
});
尝试点击列表中的项目。你看?作为对 "changing the unit" 的回应,标题和 font-size 发生了变化。
如果此答案对您没有帮助,请提供更多详细信息。
我可能会结合一些 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
元素包装在一个规定最大尺寸的容器中,但您可以使用明确的设定数量。
每次用户选择房屋时调用此函数。
This will work.TRy this
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")
}