概括:
文本区域中的行数乘以行高,与 textarea 元素的高度不一样,这是为什么?
细节
我正在开发一个函数来调整 AngularJs 指令中 textarea 元素的大小,我找到的答案将其作为链接函数中解决方案的主要内容:

angular.module('auto.resize', []).directive('autoResize', ['$timeout', function($timeout) {
  return {
    restrict: 'A',
    link: function link(scope, elm) {
      const resize = function() {
        elm[0].style.height = elm[0].scrollHeight + "px";
      }
      elm.on("blur keyup change", resize);
      $timeout(resize);
    }
  }
}]);
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title>AngularJS </title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.js"></script>
</head>

<body>
  <div>
    <textarea auto-resize></textarea>
  </div>
</body>

当您添加额外的行,然后在除底线之外的任何内容上键入时,这并不像我希望的那样工作,它会慢慢缩小小于行高的量。
我的修复是这样的:

angular.module('auto.resize', []).directive('autoResize', ['$timeout', function($timeout) {
  return {
    restrict: 'A',
    link: function link(scope, elm) {
      const resize = function() {
        const lines = elm[0].value.split("\n").length;
        const lineHeight = parseInt(getComputedStyle(elm[0]).lineHeight.match(/(\d+)/)[1];
        elm[0].style.height = lines * lineHeight + "px";
      }
      elm.on("blur keyup change", resize);
      $timeout(resize);
    }
  }
}]);
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title>AngularJS </title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.js"></script>
</head>

<body>
  <div>
    <textarea auto-resize></textarea>
  </div>
</body>

这会自我纠正,以免不必要地调整大小,但是,我的问题是 lines * lineHeightscrollHeight 不同,似乎有一些填充,我无法猜测。
我如何在两者之间映射?

最佳答案

元素的 scrollHeight 会留下一些额外的填充(除了元素的实际 padding 之外),以便为文本中的任何上升或下降腾出空间。这将根据特定的字体指标而有所不同:

console.log($('#a').prop('scrollHeight'))
console.log($('#b').prop('scrollHeight'));
div {
    padding: 0;
    line-height: 10px;
    white-space: pre-wrap; /* simulate textarea handling */
    }
#a {font-family: serif}
#b {font-family: monospace}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div id="a">one
two
three</div>

<div id="b">one
two
three</div>


您在 this question's accepted answer 中使用的方法中描述的“收缩”行为可能与同一问题有关。这可以通过使用元素的 innerHeight 而不是 scrollHeight 来纠正——innerHeight 确实匹配行高乘以行数(只要没有任何文本换行。)

关于javascript - 为什么 scrollHeight 与 textarea 中的 lineHeight * 行不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44888617/

10-12 02:03