js非递归文字换行

 由于数字、中文、符号所占像素长度不一致,所以这里不能用求平均值的方式去计算每行的文字个数,于是我写了一个方法来计算每行的真实数字个数。

  /**
   * 计算每行显示文字
   * @param rows 指定需要换几行
   * @param text 需要进行换行的文本
   * @param max_width 最大长度
   */
  function calcRTNLabel(rows, text, max_width) {
    let labelArr = [];
    let index = 0;
    let labelInterval = Math.ceil(text.length / (rows + 1));
    while (index < rows && text) {
      let lastIndex = index + 1;
      let chart = text.slice(0, labelInterval);
      let { labelWidth } = getTextWidth(chart);
      // 文字长度大于最长
      if (labelWidth > max_width) {
        let nextChart = text.slice(0, labelInterval - 1);
        let { labelWidth } = getTextWidth(nextChart);
        index--;
        labelInterval--;
      }
      // 文字长度小于最长
      else if (labelWidth <= max_width) {
        let nextChart = text.slice(0, labelInterval + 1);
        let { labelWidth } = getTextWidth(nextChart);
        if (labelWidth < max_width) {
          if (
            !text.slice(labelInterval + 1, labelInterval + labelInterval + 1)
          ) {
            // 剩余文字长度不够换行,结束遍历
            break;
          }
          index--;
          labelInterval++;
        } else {
          text = text.slice(labelInterval, text.length);
          labelArr.push(chart + "\n");
        }
      }
      index++;
    }

    if (text) labelArr.push(text);
    return labelArr.join("");
  }

   /**
   * 计算文字在图上的长度
   * @param text 文字
   * @param fontSize 用户输入文字大小
   */
   function getTextWidth(text, fontSize) {
    // 创建临时元素
    const _span = document.createElement("span");
    // 放入文本
    _span.innerText = text;
    // 设置文字大小
    _span.style.fontSize = fontSize + "px";
    // span元素转块级
    _span.style.position = "absolute";
    // span放入body中
    document.body.appendChild(_span);
    // 获取span的宽度
    let width = _span.offsetWidth;
    let height = _span.offsetHeight;
    // 从body中删除该span
    document.body.removeChild(_span);
    // 返回span宽度
    return { labelWidth: width, labelHeight: height };
  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值