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

news2024/11/25 13:43:09

文章目录

  • 需求——如下图
  • 一、纯css 的自适应高度(有问题,不推荐)
    • 1.css代码
    • 2. html代码
    • 3. 代码截图说明
    • 4. 效果和会出现的问题
  • 二、js 的自适应高度
    • 0.思路
    • 1.代码
      • 1. css代码
      • 2. html代码
      • 3. js代码
    • 2.代码说明
    • 3.注意点导致的问题
      • (0)发现问题
      • (1)发现问题
      • (2)找到问题
      • (3)解决问题
      • (4)其他解决问题
    • 4. 滚动条优化样式(可忽略)
  • 三、vue 的自适应高度
  • 总结
  • 补充——resize: vertical;


需求——如下图

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

在这里插入图片描述

一、纯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. 代码截图说明

在这里插入图片描述

4. 效果和会出现的问题

效果如下图
问题1: 会导致有多余留白
问题2:超出限制的高度也不会出现滚动条(由问题1延申而来)
在这里插入图片描述

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.代码说明

在这里插入图片描述.

3.注意点导致的问题

(0)发现问题

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

(1)发现问题

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

在这里插入图片描述

(2)找到问题

如下图,父盒子的高为181px,文本域的高为105,减去底部按钮的56,父盒子的头部的padding-top: 16px
181-105-56-16 = 4 ,高度差了了4px,所以出现了滚动条
在这里插入图片描述

(3)解决问题

结合上面内容来看,如下图,是由于border的距离导致的,解决方式也很简单,删除这行即可
在这里插入图片描述

(4)其他解决问题

思考:如果不是border导致的,而是多出来的padding或者margin导致的,是否有别的解决方式?
解决方式:给滚动高度加上少的距离即可
在这里插入图片描述

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);
}

在这里插入图片描述

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

三、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的区别
如下图:不使用的话横轴纵轴可以同时修改宽高,使用了允许用户只能修改高度
不使用的话

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/559615.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spark-sql写入对象存储路径不存在问题(异常路径自动消失)

一、问题分析 1, 环境 spark3.2 hadoop3.2.2 2, 问题现象 insert overwrite table到hive表时&#xff0c;出现路径不存在的报错&#xff0c;导致任务失败。 当表的路径在hdfs上时&#xff0c;没有问题。 表的路径在对象存储上时会有问题。 insert overwrit…

python如何连接mysql数据库

python链接mysql数据库要用到pymysql模块中的connect &#xff0c;connect函数是pymysql模块中 用于连接MySQL数据库的一个函数。 所以连接mysql之前需要先导入pymysql模块。 第一步&#xff0c;mysql模块下载 方法1&#xff08;使用pip命令安装&#xff09;&#xff1a; 因…

测试岗位是巨坑,7年测试告诉你千万别入行.....

每次都有人问我软件测试的前景是什么样的&#xff0c;每年也会有人很多人纷纷涌入测试的岗位上&#xff0c;希望自己能够进入阿里、华为等大厂 但是测试岗位真的那么吃香吗&#xff1f;今天我结合从零基础小白到测试开发的成长经历&#xff0c;来说下这个行业的发展前景&#…

微信小程序仿网易音乐播放器项目

一、项目展示 主页&#xff1a; 播放页&#xff1a; 搜索页&#xff1a; 排行榜页&#xff1a; 小控件&#xff1a; 二、项目结构 三、项目功能点 后端接口&#xff0c;使用node写的&#xff0c;使用了网易云音乐API&#xff1a; 封装的api文件 //env是基础地址js文件 im…

05 JDBC基础

什么是持久化 将内存中的数据永久保存在磁盘中,方便以后使用 JDBC是什么 java数据库连接 用于执行sql语句的java API java官方提供接口,各大厂商提供实现类,程序员使用实现类的jar包 JDBC的开发流程 添加包: mysql-connector-java-5.1.48.jar lombok.jar 口诀:贾连欲…

Linux文件内管理命令

目录 Linux文件内管理命令 创建文件 目录 普通文件 链接文件 删除文件 删除文件 删除目录 查看文件 目录 普通文件 编辑普通文件 在命令行进行文本内容处理 查找内容 复制文件 移动文件 命令详解 mkdir 作用 语法格式 touch 作用 语法格式 选项 ​编辑…

STM32——SDIO的学习(驱动SD卡)(理论篇)

目录 一、SD卡简介 1.1历史 1.2 tf卡和SD卡的区别 1.3 mmc&#xff0c;emmc&#xff0c;nand&#xff0c;flash的关系 1.4 SD卡的规格等级 1.4.1按容量分 1.4.2 class等级 1.4.3 UHS总线模式 1.4.4 UHS速度等级 1.4.5 VSC视频速度等级 二、SD卡的内部结构 三、SDIO…

MapReduce【Shuffle-Combiner】

概述 Conbiner在MapReduce的Shuffle阶段起作用&#xff0c;它负责局部数据的聚合&#xff0c;我们可以看到&#xff0c;对于大数据量&#xff0c;如果没有Combiner&#xff0c;将会在磁盘上写入多个文件等待ReduceTask来拉取&#xff0c;但是如果有Combiner组件&#xff0c;我们…

什么是Reactive服务架构

介绍&#xff1a; 在java web开发领域&#xff0c;区别于传统的的同步服务架构&#xff08;底层实现基于同步阻塞IO模型&#xff09;&#xff0c;异步服务这个“新词”&#xff08;bushi&#xff09;在不断被提及和重视&#xff0c;不少公司的研发部门也开始在尝试对自己的业务…

【JMM】并发编程Bug的源头——可见性/有序性/原子性问题

本文目录(&#xffe3;∇&#xffe3;)/ 可见性问题 有序性问题 为什么会进行指令重排序/乱序执行&#xff1f; 乱序存在的条件 this对象的溢出 原子性问题 如何保证原子性&#xff1f; synchronized 原理简介 加锁的方式 那么问题来了&#xff0c;JVM是如何知道当前…

2022年中国标准创新贡献奖获奖名单公示,海尔再添两项标准创新奖

01 2022年中国标准创新贡献奖 获奖名单公示 海尔再添两项标准创新奖 近日&#xff0c;2022年中国标准创新贡献奖获奖名单公示。其中&#xff0c;海尔GB/T 28219—2018《智能家用电器通用技术要求》、T/CAS 311.1—2018《电器电子产品绿色供应链管理第1部分&#xff1a;通则》…

前端实现拖拽效果改变元素顺序

文章目录 前言一、实现效果二、拖拽API1.代码2.遇见问题 总结 前言 在一次工作中&#xff0c;前端要实现通过鼠标实现拖拽改变顺序的功能&#xff0c;之前没有接触过拖拽这一块所以刚开始一筹莫展&#xff0c;幸运的是在查阅学习中实现了前端拖拽功能。 一、实现效果 二、拖拽…

月薪从10k到30k,一个普通测试工程师的3年涨薪之路...

“要涨薪&#xff0c;先跳槽”各个行业都存在这一共识&#xff0c;但是任何行业也都没有像程序员这样更为适用且好用的了。 前不久&#xff0c;就有网友分享了自己作为一个普通的自动化测试工程师的三年真实涨薪经历。但看看这个三年涨薪之路&#xff0c;好像并不普通啊&#…

2022年深圳杯数学建模D题复杂水平井三维轨道设计解题全过程文档及程序

2022年深圳杯数学建模 D题 复杂水平井三维轨道设计 原题再现&#xff1a; 在油气田开采过程中&#xff0c;井眼轨迹直接影响着整个钻井整体效率。对于复杂水平井&#xff0c;较差的井眼轨迹很可能会造成卡钻或施加钻压困难等重大事故的发生。因而&#xff0c;在施工之前分析影…

python爬虫-获取某某在线翻译的查询结果,爬取json文件并解析

文章目录 从基础步骤下手正确获取response数据关于url获取方式关于post方法的参数关于payload参数填入运行效果解析json数据到文件中完整代码运行结果 从基础步骤下手 # 指定url # 发出请求&#xff0c;get或post # 获取响应 # 把目标文件转存为字符串形式 # 持久性保存正确获…

从零开始的机械臂yolov5抓取gazebo仿真(六)

项目构造简述 前段时间博主装20.04系统不小心把efi启动给删了&#xff0c;导致18.04系统崩了&#xff0c;所以只能简单讲一下这个项目的设计思路以及以grasp.py代码为例进行简单解析。 yolov5_ros功能包 首先&#xff0c;说一下yolov5_ros功能包&#xff0c;该功能包的作用就…

使用 CameraX 在 Jetpack Compose 中构建相机 Android 应用程序

使用 CameraX 在 Jetpack Compose 中构建相机 Android 应用程序 CameraX 是一个 Jetpack 库&#xff0c;旨在帮助简化相机应用程序的开发。 [camerax官方文档] https://developer.android.com/training/camerax CameraX的几个用例&#xff1a; Image CaptureVideo CapturePrev…

【多线程】什么是线程死锁?形成条件是什么?如何避免?

文章目录 一、什么是线程死锁二、线程死锁三、形成死锁的四个必要条件是什么四、如何避免线程死锁 一、什么是线程死锁 死锁是指两个或两个以上的进程&#xff08;线程&#xff09;在执行过程中&#xff0c;由于竞争资源或者由于彼此通信而造成的一种阻塞的现象&#xff0c;若…

Unity 天空盒

在 Unity 中&#xff0c;天空盒是使用天空盒着色器的一种材质。 创建天空盒材质 1.从菜单栏中&#xff0c;单击 Assets > Create > Material。 2.在 Shader 下拉选单中&#xff0c;单击 Skybox&#xff0c;然后单击要使用的天空盒着色器。 有Skybox/6 Sided、Skybox/…

人民大学与加拿大女王金融硕士项目——在现在憧憬美好的未来

未来是一个虚无缥缈的词汇&#xff0c;抓不住也看不到。未来里有着我们无限的希望&#xff0c;也有着美好的憧憬。未来究竟是怎样的呢&#xff0c;有人说现在的样子里藏着未来的模样。在职的你有没有为未来编织一副美丽的画卷呢&#xff1f;未来很远&#xff0c;远到只能靠想象…