14 个答案:

答案 0 :(得分:45)

CSS no,Javascript yes

你无法用CSS做到这一点,但是你可以在javascript / jQuery中做到这一点。为了帮助您使用伪代码,因为您已经知道该怎么做。只是你不知道如何检测多余的宽度。

最好的方法是让DIV具有以下(至少)风格:

position: absolute;

visibility: hidden;

white-space: nowrap;

font-family: /* same as your title's */

然后将文本复制到它并设置一些起始字体大小。然后你可以迭代你的while循环并在div的宽度合适时停止。然后将计算出的字体大小设置为原始标题。

这样,这种检查将隐藏在用户眼中,因此也可以更快地完成。

BTW:这是自动增长textarea脚本的常用方法。他们使用与原始文本区域具有相同样式设置的虚拟div,并在用户键入文本时调整区域的高度。因此,文本区域最初可能非常小,但如果用户输入大量文本,它将自动增长以适应内容。

循环优化

您可以通过执行以下操作来优化while循环以显着减少迭代次数:

设置起始字体大小。

获得测试DIV的宽度。

计算orig_div和test_div之间的宽度系数。

按此因素调整字体大小,而不是按单位增加/减少

test test_div width

醇>

答案 1 :(得分:22)

我遇到了类似的问题,这让我为此编写了自己的插件。看一下jquery-quickfit(这与我真正喜欢的Robert Koritnik's解决方案非常相似)。

为了防止标题跨越多行,只需添加css样式:

white-space:nowrap;

到元素。

在标题中包含jquery和quickfit之后。您可以使用以下命令触发quickfit:

$('h1').quickfit();

它测量并计算文本的每个字母的大小不变量,以适合并使用它来计算下一个最适合文本的字体大小。

计算被缓存,这使得它在处理多个文本或多次适合文本时非常快,例如,在窗口调整大小时(调整大小几乎没有性能损失)。

项目页面上有更多文档,示例和源代码。

答案 2 :(得分:20)

以下是我经常使用的3个函数来获取文本宽度,高度并将大小调整为容器的宽度。

getTextWidth()会返回启动器中包含的文本的实际宽度。

getTextHeight(width)将返回包含在具有指定宽度的启动器中的包装文本的实际高度。

autoTextSize(minSize,maxSize,truncate)会根据最小和最大尺寸调整容器内的文本大小以使其适合。

autoTruncateText()只会显示用户实际可以看到的字符,并以“...”结束文字。

(function ($) {

$.fn.getTextWidth = function() {

var spanText = $("BODY #spanCalculateTextWidth");

if (spanText.size() <= 0) {

spanText = $("");

spanText.appendTo("BODY");

}

var valu = this.val();

if (!valu) valu = this.text();

spanText.text(valu);

spanText.css({

"fontSize": this.css('fontSize'),

"fontWeight": this.css('fontWeight'),

"fontFamily": this.css('fontFamily'),

"position": "absolute",

"top": 0,

"opacity": 0,

"left": -2000

});

return spanText.outerWidth() + parseInt(this.css('paddingLeft')) + 'px';

};

$.fn.getTextHeight = function(width) {

var spanText = $("BODY #spanCalculateTextHeight");

if (spanText.size() <= 0) {

spanText = $("");

spanText.appendTo("BODY");

}

var valu = this.val();

if (!valu) valu = this.text();

spanText.text(valu);

spanText.css({

"fontSize": this.css('fontSize'),

"fontWeight": this.css('fontWeight'),

"fontFamily": this.css('fontFamily'),

"top": 0,

"left": -1 * parseInt(width) + 'px',

"position": 'absolute',

"display": "inline-block",

"width": width

});

return spanText.innerHeight() + 'px';

};

/**

* Adjust the font-size of the text so it fits the container.

*

* @param minSize Minimum font size?

* @param maxSize Maximum font size?

* @param truncate Truncate text after sizing to make sure it fits?

*/

$.fn.autoTextSize = function(minSize, maxSize, truncate) {

var _self = this,

_width = _self.innerWidth(),

_textWidth = parseInt(_self.getTextWidth()),

_fontSize = parseInt(_self.css('font-size'));

while (_width < _textWidth || (maxSize && _fontSize > parseInt(maxSize))) {

if (minSize && _fontSize <= parseInt(minSize)) break;

_fontSize--;

_self.css('font-size', _fontSize + 'px');

_textWidth = parseInt(_self.getTextWidth());

}

if (truncate) _self.autoTruncateText();

};

/**

* Function that truncates the text inside a container according to the

* width and height of that container. In other words, makes it fit by chopping

* off characters and adding '...'.

*/

$.fn.autoTruncateText = function() {

var _self = this,

_width = _self.outerWidth(),

_textHeight = parseInt(_self.getTextHeight(_width)),

_text = _self.text();

// As long as the height of the text is higher than that

// of the container, we'll keep removing a character.

while (_textHeight > _self.outerHeight()) {

_text = _text.slice(0,-1);

_self.text(_text);

_textHeight = parseInt(_self.getTextHeight(_width));

_truncated = true;

}

// When we actually truncated the text, we'll remove the last

// 3 characters and replace it with '...'.

if (!_truncated) return;

_text = _text.slice(0, -3);

// Make sure there is no dot or space right in front of '...'.

var lastChar = _text[_text.length - 1];

if (lastChar == ' ' || lastChar == '.') _text = _text.slice(0, -1);

_self.text(_text + '...');

};

})(jQuery);

答案 3 :(得分:4)

@Clovis Six

谢谢你的回答。它对我来说非常有用。遗憾的是,我不能仅仅因为投票而感谢你。

注意:我必须更改“$ J(”for“$(”才能使用我的配置。

evendo,这超出了这个问题的范围而不是使用SO,我扩展了你的代码,使其适用于具有max-height的多行框。

/**

* Adjust the font-size of the text so it fits the container

*

* support multi-line, based on css 'max-height'.

*

* @param minSize Minimum font size?

* @param maxSize Maximum font size?

*/

$.fn.autoTextSize_UseMaxHeight = function(minSize, maxSize) {

var _self = this,

_width = _self.innerWidth(),

_boxHeight = parseInt(_self.css('max-height')),

_textHeight = parseInt(_self.getTextHeight(_width)),

_fontSize = parseInt(_self.css('font-size'));

while (_boxHeight < _textHeight || (maxSize && _fontSize > parseInt(maxSize))) {

if (minSize && _fontSize <= parseInt(minSize)) break;

_fontSize--;

_self.css('font-size', _fontSize + 'px');

_textHeight = parseInt(_self.getTextHeight(_width));

}

};

PS:我知道这应该是评论,但评论不允许我正确发布代码。

答案 4 :(得分:4)

今天我创建了一个名为jQuery Responsive Headlines的jQuery插件,它可以完全满足您的需求:它调整标题的字体大小以适应其包含的元素(div,body或其他) 。您可以设置一些不错的选项来自定义插件的行为,我还采取了预防措施,添加对Ben Altmans Throttle / Debounce功能的支持,以便在用户调整大小时提高性能并减轻浏览器/计算机上的负载窗口。在它最简单的用例中,代码看起来像这样:

$('h1').responsiveHeadlines();

...这会将页面元素上的所有h1转换为响应式单行标题,将其大小调整为父/容器元素。

答案 5 :(得分:3)

很简单。为文本创建范围,获取宽度并减小字体大小,直到跨度具有与div容器相同的宽度:

while($("#container").find("span").width() > $("#container").width()) {

var currentFontSize = parseInt($("#container").find("span").css("font-size"));

$("#container").find("span").css("font-size",currentFontSize-1);

}

答案 6 :(得分:1)

github上有一个jquery插件可能就是你想要的。它被称为jquery-quickfit。它使用Jquery提供一种快速而肮脏的方法来将文本拟合到其周围的容器中。

HTML:

Text to fit*

使用Javascript:

$(function() {

$('#quickfit').quickfit();

});

答案 7 :(得分:1)

我不喜欢那里的其他解决方案,所以,这是另一个。它需要您正在调整文本内容的标记:

固定高度

不要太久以至于它超过了10px的边界 - 这个想法是,你不希望它在那之下拍摄并调整文本大小变得难以理解。在我们的用例中不是问题,但是如果它可能在你的用例中你想要在运行之前给出一些单独截断的想法。

醇>

它使用二进制搜索来找到最佳大小,因此我怀疑它在这里和其他地方的表现优于其他许多解决方案,只是将字体大小逐步减去一个像素。今天大多数浏览器也支持字体大小的小数,这个脚本有一些好处,因为它会达到最佳答案的.1px内,无论是什么,即使它是一个相对较长的小数。您可以轻松地将max - fontSize < .1更改为除.1之外的其他值,以降低CPU使用率的精度。

用法:

$('div.event').fitText();

代码:

(function() {

function resizeLoop(testTag, checkSize) {

var fontSize = 10;

var min = 10;

var max = 0;

var exceeded = false;

for(var i = 0; i < 30; i++) {

testTag.css('font-size', fontSize);

if (checkSize(testTag)) {

max = fontSize;

fontSize = (fontSize + min) / 2;

} else {

if (max == 0) {

// Start by growing exponentially

min = fontSize;

fontSize *= 2;

} else {

// If we're within .1px of max anyway, call it a day

if (max - fontSize < .1)

break;

// If we've seen a max, move half way to it

min = fontSize;

fontSize = (fontSize + max) / 2;

}

}

}

return fontSize;

}

function sizeText(tag) {

var width = tag.width();

var height = tag.height();

// Clone original tag and append to the same place so we keep its original styles, especially font

var testTag = tag.clone(true)

.appendTo(tag.parent())

.css({

position: 'absolute',

left: 0, top: 0,

width: 'auto', height: 'auto'

});

var fontSize;

// TODO: This decision of 10 characters is arbitrary. Come up

// with a smarter decision basis.

if (tag.text().length < 10) {

fontSize = resizeLoop(testTag, function(t) {

return t.width() > width || t.height() > height;

});

} else {

testTag.css('width', width);

fontSize = resizeLoop(testTag, function(t) {

return t.height() > height;

});

}

testTag.remove();

tag.css('font-size', fontSize);

};

$.fn.fitText = function() {

this.each(function(i, tag) {

sizeText($(tag));

});

};

})();

答案 8 :(得分:1)

这可能对您的要求有些过分,但我发现这个库非常有用:

但这对单线只有好处,所以我不确定这是否符合您的要求。

答案 9 :(得分:0)

我做了一些非常小的jQuery来调整div的字体大小。它甚至适用于多行,但只会增加字体的大小(如果需要,您可以简单地设置默认字体大小为1px)。

我增加了字体大小,直到换行,设置减少1px。没有其他花哨的东西,隐藏的div左右。只需将quickfit类添加到div。

$(".quickfit").each(function() {

var jThis=$(this);

var fontSize=parseInt(jThis.css("font-size"));

var originalLines=jThis.height()/fontSize;

for(var i=0;originalLines>=jThis.height()/fontSize && i<30;i++)

{ jThis.css("font-size",""+(++fontSize)+"px"); }

jThis.css("font-size",""+(fontSize-1)+"px");

});

答案 10 :(得分:0)

在这里查看此示例http://codepen.io/LukeXF/pen/yOQWNb,您可以在页面加载和页面调整大小上使用简单的函数来实现神奇。虽然要小心,不要让客户端从太多的函数调用中退出。 (这个例子有延迟)。

function resize() {

$('.resize').each(function(i, obj) {

$(this).css('font-size', '8em');

while ($(this).width() > $(this).parent().width()) {

$(this).css('font-size', (parseInt($(this).css('font-size')) - 1) + "px");

}

});

}

答案 11 :(得分:0)

$.fn.fitToWidth=function(){

$(this).wrapInner("").each(function(){

var $t=$(this);

var a=$t.outerWidth(),

$s=$t.children("span"),

f=parseFloat($t.css("font-size"));

while($t.children("span").outerWidth() > a) $t.css("font-size",--f);

$t.html($s.html());

});

}

这实际上创建了一个继承重要属性的临时范围,并比较了宽度差异。当然,需要优化while循环(减少两种尺寸之间计算的百分比差异)。

使用示例:

$(function(){

$("h1").fitToWidth();

});

答案 12 :(得分:0)

在某些情况下,您可以在css中完成此操作,但它很脆弱且与上下文有关。

css字体大小可以接受屏幕的相对大小。如果标题的包含元素的大小是相对于屏幕大小的大小,则可以通过简单地设置font-size: 3vw或适当的大小以使文本适合一行而实现此目的。如果调整了屏幕大小,则文本也会随之变化。请注意,宽度将取决于确切的文本内容,并且如果您将字符添加到以前适合一行的文本中,则可能需要调整字体大小。

答案 13 :(得分:0)

我知道这个问题似乎得到了相当彻底的回答,但在某些情况下,这里的解决方案可能会导致其他问题。例如,tkahn的库看起来非常有用,但它改变了附加元素的显示,这可能是一个问题。在我的情况下,它阻止我垂直和水平居中文本。经过一些麻烦和实验之后,我想出了一个简单的方法,包括jQuery,使文本在一行上拟合,而不需要修改父元素的任何属性。请注意,在此代码中,我使用了Robert Koritnik的建议来优化while循环。要使用此代码,只需将“font_fix”类添加到包含需要在一行中适合它的文本的任何div。对于标题,这可能需要在标题周围添加额外的div。然后,为固定大小的div调用此函数一次,或者将其设置为调整大小和/或方向侦听器以获得不同的大小。

function fixFontSize(minimumSize){

var x = document.getElementsByClassName("font_fix");

for(var i = 0; i < x.length; i++){

x[i].innerHTML = '

' + x[i].innerHTML + '

';

var y = x[i].getElementsByClassName("font_fix_inner")[0];

var size = parseInt($("#" + x[i].id).css("font-size"));

size *= x[i].clientWidth / y.clientWidth;

while(y.clientWidth > x[i].clientWidth){

size--;

if(size <= minimumSize){

size = minimumSize;

y.style.maxWidth = "100%";

y.style.overflow = "hidden";

y.style.textOverflow = "ellipsis";

$("#" + x[i].id).css("font-size", size + "px");

break;

}

$("#" + x[i].id).css("font-size", size + "px");

}

}

}

现在,为了方便起见,我添加了一个额外的案例,如果文本太小(低于传入函数的最小阈值),文本将被切断。一旦达到可能需要或可能不需要的阈值,则发生的另一件事是将最大宽度改变为100%。应针对每个用户的方案更改此设置。最后,将此答案作为替代发布的整个目的是使其能够将内容集中在父div中。这可以通过将css属性添加到内部div类来轻松完成,如下所示:

.font_fix_inner {

position: relative;

float: center;

top: 50%;

-webkit-transform: translateY(-50%);

transform: translateY(-50%);

}

希望这有助于某人!

html5+div+字体缩放,调整字体大小以适合div(在一行上)相关推荐

  1. 如何修改Linux字体大小,如何更改字体并调整字体大小?

    问题 更改字体的最简单方法是什么?我更愿意使用简单的图形方式,但是命令行建议的答案也欢迎. 答案1 13.04和更高版本 对于Unity界面用户,可以使用unity-tweak-tool 对于Unit ...

  2. 改变linux字体的大小,如何更改字体并调整其大小?

    问题描述 我一直在我的系统上找到互联网上的字体和我如何安装字体?. 什么是最简单的方法来改变我的字体?我更喜欢易于使用的图形方式,但也欢迎使用命令行建议的答案. 最佳解决思路 13.04及更高版本 对 ...

  3. 解决WPS高分辨率下因字体缩放导致字体发虚的问题

    安装 yay -S ttf-wps-fonts wps-office-mui-zh-cn wps-office-mime-cn wps-office-cn # 可选字体 yay -S wps-offi ...

  4. div展示html文本,html – 使文本适合div

    我一直在努力重新创建我在90年代创建的父亲网站(呃),我一直无法让文本适合div内部并水平对齐.我需要将文本放在一起,以便它们适合div.这是 jsfiddle中页面的代码 示例HTML Home I ...

  5. ubuntu18.04 设置字体样式, 调整字体大小

    来自百度的帮助 终端命令: 安装gnome-tweaks桌面配置工具; sudo apt install gnome-tweaks Alt+F2 在运行窗口输入 gnome-tweaks 命令,回车; ...

  6. linux调整zram大小,ZRAM将在Linux5.1上看到更高的性能-它改变了默认的压缩器

    对于那些依赖于ZRAM在RAM中提供压缩块设备的用户,例如将其用于SWAP或/tmp,在Linux 5.1中,您可能会发现它比早期的内核表现更好. 在Linux 5.1中,ZRAM块驱动程序已将其默认 ...

  7. html中字体在上下边缘居中,图片与文字在一行上垂直居中的方法

    不知大家在做网站的时候有没有遇到这样的情况:在一行上会插入一个小图标,然后在图标后面配上文字说明,可是发现往往图片和文字并不垂直居中,在一行上图片老是相对文字要偏上一些,显的很不好看,那么有没有办法使 ...

  8. 使用CSS按比例调整图像大小? [重复]

    本文翻译自:Resize image proportionally with CSS? [duplicate] This question already has an answer here: 这个 ...

  9. html5图片比例控制,按比例调整图像大小以适应HTML5画布

    我正在尝试编写一个jQuery插件,该插件将具有与Zazzle.com上基于Flash的产品编辑器类似的功能.我需要知道的是,使用context.drawImage()画布功能,我可以插入图像并调整其 ...

最新文章

  1. 多核处理器集成了神经处理单元
  2. POJ 2356 Find a multiple (抽屉原理)
  3. 告别2013,迎接2014
  4. 【PAT甲级 stack queue的使用】1051 Pop Sequence (25 分) C++ 全部AC
  5. [html] 移动端布局的自适应如何做?
  6. [vue] 如果现在让你从vue/react/angularjs三个中选择一个,你会选哪个?说说你的理由
  7. 关于C#程序调用AMFPHP服务的问题!!
  8. Asp.Net MVC 模型(使用Entity Framework创建模型类)1
  9. 端口目录Linux操作系统常用命令
  10. 中考配额是什么意思_@所有家长!这些中考政策,你应该提前了解↘
  11. 各种时频分析方法-不定期更新
  12. 腾讯低代码平台实战体验
  13. java calendar 增加年_java 使用Date类、Calendar类,实现增加日期
  14. YOUChain(有链)公链 开源项目介绍——go-bls
  15. Android MagicIndicator 指示器 导航
  16. wrong ELF class: ELFCLASS32
  17. IP反查网站,ip反查接口,旁站查询接口大全,通过IP查域名汇总
  18. 流利阅读12.20 Angry young women: A new generation of activists is challenging misogyny
  19. 【framework】IMS启动流程
  20. win8修复计算机u盘,联想一键恢复8.0专用WIN8PE

热门文章

  1. 正点原子STM32MP157开发板的一些错误和解决方法
  2. 计算机桌子用英语怎么画,9平米的小卧室做电脑桌书桌,我简单的画了个示意图,希望大家帮忙建议!...
  3. 烧烤摊杂想之认识秦都咸阳
  4. 微信小程序实战 (HelloWorld入门)
  5. 在packagist上发布composer包
  6. Linux发展史与安装-Linux从入门到精通第一天(非原创)
  7. SketchUp草图大师笔记
  8. 格式化输出以及运算符
  9. 小点滴——word自动目录+页码问题——摘自贴吧
  10. 删除字符串中的特定字符