当前位置: 首页 > news >正文

js实现文本内容过长中间显示...两端正常展示

实现效果

在这里插入图片描述

实现思路

  1. 获取标题盒子的真实宽度, 我这里用的是clientWidth;
  2. 获取文本内容所占的实际宽度;
  3. 根据文字的大小计算出每个文字所占的宽度;
  4. 判断文本内容的实际宽度是否超出了标题盒子的宽度;
  5. 通过文字所占的宽度累加之和与标题盒子的宽度做对比,计算出要截取位置的索引;
  6. 同理,文本尾部的内容需要翻转一下,然后计算索引,截取完之后再翻转回来

代码

<div class="title" id="test">开头,这里是中间内容中间内容中间内容中间内容中间内容中间内容中间内容中间内容中间内容中间内容中间内容中间内容中间内容中间内容,结尾。</div>

css代码: 设置文本不换行,同时设置overflow:hidden让文本溢出盒子隐藏

.title {width: 640px;height: 40px;line-height: 40px;font-size: 14px;color: #00b388;border: 1px solid #ddd;overflow: hidden;/* text-overflow: ellipsis; */white-space: nowrap;/* box-sizing: border-box; */padding: 0 10px;
}

javascript代码:获取标题盒子的宽度时要注意,如果在css样式代码中设置了padding, 就需要获取标题盒子的左右padding值。 通过getComputedStyle属性获取到所有的css样式属性对应的值, 由于获取的padding值都是带具体像素单位的,比如: px,可以用parseInt特殊处理一下。

判断文本内容是否超出标题盒子

 // 标题盒子dom
const dom = document.getElementById('test');// 获取dom元素的padding值
function getPadding(el) {const domCss = window.getComputedStyle(el, null);const pl = Number.parseInt(domCss.paddingLeft, 10) || 0;const pr = Number.parseInt(domCss.paddingRight, 10) || 0;console.log('padding-left:', pl, 'padding-right:', pr);return {left: pl,right: pr}
}
// 检测dom元素的宽度,
function checkLength(dom) {// 创建一个 Range 对象const range = document.createRange();// 设置选中文本的起始和结束位置range.setStart(dom, 0),range.setEnd(dom, dom.childNodes.length);// 获取元素在文档中的位置和大小信息,这里直接获取的元素的宽度let rangeWidth = range.getBoundingClientRect().width;// 获取的宽度一般都会有多位小数点,判断如果小于0.001的就直接舍掉const offsetWidth = rangeWidth - Math.floor(rangeWidth);if (offsetWidth < 0.001) {rangeWidth = Math.floor(rangeWidth);}// 获取元素padding值const { left, right } = getPadding(dom);const paddingWidth = left + right;// status:文本内容是否超出标题盒子;// width: 标题盒子真实能够容纳文本内容的宽度return {status: paddingWidth + rangeWidth > dom.clientWidth,width: dom.clientWidth - paddingWidth};
}

通过charCodeAt返回指定位置的字符的Unicode编码, 返回的值对应ASCII码表对应的值,0-127包含了常用的英文、数字、符号等,这些都是占一个字节长度的字符,而大于127的为占两个字节长度的字符。

截取和计算文本长度

// 计算文本长度,当长度之和大于等于dom元素的宽度后,返回当前文字所在的索引,截取时会用到。
function calcTextLength(text, width) {let realLength = 0;let index = 0;for (let i = 0; i < text.length; i++) {charCode = text.charCodeAt(i);if (charCode >= 0 && charCode <= 128) {realLength += 1;} else {realLength += 2 * 14; // 14是字体大小}// 判断长度,为true时终止循环,记录索引并返回if (realLength >= width) {index = i;break;}}return index;
}// 设置文本内容
function setTextContent(text) {const { status, width } = checkLength(dom);let str = '';if (status) {// 翻转文本let reverseStr = text.split('').reverse().join('');// 计算左右两边文本要截取的字符索引const leftTextIndex = calcTextLength(text, width);const rightTextIndex = calcTextLength(reverseStr, width);// 将右侧字符先截取,后翻转reverseStr = reverseStr.substring(0, rightTextIndex);reverseStr = reverseStr.split('').reverse().join('');// 字符拼接str = `${text.substring(0, leftTextIndex)}...${reverseStr}`;} else {str = text;}dom.innerHTML = str;
}

相关知识

js判断文字被溢出隐藏的几种方法

  1. 通过document.createRange和document.getBoundingClientRect()这两个方法实现的。也就是上面代码中实现的checkLength方法。
  2. 创建一个隐藏的div模拟实际宽度

通过创建一个不会在页面显示出来的dom元素,然后把文本内容设置进去,真实的文本长度与标题盒子比较宽度,判断是否被溢出隐藏了。

function getDomDivWidth(dom) {const elementWidth = dom.clientWidth;const tempElement = document.createElement('div');const style = window.getComputedStyle(dom, null)const { left, right } = getPadding(dom); // 这里我写的有点重复了,可以优化tempElement.style.cssText = `position: absolute;top: -9999px;left: -9999px;white-space: nowrap;padding-left:${style.paddingLeft};padding-right:${style.paddingRight};font-size: ${style.fontSize};font-family: ${style.fontFamily};font-weight: ${style.fontWeight};letter-spacing: ${style.letterSpacing};`;tempElement.textContent = dom.textContent;document.body.appendChild(tempElement);const obj = {status: tempElement.clientWidth + right + left > elementWidth,width: elementWidth - left - right}document.body.removeChild(tempElement);return obj;
}
  1. 创建一个block元素来包裹inline元素

外层套一个块级(block)元素,内部是一个行内(inline)元素。给外层元素设置溢出隐藏的样式属性,不对内层元素做处理,这样内层元素的宽度是不变的。因此,通过获取内层元素的宽度和外层元素的宽度作比较,就可以判断出文本是否被溢出隐藏了。

// html代码
<div class="title" id="test"><span class="content">近日,银行纷纷下调大额存单利率,但银行定期存款仍被疯抢。银行理财经理表示:有意向购买定期存款要尽快,不确定利率是否会再降。</span>
</div>// 创建一个block元素来包裹inline元素
const content = document.querySelector('.content');
function getBlockDomWidth(dom) {const { left, right } = getPadding(dom);console.log(dom.clientWidth, content.clientWidth)const obj = { status: dom.clientWidth < content.clientWidth + left + right,width: dom.clientWidth - left - right}return obj;
}
  1. 使用canvas中的measureText方法和TextMetrics对象来获取元素的高度

通过Canvas 2D渲染上下文(context)可以调用measureText方法,此方法会返回TextMetrics对象,该对象的width属性值就是字符占据的宽度,由此也能获取到文本的真实宽度,此方法有弊端,比如说兼容性,精确度等等。

// 获取文本长度
function getTextWidth(text, font = 14) {const canvas = document.createElement("canvas");const context = canvas.getContext("2d")context.font = fontconst metrics = context.measureText(text);return metrics.width
}

JS获取字符串长度的几种常用方法

  1. 通过charCodeAt判断字符编码

通过charCodeAt获取指定位置字符的Unicode编码,返回的值对应ASCII码表对应的值,0-127包含了常用的英文、数字、符号等,这些都是占一个字节长度的字符,而大于127的为占两个字节长度的字符。

function calcTextLength(text) {let realLength = 0;for (let i = 0; i < text.length; i++) {charCode = text.charCodeAt(i);if (charCode >= 0 && charCode <= 128) {realLength += 1;} else {realLength += 2;}}return realLength;
}
  1. 采取将双字节字符替换成"aa"的做法,取长度
function getTextWidth(text) {return text.replace(/[^\x00-\xff]/g,"aa").length;
};

相关文章:

js实现文本内容过长中间显示...两端正常展示

实现效果 实现思路 获取标题盒子的真实宽度, 我这里用的是clientWidth&#xff1b;获取文本内容所占的实际宽度&#xff1b;根据文字的大小计算出每个文字所占的宽度&#xff1b;判断文本内容的实际宽度是否超出了标题盒子的宽度&#xff1b;通过文字所占的宽度累加之和与标题…...

Buran勒索病毒通过Microsoft Excel Web查询文件进行传播

Buran勒索病毒首次出现在2019年5月&#xff0c;是一款新型的基于RaaS模式进行传播的新型勒索病毒&#xff0c;在一个著名的俄罗斯论坛中进行销售&#xff0c;与其他基于RaaS勒索病毒(如GandCrab)获得30%-40%的收入不同&#xff0c;Buran勒索病毒的作者仅占感染产生的25%的收入,…...

中间件 | Redis - [基本信息]

INDEX 1 常规用法2 QPS3 pipeline 1 常规用法 分布式锁 最常见用法&#xff0c;需要注意分布式锁的redis需要单点 分布式事务 分布式事务中&#xff0c;核心的技术难点其实是分布式事务这个事本身作为数据的持久化 2PC&#xff0c;比如 seata 的 AT 模式下&#xff0c;将 un…...

【Docker】Neo4j 容器化部署

Neo4j环境标准软件基于Bitnami neo4j 构建。当前版本为5.17.0 你可以通过轻云UC部署工具直接安装部署&#xff0c;也可以手动按如下文档操作&#xff0c;该项目已经全面开源&#xff0c;可以从如下环境获取 配置文件地址: https://gitee.com/qingplus/qingcloud-platform Qin…...

Visual studio编译器报1个无法解析的外部命令

解决思路&#xff1a;&#xff08;以下思路需对照代码进行逐点分析&#xff09; ①&#xff1a;代码里函数有声明&#xff0c;但是没有定义 &#xff08;初学者错这个比较多&#xff09; ②&#xff1a;类中有静态变量成员&#xff0c;没有对它进行初始化&#xff08;是变量&…...

微信小程序(五十三)修改用户头像与昵称

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.外界面个人资料基本模块 2.资料修改界面同步问题实现&#xff08;细节挺多&#xff0c;考虑了后期转服务器端的方便之处&#xff09; 源码&#xff1a; app.json {"window": {},"usingCompone…...

VUE3 显示Echarts百度地图

本次实现最终效果 技术基础以及环境要求 vue3 echarts 百度地图API 要求1&#xff1a; VUE3 环境搭建&#xff1a;https://blog.csdn.net/LQ_001/article/details/136293795 要求2&#xff1a; VUE3 echatrs 环境搭建:https://blog.csdn.net/LQ_001/article/details/1363…...

FFmpeg将视频包AVPacket通过视频流方式写入本地文件

1.写视频头 void writeVideoHeader(const char* videoFileName){int r avformat_alloc_output_context2(&pFormatCtx, nullptr, nullptr,videoFileName);if(r < 0){qDebug()<<"Error: avformat_alloc_output_context2: "<<av_err2str(r);return;…...

C语言连接【MySQL】

稍等更新图片。。。。 文章目录 安装 MySQL 库连接 MySQLMYSQL 类创建 MySQL 对象连接数据库关闭数据库连接示例 发送命令设置编码格式插入、删除或修改记录查询记录示例 参考资料 安装 MySQL 库 在 CentOS7 下&#xff0c;使用命令安装 MySQL&#xff1a; yum install mysq…...

_note_09

1.说一说类加载的过程 加载&#xff08;Loading&#xff09; -> 验证&#xff08;Verification&#xff09; -> 准备&#xff08;Preparation&#xff09; -> 解析&#xff08;Resolution&#xff09; -> 初始化&#xff08;Initialization&#xff09;类的加载是…...

是否可以在HTTP中缓存POST方法

如果您想知道是否可以缓存post请求&#xff0c;并尝试研究该问题的答案&#xff0c;那么您很可能不会成功。当搜索“缓存post请求”时&#xff0c;第一个结果是这个StackOverflow问题。 答案是令人困惑的&#xff0c;包括缓存应该如何工作&#xff0c;缓存如何根据RFC工作&…...

Xilinx 7系列FPGA配置(ug470)

Xilinx 7系列FPGA配置&#xff08;ug470&#xff09; 配置模式串行配置模式接口从-连接方式主-连接方式串行菊花链&#xff08;非同时配置&#xff09;串行配置&#xff08;同时配置&#xff09;时序 主SPI配置模式SPIx1/x2 连接图SPIx1模式时序SPIx4 连接图SPI操作指令操作fla…...

3分钟开通GPT-4

AI从前年12月份到现在已经伴随我们一年多了&#xff0c;还有很多小伙伴不会开通&#xff0c;其实开通很简单&#xff0c;环境需要自己搞定&#xff0c;升级的话就需要一张visa卡&#xff0c;办理visa卡就可以直接升级chatgptPLSU 一、虚拟卡支付 这种方式的优点是操作简单&…...

Easticsearch性能优化之索引优化

Easticsearch性能优化之索引优化 一、合理的索引设计二、合理的分片和副本三、合理的索引设置 对于性能优化&#xff0c;Elasticsearch&#xff08;以下简称ES&#xff09;的索引优化是提高性能的关键因素之一。合理的设计索引&#xff0c;合理的分片和副本以及合理的缓存设置等…...

安装mysql-8.0.30-winx64(windows 64位)

1.下载 1.1下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/ 2 .下载后解压缩目标文件 2.1之后在根目录下新建my.ini文件,并创建文件夹data &#xff08;新解压的文件没有my.ini文件&#xff0c;需自行创建 复制以下代码到my.ini文件 以下代码除安装目录和数据的…...

ios xcode 15 PrivacyInfo.xcprivacy 隐私清单

1.需要升级mac os系统到13 兼容 xcode 15.1 2.升级mac os系统到14 兼容 xcode 15.3 3.选择 New File 4.直接搜索 privacy 能看到有个App Privacy 5.右击Add Row 7.直接选 Label Types 8.选中继续添加就能添加你的隐私清单了 苹果官网文档Describing data use in privacy man…...

【物联网】-智能社会的分类

万物感知 感知物理世界&#xff0c;变成数字信号 &#xff08;温度、空间、触觉、嗅觉、听觉、视觉&#xff09; 万物互联 将数据变成online&#xff0c;使智能化 &#xff08;宽联接、广联接、多联接和深联接&#xff09; 万物智能 基于大数据和人工智能的应用 &#…...

Django高级之-cookie-session-token

Django高级之-cookie-session-token 发展史 1、很久很久以前&#xff0c;Web 基本上就是文档的浏览而已&#xff0c; 既然是浏览&#xff0c;作为服务器&#xff0c; 不需要记录谁在某一段时间里都浏览了什么文档&#xff0c;每次请求都是一个新的HTTP协议&#xff0c; 就是请…...

【Prometheus】k8s集群部署node-exporter

​ 目录 一、概述 1.1 prometheus简介 1.2 prometheus架构图 1.3 Exporter介绍 1.4 监控指标 1.5 参数定义 1.6 默认启用的参数 1.7 prometheus如何收集k8s/服务的–三种方式收集 二、安装node-exporter组件 【Prometheus】概念和工作原理介绍-CSDN博客 【云原生】ku…...

2024年k8s最新版本安装教程

k8s安装教程 1 k8s介绍2 环境搭建2.1 主机准备2.2 主机初始化2.2.1 安装wget2.2.2 更换yum源2.2.3 常用软件安装2.2.4 关闭防火墙2.2.5 关闭selinux2.2.6 关闭 swap2.2.7 同步时间2.2.8 修改Linux内核参数2.2.9 配置ipvs功能 2.3 容器安装2.3.1 设置软件yum源2.3.2 安装docker软…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...

深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙

WebGL&#xff1a;在浏览器中解锁3D世界的魔法钥匙 引言&#xff1a;网页的边界正在消失 在数字化浪潮的推动下&#xff0c;网页早已不再是静态信息的展示窗口。如今&#xff0c;我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室&#xff0c;甚至沉浸式的V…...

如何做好一份技术文档?从规划到实践的完整指南

如何做好一份技术文档&#xff1f;从规划到实践的完整指南 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…...