根据字符串长度调整字体大小

2024-02-16

我有一个垂直菜单,我想使其可本地化,但菜单元素中的本地化字符串经常超出边缘。
所以问题是如何根据 CSS 中的字符串长度调整字体大小。如果可能的话,不使用 JavaScript。
Thanks!

UPD:JQuery 不可接受。纯JS有什么办法吗?


您应该熟悉使用插件,它们可以节省您很多时间,当然它们非常可靠(它们是由经验丰富的脚本编写者/程序员编写的,并且已经过社区测试)。不过看起来你想要一些纯 JS 解决方案。我刚刚为你编写了这段代码。它工作得相当不错(尽管我不确定它是否和某些插件一样好)。唯一的要求是元素(您要根据文本长度调整字体大小)应包含纯文本,而不是一些 HTML 代码。

使用纯JS实现它的想法很简单,你需要使用脚本创建一些虚拟元素,这个虚拟元素用于测量文本的大小。我们需要调整虚拟元素的字体大小,直到文本(以及虚拟元素)的大小应限制在元素的大小(您要调整其字体大小)的范围内。我把代码写得很清楚了,希望你看完代码后能更好地理解:

//we just need 1 dummy element for the whole page.
var dummy = document.createElement('div');
dummy.className = 'dummy';
var inSingleLineMode, inMultilineMode;    
//function used to adjust the font-size of the element
//so that the width is fixed (single-line mode) or both the width and height are 
//fixed (multi-line mode), of course the text should be contained within 
//the fixed width and height.
function adjustFontSize(element, singleLine){
  if(!element.innerHTML) return;
  var elementStyle = getComputedStyle(element);        
  dummy.style.font = elementStyle.font;
  initMode(singleLine, function(){ dummy.style.width = elementStyle.width });
  dummy.style.padding = elementStyle.padding;
  dummy.style.boxSizing = elementStyle.boxSizing;
  dummy.innerHTML = element.innerHTML;
  document.body.appendChild(dummy);
  var dummyStyle = getComputedStyle(dummy);          
  while(singleLine ? parseInt(dummyStyle.width) < parseInt(elementStyle.width) :
                     parseInt(dummyStyle.height) < parseInt(elementStyle.height)){
    dummy.style.fontSize = parseFloat(dummyStyle.fontSize) + 1 + 'px';
    dummyStyle = getComputedStyle(dummy);
  }
  while(singleLine ? parseInt(dummyStyle.width) > parseInt(elementStyle.width) :
                     parseInt(dummyStyle.height) > parseInt(elementStyle.height)){
    dummy.style.fontSize = parseFloat(dummyStyle.fontSize) - 1 + 'px';
    dummyStyle = getComputedStyle(dummy);
  }    
  element.style.fontSize = dummyStyle.fontSize;
  document.body.removeChild(dummy);
}
function initMode(singleLine, callback){
  if(!dummy) return;
  if(singleLine&&!inSingleLineMode) {
    dummy.style.whiteSpace = 'nowrap';
    dummy.style.width = 'auto';
    dummy.style.display = "inline-block";
    inSingleLineMode = true;
    inMultiLineMode = false;
  } else if(!singleLine&&!inMultilineMode) {
    if(callback) callback();
    dummy.style.whiteSpace = 'initial';
    dummy.style.display = "block";
    dummy.style.wordWrap = 'break-word';
    inMultilineMode = true;
    inSingleLineMode = false;
  }
}

Demo. http://jsfiddle.net/dKW2m/5/

在演示中,您可以看到第一个菜单#menu1是越南语单词的意思菊花而第二个菜单#menu2当然是英文单词菊花。它们的长度有很大不同,但是两者都应该有固定的宽度100px,因此第二个菜单#menu2应该使用较小的字体大小以适应空间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据字符串长度调整字体大小 的相关文章

  • 如何在CSS3媒体查询中使主体宽度自动等于设备宽度?

    我现在正在做一个移动网站 并尝试使用 CSS3 媒体查询来定位不同的设备 我的部分代码如下 media screen and max width 320px body width 320px some other style 正如您所看到的
  • Aptana Studio 3 上的预览选项卡在哪里?

    我在 Windows PC 上使用 Aptana Studio 2 并有一个选项卡用于在 IE 上预览页面 另一个选项卡用于在 Firefox 上预览 但我切换到了 Aptana 3 我不知道是没有预览还是我没有找到它 是的 我在 stac
  • 角度 2 中的动态 styleUrls?

    是否可以将样式表的 url 动态注入到组件中 就像是 styleUrls stylesheet1 css this additionalUrls 或者 一厢情愿并注意这只是假代码 export class MyComponent imple
  • 如何在 Bootstrap 3 中指定行高?

    使用 Bootstrap 3 我将 row 类的高度设置为 3 5em 我在行中有几个输入 它们与行的顶部对齐 我想让它们底部对齐 我尝试过垂直对齐 底部的样式 但这似乎不起作用 我想让东西底部对齐的原因是我有一个浮动标签 我在输入字段上方
  • 使用 CSS 的样式选择选项

    我正在尝试使用 CSS 设置选择选项列表的样式 我希望列表的时间之间有更多的填充 因为它们似乎被压在一起 我尝试向选项元素添加填充 但这似乎不起作用 有任何想法吗 这是我的代码 HTML
  • 为什么我的图标在 DIV 布局中从上到下排列而不是从左到右排列?

    我将这 3 个图标包含在单独的 DIV 中 所有这些图标都包含在一个 DIV 中 div div class divicon img src icons text png class icon div div class divicon i
  • CSS:应用于类组合的样式?

    我不确定这是否可行 但是当您想根据应用于元素的类的组合来设置元素的样式时 是否可以在 CSS 中使用语法 我知道我可以使用 jQuery 或其他东西检查元素并根据它所具有的类更改它的样式 但是有没有一种纯 CSS 方法可以做到这一点 例如
  • 在 IE 中使用
    标签时,填充不起作用

    我在我的应用程序中使用 HTML5 标签 标签的填充在 chrome ff 和 safari 中工作正常 但在 IE 中不起作用 我尝试添加显示 块 与部分样式 但它没有用 有什么解决办法吗 许多旧浏览器不理解 HTML5 标签 例如sec
  • 为什么我的字体大小在 android webview 对象中看起来比在 android 浏览器中查看时大得多?

    我正在尝试制作一个小型 Android 应用程序 它除了在 webview 对象而不是浏览中显示网站之外什么也不做 到目前为止它加载了目标网页 但文本和图像大小都比查看页面时大得多在实际设备浏览器中 在浏览器中 页面看起来正确 但在我的应用
  • 如何防止 CSS 或 jQuery 中单词和标点符号之间的换行

    我在一个段落中有一些文字 我的问题是 当标点符号位于单词末尾时 有时可以换行到下一行 像这样 This is the text This is a new line 我可以用 CSS 或 jQuery 解决这个问题吗 如果您不在单词和标点符
  • 恢复默认的CSS属性

    我正在编写一个可在多个网站上使用的组件 每个网站都有自己的样式表 并且以不同的方式显示某些内容 我的所有 html 都包含在一个带有 id 的 div 中 div div 然而 我的组件是在所有网站上看起来一致 这很好 因为我将样式应用于组
  • 使用 CSS 屏蔽图像

    我做了这样的设计 如何用CSS遮盖背景 我试过这样的代码 img poster display block max width 100 webkit mask image url https cdn pbrd co images GYiCo
  • 是否可以使materialize.css模态更大并删除垂直滚动条?

    我刚刚创建了按钮 单击后会弹出一个模式 每个按钮都有一个显示不同练习 gif 的模式 然而 模态框太小 导致用户无法看到整个 gif 迫使他们向下滚动 我想删除滚动条并使模态更大 以便用户可以看到整个 gif 任何帮助都会很棒 这是我的代码
  • 如何将红色边框与必需的属性一起添加到输入字段?

    目前 如果输入字段带有required属性为空时 会显示浏览器默认的错误信息 如果我删除此属性 由于我的 JavaScript 代码 它将在输入字段上显示红色边框 我如何同时显示两者 form submit function e e pre
  • CSS @font-face 有时在 Internet Explorer 中有效,但并非总是有效

    我在使用 Internet Explorer 11 中的网络字体时遇到问题 该字体适用于某些使用 IE11 的用户 但不适用于其他用户 即使它们是同一浏览器 对于遇到问题的用户 Modernizr fontface 仍然返回 true 因此
  • Div 独特的 CSS 样式链接

    我想为单个特定 div 中的链接创建独特的样式 例如 我希望主体中的所有链接为粗体和红色 但在侧边栏 div 中我希望它们为蓝色和斜体 我该怎么办 I have a link color 666666 a visited color 003
  • 如果 CSS 是渲染阻塞的,为什么我们会看到 FOUC?

    为了构建渲染树 浏览器需要 DOM 和 CSSOM CSSOM 只有在下载 CSS 后才能构建 本质上 一旦下载了 CSS 页面就应该可以正常渲染了 但是 为什么我们会在页面上看到 Flash Of Unstyled Content FOU
  • 有什么方法可以让 css 选择除第一页之外的所有内容吗?

    我刚刚找到了 CSS page指令 并将其与 first将 CSS 应用到 html 打印的第一页 有没有办法反其道而行之 将 CSS 应用于所有页面except首先 使用 CSS3 not https developer mozilla
  • SVG线宽问题

    我开始了我的svg学习 我想用svg线做一些技巧吧 但有件事我不明白 我为每个技能创建 2 行 一行是空的 另一行是知识百分比 问题是 前两行的高度是我给出的笔画宽度的一半 其他线都有很好的高度 这是一个 jsbin http jsbin
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L

随机推荐