js控制文字溢出显示省略号
.text{display: -webkit-box;overflow: hidden;white-space: normal;text-overflow: ellipsis;word-wrap: break-word;-webkit-line-clamp: 2;-webkit-box-orient: vertical;
}
本人有个需求就是在一个盒子内有一段文本,然后控制文本显示两行,第二行要显示省略号,本人通过以上方式通过
css
解决了
但是有个问题,因为这个区域要被截图保存下来,本人使用html-to-image
插件去完成了截图操作,但就在这时,bug出现了,例如在真机上面显示省略号,但是在截图上面并没有省略号,而是完整的显示出了两行文字,可能由于这个文字大小在当前机型上面刚好溢出,但是没有达到截图的容器的溢出条件,就出现了一个尴尬的事情,截图没省略号,真机有,然后如果多补充点文字,截图虽然显示了省略号,但是省略号前面还是比真机多几个字,,,因此后面不考虑使用css来做了,改成js来做,具体步骤如下:
方式
下面提供了两种方式实现这个,主要是使用js可以解决很多问题,使用jQuery版本就不行,例如遇到uniapp这种标签皆为组件的就不行了,根本设置不了,因此像uniapp这种建议使用原生js判断
依赖于jQuery
- 方式一(静态内容非常推荐)
- 好处
- 适用于内容固定的情况,直接在页面写死换行的就行
- 坏处
- 依赖于
jquery
和jQuery.ellipsis
两个插件,需要引入一下 - 不适用于内容动态变化情况
- 依赖于
- 好处
- 方式二(动态内容非常推荐)
- 好处
- 适用于页面内容动态变换的情况
- 坏处
- 依赖于
jquery
和jQuery.ellipsis
两个插件,需要引入一下 - 需要几行就要判断几行文字
- 依赖于
- 好处
直接使用原生js
处理
- 方式一(动态内容比较推荐)
- 好处
- 适用于页面内容动态变换的情况
- 不依赖于
jquery
和jQuery.ellipsis
两个插件
- 坏处
- 行数较多的情况,需要一个一个判断
- 除了上述
jquery
方式二的(需要几行就要判断几行文字)以外,还要判断是否满行显示省略号等(不想判断可以使用jquery
的方式二,这个内部已经判断好了)
- 好处
- 方式二(静态内容比较推荐)
- 好处
- 适用于内容固定的情况,直接写死就行
- 不依赖于
jquery
和jQuery.ellipsis
两个插件
- 坏处
- 行数较多的情况,需要一个一个判断
- 好处
依赖于jQuery
使用jQuery
和jQuery.ellipsis.js
来解决
jQuery
的代码各位可以百度,这里提供一个CDN地址: https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js
jQuery.ellipsis.js
代码如下:
/*!* jQuery.ellipsis* https://github.com/jjenzz/jquery.ellipsis* --------------------------------------------------------------------------* Copyright (c) 2013 J. Smith (@jjenzz)* Dual licensed under the MIT and GPL licenses:* https://www.opensource.org/licenses/mit-license.php* http://www.gnu.org/licenses/gpl.html** adds a class to the last 'allowed' line of text so you can apply* text-overflow: ellipsis;*/
(function (a) { if (typeof define === "function" && define.amd) { define(["jquery"], a) } else { a(jQuery) } }(function (d) { var c = "ellipsis", b = '<span style="white-space: nowrap;">', e = { lines: "auto", ellipClass: "ellip", responsive: false }; function a(h, q) { var m = this, w = 0, g = [], k, p, i, f, j, n, s; m.$cont = d(h); m.opts = d.extend({}, e, q); function o() { m.text = m.$cont.text(); m.opts.ellipLineClass = m.opts.ellipClass + "-line"; m.$el = d('<span class="' + m.opts.ellipClass + '" />'); m.$el.text(m.text); m.$cont.empty().append(m.$el); t() } function t() { if (typeof m.opts.lines === "number" && m.opts.lines < 2) { m.$el.addClass(m.opts.ellipLineClass); return } n = m.$cont.height(); if (m.opts.lines === "auto" && m.$el.prop("scrollHeight") <= n) { return } if (!k) { return } s = d.trim(m.text).split(/\s+/); m.$el.html(b + s.join("</span> " + b) + "</span>"); m.$el.find("span").each(k); if (p != null) { u(p) } } function u(x) { s[x] = '<span class="' + m.opts.ellipLineClass + '">' + s[x]; s.push("</span>"); m.$el.html(s.join(" ")) } if (m.opts.lines === "auto") { var r = function (y, A) { var x = d(A), z = x.position().top; j = j || x.height(); if (z === f) { g[w].push(x) } else { f = z; w += 1; g[w] = [x] } if (z + j > n) { p = y - g[w - 1].length; return false } }; k = r } if (typeof m.opts.lines === "number" && m.opts.lines > 1) { var l = function (y, A) { var x = d(A), z = x.position().top; if (z !== f) { f = z; w += 1 } if (w === m.opts.lines) { p = y; return false } }; k = l } if (m.opts.responsive) { var v = function () { g = []; w = 0; f = null; p = null; m.$el.html(m.text); clearTimeout(i); i = setTimeout(t, 100) }; d(window).on("resize." + c, v) } o() } d.fn[c] = function (f) { return this.each(function () { try { d(this).data(c, (new a(this, f))) } catch (g) { if (window.console) { console.error(c + ": " + g) } } }) } }));
引入到页面使用
方式一(固定内容推荐,非动态内容不推荐)
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script><script src="./jQuery.ellipsis.js"></script><style>.aaa,.aaa2 {background: #eee;border: 1px solid #ccc;width: 130px;margin-left: 200px;}.aaa2{margin-top: 50px;}/* 下面这三个css不能删,否则不起作用了 */.ellip {display: block;height: 100%;}.ellip-line {display: inline-block;text-overflow: ellipsis;white-space: nowrap;word-wrap: normal;}.ellip,.ellip-line {position: relative;overflow: hidden;max-width: 100%;}</style>
</head><body><div class="aaa">你哈哈哈哈哈哈啊哈哈哈哈哈哈哈颇大开发跑我就发很日入好闺女诶欧哈你噶IEUR个</div><div class="aaa2">你哈哈哈哈哈哈啊 哈哈哈哈哈哈哈颇大开发跑我就发很日入好闺女诶欧哈你噶IEUR个</div><script>$('.aaa').ellipsis({ lines: 2 }); // 控制第二行溢出显示省略号$('.aaa2').ellipsis({ lines: 2 }); // // 控制第二行溢出显示省略号</script>
</body></html>
上面内容可以看到,需要换行的部分必须手动在html里面加换行或者
,因此这种方式适合静态的,不适用于动态的,可以看下面这个
方式二(动态内容推荐)
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script><script src="./jQuery.ellipsis.js"></script><style>.aaa {background: #eee;border: 1px solid #ccc;width: 150px;}/* 下面这三个css不能删,否则不起作用了 */.ellip {display: block;height: 100%;}.ellip-line {display: inline-block;text-overflow: ellipsis;white-space: nowrap;word-wrap: normal;}.ellip,.ellip-line {position: relative;overflow: hidden;max-width: 100%;}</style>
</head><body><div class="aaa">abababababa我还得覅维护诶哈哈哈哈哈哈颇大开发跑我就发很日入好闺女诶欧哈你噶IEUR个</div><script>function getTextWidth(text, font) {// 计算字符串的宽// 创建临时canvas元素var canvas = document.createElement("canvas");var context = canvas.getContext("2d");context.font = font;return context.measureText(text).width;}let aaa = document.querySelector('.aaa'); // 获取容器let aaawidth = aaa.clientWidth; // 拿到容器的宽度let text = aaa.innerText;let font = getComputedStyle(aaa).font; // 获取元素的实际字体样式(为了算文字大小,这个跟字符串的宽有影响,如果容器上面加了字体,这里同样会返回这个字体,可以打印font查看,也就是说,这个方法兼容带字体的情况)let textWidth = getTextWidth(text, font); // 计算字符串的宽度console.log(aaawidth,textWidth); // 容器的宽和字符串的宽度let textarr = text.split('') // 将字符串分割成数组进行遍历let start_str = '' // 第一行的文字内容let end_str = '' // 第二行的文字内容(还可以加其他更多的行,只需要在下面多几个判断就好)let linshistr = '' // 临时存储用于计算的字符串textarr.forEach((item)=>{linshistr += item // 每次循环都让临时字符串累加// 下面如果有第二行第三行的话直接判断 > n*aaawidth 即可if(getTextWidth(linshistr, font) > aaawidth){// 如果小于容器容器宽度,让第一行的字符串进行累加end_str += item }else{// 如果超出容器,都是在第二行,直接让第二行元素累加start_str+= item}})console.log(start_str, end_str); // 获取第一行和第二行元素内容aaa.innerHTML = start_str + ' ' + end_str // 加个 可以换行,就像方式一写死的一样$('.aaa').ellipsis({ lines: 2 }); // 再去使用jQuery.ellipsis.js的ellipsis方法让第二行显示省略号</script>
</body></html>
直接使用js
方式一(动态内容推荐)
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.aaa {background: #eee;border: 1px solid #ccc;width: 154px;}</style>
</head><body><div class="aaa"><div class="son"></div><div class="son2"></div></div><script>// let str = 'a我还得覅维护诶好啊' // 获取文本内容(一行满的情况)// let str = 'a我还得覅维护诶' // 获取文本内容(一行不满的情况)// let str = 'a我还得覅维护诶哈哈哈哈i和ID号次我深有感触' // 获取文本内容(两行满的情况)// let str = 'a我还得覅维护诶哈哈哈你好啊我爱你' // 获取文本内容(两行不满的情况)function getTextWidth(text, font) {// 计算文本字符串的宽// 创建临时canvas元素var canvas = document.createElement("canvas");var context = canvas.getContext("2d");context.font = font;return context.measureText(text).width;}// 获取元素实际的容器let aaa = document.querySelector('.aaa');let aaawidth = aaa.clientWidth; // 获取容器宽度let font = getComputedStyle(aaa).font; // 获取元素的实际字体样式,(为了算文字大小,这个跟字符串的宽有影响,会返回字体的大小和字体名称,如果是固定的话也可以直接写死,这个是从容器上面获取的字体大小和字体名称)let textWidth = getTextWidth(str, font); // // 计算字符串的宽度console.log(aaawidth, textWidth); // // 容器的宽和字符串的宽度let textarr = str.split('') // 将字符串分割成数组进行遍历let start_str = '' // 第一行的文字内容let end_str = '' // 第二行的文字内容(还可以加其他更多的行,只需要在下面多几个判断就好)let linshistr = '' // 临时存储用于计算的字符串textarr.forEach((item) => {linshistr += item// 第一行的判断if (getTextWidth(linshistr, font) < aaawidth) {start_str += item}// 第二行的判断if (getTextWidth(linshistr, font) > aaawidth && getTextWidth(linshistr, font) < 2 * aaawidth) {end_str += item}// 第n行的判断// if (getTextWidth(linshistr, font) > ( n - 1 ) * aaawidth &&getTextWidth(linshistr, font) > n * aaawidth) {}})console.log(start_str, end_str); // 输出第一行和第二行的文字内容// 如果第二行不存在,就只显示一行// 这里需要判断是否占满容器(这里我判断容器宽度减去10像素如果小于文字宽度大小就加省略号,否则原样输出,这里的10大家可以根据项目自行改)if (end_str == '') {document.querySelector('.son').innerHTML = aaawidth - 10 < getTextWidth(start_str, font) ? start_str.substring(0, start_str.length - 1) + '...' : start_str;} else {// 第二行存在,则第一行肯定会存在document.querySelector('.son').innerHTML = start_strdocument.querySelector('.son2').innerHTML = aaawidth - 10 < getTextWidth(end_str, font) ? end_str.substring(0, end_str.length - 1) + '...' : end_str;}</script>
</body></html>
方式二(固定内容推荐,非动态内容不推荐)
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.aaa {background: #eee;border: 1px solid #ccc;width: 154px;}</style>
</head>
<body><div class="aaa"><div class="son"></div><div class="son2"></div></div><script>let aaa = document.querySelector('.aaa');let son = document.querySelector('.son');let son2 = document.querySelector('.son2');let str = 'a我还得覅维护诶ha'// 这种方式比较暴力,直接截取字符串(适用于静态内容)if (str.length < 10) {son.innerHTML = str.substring(0, 10)}else if(str.length == 10){son.innerHTML = str.substring(0, 10)+'...'}else if(str.length > 10&&str.length < 20){son.innerHTML = str.substring(0, 10)son2.innerHTML = str.substring(10,20)}else if(str.length >= 20){son.innerHTML = str.substring(0, 10)son2.innerHTML = str.substring(10,20)+'...'}</script>
</body>
</html>
相关文章:
js控制文字溢出显示省略号
.text{display: -webkit-box;overflow: hidden;white-space: normal;text-overflow: ellipsis;word-wrap: break-word;-webkit-line-clamp: 2;-webkit-box-orient: vertical; }本人有个需求就是在一个盒子内有一段文本,然后控制文本显示两行,第二行要显示…...

WPF+MVVM案例实战与特效(四十七)-实现一个路径绘图的自定义按钮控件
文章目录 1、案例效果2、创建自定义 PathButton 控件1、定义 PathButton 类2、设计样式与控件模板3、代码解释3、控件使用4、直接在 XAML 中绑定命令3、源代码获取4、总结1、案例效果 2、创建自定义 PathButton 控件 1、定义 PathButton 类 首先,我们需要创建一个新的类 Pat…...

操作002:HelloWorld
文章目录 操作002:HelloWorld一、目标二、具体操作1、创建Java工程①消息发送端(生产者)②消息接收端(消费者)③添加依赖 2、发送消息①Java代码②查看效果 3、接收消息①Java代码②控制台打印③查看后台管理界面 操作…...
odoo中@api.model, @api.depends和@api.onchange 装饰器的区别
文章目录 1. api.model用途特点示例 2. api.depends用途特点示例 3. api.onchange用途特点示例 总结 在 Odoo 中,装饰器(decorators)用于修饰方法,以指定它们的行为和触发条件。api.model、api.depends 和 api.onchange 是三个常用…...

有哪些精益工具可以帮助企业实现转型?
为了在激烈的市场竞争中立于不败之地,许多企业开始寻求通过精益转型来优化运营、降低成本、提高效率和客户满意度。然而,精益转型并非一蹴而就,而是需要一系列精益工具的辅助,这些工具能够帮助企业识别浪费、优化流程、提升质量&a…...

以太网帧结构
以太网帧结构 目前,我们局域网当中应用最广的技术或者协议啊,就是以太网。我们首先来看一下以太网的真结构。这块内容这里边再系统的来给大家去展开说一下,以太网真格式就如下面这个图。所示前面有八个字节,是用于时钟同步的&…...

QT调用Sqlite数据库
QT设计UI界面,后台访问数据库,实现数据库数据的增删改查。 零售商店系统 数据库表: 分别是顾客表,订单详情表,订单表,商品表 表内字段详情如下: 在QT的Pro文件中添加sql,然后添加头…...

前端
前端页面 Web页面 PC端程序页面 移动端APP页面 ... HTML页面 HTML超文本标记页面 超文本:文本,声音,图片,视频,表格,链接 标记:由许多标签组成 HTML页面运行到浏览器上面 vscode便捷插件使用 vs…...

【Git】—— 使用git操作远程仓库(gitee)
目录 一、远程仓库常用命令 1、从远程仓库克隆项目 2、查看关联的远程仓库 3、添加关联的远程仓库 4、移除关联的远程仓库 5、将本地仓库推送到远程仓库 6、从远程仓库拉取项目 二、分支命令 1、查询分支 2、创建分支 3、切换分支 4、推送到远程分支 5、合并分支 …...
Paddler负载均衡器
Paddler负载均衡器 Paddler本身是用Go语言编写的,没有直接的Python接口,但可以通过以下方式在Python中使用: 执行命令行调用 在Python中可以使用 subprocess 模块来调用Paddler的命令行工具,实现负载均衡功能 。例如: import subprocessdef start_paddler_agent():com…...

OSCP - Proving Grounds - Slort
主要知识点 文件包含 windows的reveseshell 具体步骤 执行nmap,依旧是很多端口开放,尝试了ftp,smb等均失败 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-13 12:00 UTC Nmap scan report for 192.168.53.53 Host is up (0.00095s latency). Not sho…...
YoloV9改进策略:Head改进|DynamicHead,利用注意力机制统一目标检测头部|即插即用
摘要 论文介绍 本文介绍了一种名为DynamicHead的模块,该模块旨在通过注意力机制统一目标检测头部,以提升目标检测的性能。论文详细阐述了DynamicHead的工作原理,并通过实验证明了其在COCO基准测试上的有效性和效率。 创新点 DynamicHead模块的创新之处在于它首次尝试在一…...

BFD综合详细实验配置案例
前言 本实验的目的是通过配置BGP(边界网关协议)、OSPF(开放式最短路径优先协议)、VRRP(虚拟路由冗余协议)以及BFD(双向转发检测)等网络协议,模拟企业级网络环境中的多协…...

自然语言处理与知识图谱的融合与应用
目录 前言1. 知识图谱与自然语言处理的关系1.1 知识图谱的定义与特点1.2 自然语言处理的核心任务1.3 二者的互补性 2. NLP在知识图谱构建中的应用2.1 信息抽取2.1.1 实体识别2.1.2 关系抽取2.1.3 属性抽取 2.2 知识融合2.3 知识推理 3. NLP与知识图谱融合的实际应用3.1 智能问答…...

c# RSA加解密工具,.netRSA加解密工具
软件介绍 名称: c# RSA加解密工具,.netRSA加解密工具依赖.net版本: .net 8.0工具类型: WinForm源码下载 c# RSA加解密工具,.netRSA加解密工具 依赖项 WinFormsRSA.csproj <Project...
Metricbeat安装教程——Linux——Metricbeat监控ES集群
Metricbeat安装教程——Linux 一、安装 下载安装包: 官网下载地址:https://www.elastic.co/cn/downloads/beats/metricbeat 上传包到linux 切换到安装目录下 解压:tar -zxvf metricbeat-7.17.1-linux-x86_64.tar.gz 重命名安装文件夹 mv met…...
一万多字拆解java中——“ 注解 ”的一切(三)(已完结)
前言: 咱们书接上回,上次按照框架讲了 第一篇,我们讲到了: ①注解的引入(简单概述):在jdk5.0的时候 ②注解与注释的区别: 注释 是为了帮助人类阅读代码,不会对程序的执…...

记一次rac故障原因分析(虚拟化平台)
一 现象描述 XX客户于1月14号凌晨业务中断,检查数据库发现数据库集群宕机。 XX客户于2月14号春节初五早上业务异常,连接数据库无响应。 二 问题详细诊断 1月14号故障 1月14号凌晨2点,客户反馈业务中断,发现节点1无法连接&…...

Vue CLI 3 项目构建
Vue CLI 是一个功能强大、易于使用的工具,可以极大地简化 Vue.js 应用的开发过程。通过快速创建项目、灵活的插件系统和丰富的配置选项,开发者可以更专注于业务逻辑,而不是底层配置。无论是新手还是经验丰富的开发者,Vue CLI 都是…...
1114 Family Property (25)
This time, you are supposed to help us collect the data for family-owned property. Given each persons family members, and the estate(房产)info under his/her own name, we need to know the size of each family, and the average area and n…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...