css、js(vue)进行textarea自适应高度(超详细说明)

这篇具有很好参考价值的文章主要介绍了css、js(vue)进行textarea自适应高度(超详细说明)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


需求——如下图

黑色部分——页面布局为上左右下布局
红色部分——在右边有一个文本域,自适应高度,最小高度128px,最大高度不能超过右边屏幕的一半,里面有一个距离右下16px的确认按钮

textarea 自适应高度,javascript,css

一、纯css 的自适应高度(有问题,不推荐)

1.css代码

<style type="text/css">
  body, html{
    height: 100%;
    margin: 0;
    padding: 0;
  }
  .right {
    max-height: 50%;
    width: 50%;
    height: 100%;
    background-color: pink;
  }
  .box {
      
      display: grid;
      word-break: break-all;
  }
  .box::after {
      content: attr(data-replicated-value) " ";
      white-space: pre-wrap;
      visibility: hidden;
  }
  .box>textarea {
      resize: none;
      overflow-x: hidden;
      overflow-y: auto; 
  }
  .box>textarea,
  .box::after {
      border: 1px solid black;
      padding: 10px;
      grid-area: 1 / 1 / 2 / 2;
  }
</style>

2. html代码

<div class="right">
  <div class="box">
    <textarea name="text" id="cssTextarea" class="cssTextarea" onInput="this.parentNode.dataset.replicatedValue = this.value"></textarea>
  </div>
</div>

3. 代码截图说明

textarea 自适应高度,javascript,css

4. 效果和会出现的问题

效果如下图
问题1: 会导致有多余留白
问题2:超出限制的高度也不会出现滚动条(由问题1延申而来)
textarea 自适应高度,javascript,css

css纯样式实现自适应总结:是的,连按钮都没有加上,就已经改不动了,所以这种直接pass了,断了css纯样式实现textarea的自适应高度的念头后,来看看使用js的方式。

二、js 的自适应高度

0.思路

1:首先,将父盒子设置为display: flex,并设置flex-direction: column,使子元素垂直排列。
2: 然后,设置父盒子的最大高度为max-height: 50%,即最大高度为父盒子高度的一半。
3: 之后,给文本域设置最小高度,并隐藏横轴滚动,文本域超出纵轴滚动。
4: 其次,使用使用flex-grow: 1将文本域设置为可伸缩的,并使其占据剩余的空间。
5: 接着,设置resize: vertical,当文本输入时,允许用户根据输入的字符数动态调整垂直方向的高度变化。
6:最后,动态监听输入的内容,使得height等于scrollHiehgt即可。
优化:设置滚动条的优化样式,不需要的可以忽略

1.代码

1. css代码

 body, html{
  height: 100%;
  margin: 0;
  padding: 0;
}
.right {
  width: 50%;
  height: 100%;
  background-color: pink;
}
.textarea_box {
  display: flex;
  flex-direction: column;
  position: relative;
  padding-top: 16px;
  width: 100%;
  max-height: 50%;
  border-radius: 8px;
  border: 2px solid red;
  box-sizing: border-box;
}
.textareaText{
  margin-bottom: 56px;
  padding: 0 24px 0 24px;
  width: 100%;
  min-height: 78px;
  overflow-x: hidden;
  overflow-y: auto;
  box-sizing: border-box;
  color: #333;
  flex-grow: 1; /* 使文本域占据剩余空间 */
  resize: vertical; /* 允许用户调整垂直方向变化 */
}
.btn{
  position: absolute;
  right: 16px;
  bottom: 16px;
  padding: 0 16px;
  height: 40px;
  line-height: 40px;
  text-align: center;
  border-radius: 4px;
  background: #1979ff;
  color: #ffffffe6;
  font-size: 16px;
  cursor: pointer;
}

2. html代码

<div class="right">
  <divclass="textarea_box">
    <textarea name="text" id="textareaId" class="textareaText"></textarea>
    <div class="btn">确认</div>
  </div>
</div>

3. js代码

<script>
 document.getElementById('textareaId').addEventListener("input", function() {
      this.style.height = "inherit";
      this.style.height = `${this.scrollHeight}px`;
    });
</script>

2.代码说明

textarea 自适应高度,javascript,css.

3.注意点导致的问题

(0)发现问题

1: 文本域中的padding会计算到文本域的高度中去,所以尽量给文本域的父盒子设置来达成效果
2:如果不考虑有按钮等的情况,只是需要一个自适应的盒子,就按照上图的六步走即可,根据设计稿达成效果。

(1)发现问题

如果你完全按照上面的代码查看效果后,你会发现,明明没有到父盒子的50%也有滚动条

textarea 自适应高度,javascript,css

(2)找到问题

如下图,父盒子的高为181px,文本域的高为105,减去底部按钮的56,父盒子的头部的padding-top: 16px
181-105-56-16 = 4 ,高度差了了4px,所以出现了滚动条
textarea 自适应高度,javascript,css

(3)解决问题

结合上面内容来看,如下图,是由于border的距离导致的,解决方式也很简单,删除这行即可
textarea 自适应高度,javascript,css

(4)其他解决问题

思考:如果不是border导致的,而是多出来的padding或者margin导致的,是否有别的解决方式?
解决方式:给滚动高度加上少的距离即可
textarea 自适应高度,javascript,css

4. 滚动条优化样式(可忽略)

注意点:滚动条前面的变量 需要和文本域的类名或者id名一致即可

.textareaText{
  margin-bottom: 56px;
  padding: 0 24px 0 24px;
  width: 100%;
  min-height: 78px;
  overflow-x: hidden;
  overflow-y: auto;
  box-sizing: border-box;
  color: #333;
  flex-grow: 1; /* 使文本域占据剩余空间 */
  resize: vertical; /* 允许用户调整垂直方向变化 */
}
/* 滚动条的优化样式,可忽略 */
/*滚动条整体样式*/
.textareaText::-webkit-scrollbar {
  width:4px;
  height:4px;
}
.textareaText::-webkit-scrollbar-thumb{
  border-radius:5px;
  box-shadow: inset005pxrgba(0,0,0,0.2);
  -webkit-box-shadow: inset005pxrgba(0,0,0,0,0.2);
  background: rgba(0,0,0,0,0.2);
}
.textareaText::-webkit-scrollbar-track{
  box-shadow: inset005pxrgba(0,0,0,0,0.1);
  -webkit-box-shadow: inset005pxrgba(0,0,0,0,0.1);
  border-radius: 0;
  background: rgba(0,0,0,0,0.1);
}

textarea 自适应高度,javascript,css

优化滚动条的详细教程,可以看我之前写的文章滚动条如何设置样式和滚动条悬浮显示与隐藏

三、vue 的自适应高度

按照js的改就好了,把监听input事件改成watch文本域输入的值就好,思路都是一样的。

总结

1:没有纯css能完美完成文本域的自适应高度
2:html+css+js 完成文本域的自适应高度思路

  1. 首先,将父盒子设置为display: flex,并设置flex-direction: column,使子元素垂直排列。
  2. 然后,设置父盒子的最大高度为max-height: 50%,即最大高度为父盒子高度的一半。
  3. 之后,给文本域设置最小高度,并隐藏横轴滚动,文本域超出纵轴滚动。
  4. 其次,使用使用flex-grow: 1将文本域设置为可伸缩的,并使其占据剩余的空间。
  5. 接着,设置resize: vertical,当文本输入时,允许用户根据输入的字符数动态调整垂直方向的高度变化。
  6. 最后,动态监听输入的内容,使得height等于scrollHiehgt即可。
    优化:设置滚动条的优化样式,不需要的可以忽略

补充——resize: vertical;

(1)取值: resize: none | horizontal | vertical | both | initial | inherit;
(2)作用:
none此属性的值,不允许调整元素的大小。
horizontal:此值允许用户调整元素宽度的大小。它将在水平方向上调整元素的大小。有一种用于控制元素宽度的单向水平机制。
vertical::它允许用户调整元素高度的大小。它将在垂直方向上调整元素的大小。有一个用于控制元素高度的单向垂直机制。
both::它允许用户调整元素的宽度和高度。
initial:。将属性设置为默认值。
inherit:它从其父元素继承属性。
(3)文本域使用和不使用resize: vertical的区别
如下图:不使用的话横轴纵轴可以同时修改宽高,使用了允许用户只能修改高度
textarea 自适应高度,javascript,css

若你对文本域自适应高度还有疑问,请查看我的文章:textarea自适应高度二——(设置隐藏div获取高度和仿element-ui组件)https://blog.csdn.net/weixin_44784401/article/details/131597784文章来源地址https://www.toymoban.com/news/detail-637914.html

到了这里,关于css、js(vue)进行textarea自适应高度(超详细说明)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • css自适应高度或宽度,超出内容显示滚动条

    有时候项目中使用了flex布局,高度或是宽度是自动填满剩余空间,不是具体的数值的时候,想要设置区域滚动条,可采用以下方法设置:

    2024年02月13日
    浏览(30)
  • angualr:CSS一个div内两个子元素的高度自适应

    问题:         如题 参考:         CSS一个div内两个子元素的高度自适应-腾讯云开发者社区-腾讯云

    2024年02月09日
    浏览(27)
  • html+css+Jquery 实现 文本域 文字数量限制、根据输入字数自适应高度

    先看效果:初始的效果,样式多少有点问题,不重要!重要的是功能! 输入后: 根据文字长度,决定文本域长度 + 限制文字数量 1 .样式请自行调整! 2 .此处代码为了方便测试,使用的是线上的jquery地址,使用时,请更换自己的路径地址!

    2024年02月02日
    浏览(37)
  • Vue 下 iframe可不固定高度、无视跨域窗口高度自适应

    原理:iframe设置高度100%,使用动态计算出iframe上一个父标签的高度,iframe高度就会自动撑开。限制是iframe只能在一个实时变化高度的窗口里面展示。 一、先看图,以此例子用了element-ui,Home.vue是父组件,Iframe.vue的页面是子组件。简单做了页面,顶部、侧边栏、底部都做了固

    2024年02月07日
    浏览(34)
  • swiper.js(自适应高度autoHeight)做鼠标滚轮整屏滑动功能

    目录 初始化swiper 问题处理 完整代码 1、引入swiper 2、添加鼠标滚轮事件:mousewheel=\\\"true\\\",为了更好的体验,我将下面三个属性 都设置了false allowTouchMove:设置/查看是否禁止触摸滑动。 noSwiping:使该slide无法拖动 keyboard:设置开启键盘来控制Swiper切换。 3、因为要整屏滑动,所以便

    2024年02月09日
    浏览(29)
  • Vue uniapp实现图片宽度100%、高度自适应的效果

    在Uniapp中,我们可以使用image组件来加载图片,而想要实现图片宽度100%、高度自适应的效果,可以通过以下步骤实现: 首先,在image组件上设置mode属性为widthFix,表示按照图片的宽度等比缩放,并保证图片宽度为100%。 接着,在image组件上设置style属性,为图片设置高度自适应

    2024年02月15日
    浏览(50)
  • Vue3使用 xx UI解决布局高度自适应

    在相应的Sider部分添加:height: ‘91.8vh’,即可。示例: vw、vh、vmin、vmax是一种视窗单位,也是相对单位。它相对的不是父节点或者页面的根节点。而是由视窗(Viewport)大小来决定的,单位1,代表类似于 1%。 视窗(Viewport)是你的浏览器实际显示内容的区域—,换句话说是你的

    2024年02月04日
    浏览(30)
  • Ant Design Vue的table组件高度自适应问题

    今天在编写公司项目的时候碰到ant design vue的table组件高度没办法自适应的问题,会出现如下页面情况。  最终尝试的解决方案只能通过监听浏览器窗口变化实现自适应 (1)给表格的srcoll定义一个动态接收参数,方便后面数据增加动态改变滚动高度。  (2)vue3项目中就直接

    2024年02月16日
    浏览(38)
  • 记录--不定高度展开收起动画 css/js 实现

    最近在做需求的时候,遇见了元素高度展开收起的动画需求,一开始是想到了使用 transition: all .3s; 来做动画效果,在固定高度的情况下, transition 动画很好使,满足了需求,但是如果要考虑之后可能还会有更改的情况下,如果每次都是用固定高度来做动画,会显得很繁琐,也

    2024年02月11日
    浏览(45)
  • 设置<el-input type=“textarea“/>高度

    .el-textarea{     height:88px;     :deep(.el-textarea__inner){         height: 88px;     } } :deep(.el-input__wrapper){     font-size: 14px;     width:100%;     height:32px; } :deep(.el-form-item.is-required:not(.is-no-asterisk).asterisk-left.el-form-item__label:before) {     content: \\\"*\\\";     color: var(--el-color-primary);    

    2024年02月04日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包