javascript/react 动态高度文本区域(停在最大值处)

标签 javascript html css reactjs

我想要实现的是一个文本区域,它从单行开始,但会增长到 4 行,如果用户继续键入,此时开始滚动。我有一个部分解决方案有点工作,它增长然后在达到最大值时停止,但如果你删除文本它不会像我想要的那样收缩。

这就是我目前所拥有的。

export class foo extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      textareaHeight: 38
    };
  }

  handleKeyUp(evt) {
    // Max: 75px Min: 38px
    let newHeight = Math.max(Math.min(evt.target.scrollHeight + 2, 75), 38);
    if (newHeight !== this.state.textareaHeight) {
      this.setState({
        textareaHeight: newHeight
      });
    }
  }

  render() {
    let textareaStyle = { height: this.state.textareaHeight };
    return (
      <div>
        <textarea onKeyUp={this.handleKeyUp.bind(this)} style={textareaStyle}/>
      </div>
    );
  }
}

显然,问题是当 height 设置为更大的值时,scrollHeight 不会缩小。关于如何解决此问题的任何建议,以便在删除文本后它也会缩小?

最佳答案

另一个简单的方法(没有额外的包)

export class foo extends React.Component {
  handleKeyDown(e) {
    e.target.style.height = 'inherit';
    e.target.style.height = `${e.target.scrollHeight}px`; 
    // In case you have a limitation
    // e.target.style.height = `${Math.min(e.target.scrollHeight, limit)}px`;
  }

  render() {
    return <textarea onKeyDown={this.handleKeyDown} />;
  }
}

删除文字后textarea不缩回的问题是忘记设置这一行

e.target.style.height = 'inherit';

考虑使用 onKeyDown,因为它适用于所有键,而其他键可能不适用 (w3schools)

如果您有 paddingbordertopbottom ( reference )

handleKeyDown(e) {
    // Reset field height
    e.target.style.height = 'inherit';

    // Get the computed styles for the element
    const computed = window.getComputedStyle(e.target);

    // Calculate the height
    const height = parseInt(computed.getPropertyValue('border-top-width'), 10)
                 + parseInt(computed.getPropertyValue('padding-top'), 10)
                 + e.target.scrollHeight
                 + parseInt(computed.getPropertyValue('padding-bottom'), 10)
                 + parseInt(computed.getPropertyValue('border-bottom-width'), 10);

    e.target.style.height = `${height}px`;
}

希望这对您有所帮助。

关于javascript/react 动态高度文本区域(停在最大值处),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39401504/

相关文章:

javascript - 在每个幻灯片转换上暂停多个 YouTube Iframe 视频

javascript - 保持列表中的滚动位置

javascript - :active and :hover both active at the same time, 填充堆栈

javascript - JQuery 切换仅单击上一个跨度显示

html - 是否可以使用 Rollup 创建一个从模板注入(inject) HTML 的包?

jquery - 为什么除 Chrome 之外的所有浏览器都无法编辑可排序 div 中的文本区域和文本输入字段?

javascript - 使用 NodeJS 设置 session 变量

javascript - 无法使用 Javascript 或 JQuery trim 对象属性

javascript - 将鼠标悬停在特定元素上时如何显示/隐藏

html - 部分的移动 View 看起来很奇怪