You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在jQuery Resizable调整div大小时缩小字体并保持单行显示

实现可调整大小的
同步缩放字体并保持单行文本

我来帮你搞定这个问题!你想要的是拖动调整<div>大小时,字体自动跟着缩放,同时文本始终保持在同一行,对吧?之前用vh单位只能响应浏览器窗口变化,咱们换个思路,通过监听jQuery UI的resize事件来动态计算字体大小就能实现啦。

核心思路

原来的vh单位是基于浏览器视口高度的,所以只有窗口改变时字体才会变。咱们需要:

  • 监听<div>的resize事件,每次调整容器尺寸时触发计算
  • 计算容器宽度和文本内容的宽度比例,动态调整字体大小
  • 保留white-space: nowrap保证文本始终单行显示

修改后的完整代码

HTML部分

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.9.1/jquery-ui.min.js"></script>
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.9.1/themes/smoothness/jquery-ui.css">
<div class="resize">Some name that is very long</div>

CSS部分

.resize{
  font-size: 20px; /* 初始字体大小,后续由JS动态调整 */
  white-space: nowrap;
  color: black;
  background: yellow;
  cursor: move;
  width: 130px;
  height: 130px;
  overflow: hidden; /* 可选,防止文本溢出容器边界 */
}

JavaScript部分

// 初始化可调整大小组件,并添加resize事件监听
$('.resize').resizable({
  minWidth: 110,
  minHeight: 120,
  resize: function(event, ui) {
    const $container = $(this);
    const containerWidth = ui.size.width;
    const textContent = $container.text();

    // 创建临时元素计算文本在当前字体下的真实宽度
    const $tempSpan = $('<span>')
      .text(textContent)
      .css({
        whiteSpace: 'nowrap',
        fontSize: $container.css('fontSize'),
        position: 'absolute',
        visibility: 'hidden' // 隐藏临时元素,不影响页面
      })
      .appendTo('body');
    
    let textWidth = $tempSpan.width();
    $tempSpan.remove(); // 计算完成后移除临时元素

    // 计算字体缩放比例,确保文本适配容器宽度
    let currentFontSize = parseFloat($container.css('fontSize'));
    if (textWidth > containerWidth) {
      currentFontSize = currentFontSize * (containerWidth / textWidth);
    }
    // 设置最小字体大小,避免字体过小无法阅读
    currentFontSize = Math.max(currentFontSize, 12);

    $container.css('fontSize', `${currentFontSize}px`);
  }
}).trigger('resize'); // 页面加载时触发一次,确保初始状态文本适配容器

额外优化:防抖处理

如果拖动时觉得字体缩放有点卡顿,可以给resize事件加个防抖,减少计算频率:

let resizeTimeout;
$('.resize').resizable({
  minWidth: 110,
  minHeight: 120,
  resize: function(event, ui) {
    clearTimeout(resizeTimeout);
    resizeTimeout = setTimeout(() => {
      // 这里放字体计算逻辑
      const $container = $(this);
      const containerWidth = ui.size.width;
      const textContent = $container.text();

      const $tempSpan = $('<span>')
        .text(textContent)
        .css({
          whiteSpace: 'nowrap',
          fontSize: $container.css('fontSize'),
          position: 'absolute',
          visibility: 'hidden'
        })
        .appendTo('body');
      
      let textWidth = $tempSpan.width();
      $tempSpan.remove();

      let currentFontSize = parseFloat($container.css('fontSize'));
      if (textWidth > containerWidth) {
        currentFontSize = currentFontSize * (containerWidth / textWidth);
      }
      currentFontSize = Math.max(currentFontSize, 12);

      $container.css('fontSize', `${currentFontSize}px`);
    }, 50); // 50毫秒延迟,平衡流畅度和响应速度
  }
}).trigger('resize');

这样调整后,你拖动<div>的边缘时,字体就会自动缩放,文本始终保持在同一行啦!

内容的提问来源于stack exchange,提问作者Cananau Cristian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:33:04