之前遇见一个问题,就是处理文本截断,然后可以手动切换文本是全展示和手动展示,因为这个问题比较常见,而且其实现方式有多种,于是决定总结一下,与读者分享。

前言

首先,我们看这样一个场景:

展开更多

其html 结构如下:

<p class="text-slice">郑成月的经历就是一部中国社会历史!很有价值的!不管是社会研究还是真心纠错,都是非常好的案例。历史就是用各种个人经历写成的,那样就很有实在感。作家们没有素材?都在书写歌功颂德之文?想要把自己的作品流传后世,这就是最好的素材</p><label class="expand-more">更多</label>复制代码

样式如下:

.text-slice {display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 3;overflow: hidden;text-overflow: ellipsis;}复制代码

如图,我们对文字默认展示内容有限制:限制默认最多显示三行,未超出三行时不需要展示更多按钮;超出内容被截断时,可以点击更多,展示全部内容,此时更多文字变成取消,再次点击的时候文字收起。

实现上述功能,常见的是使用JavaScript,本文将介绍使用JavaScript和CSS共三种方式实现:

  • Js实现
  • CSS :target伪类 实现
  • CSS :checked伪类 + ~(临近兄弟节点选择符)实现

Js实现

先从最常见的Js实现,通常我们绑定点击事件实现切换文本截断与展示全部:

点击查看效果

<script>$(function() {var $para = $('.content');var $more = $('.expand-more');$more.on('click', function() {$para.toggleClass('text-slice');if ($para.hasClass('text-slice')) {$more.html('更多');} else {$more.html('收起');}});});</script>复制代码

如上,给按钮绑定点击事件,在事件回调中为文本切换实现截断样式的类名,并同时修改按钮文字,很简单。

但是,到目前为止我们应该发现一个问题吧,假如文本内容少于三行或者刚好三行,我们怎么判断是否需要展示切换按钮呢?

思考。。。。。。

要判断文本是否发生截断,怎么处理呢?
计算字数肯定不可行,因为涉及到不同手机,不同浏览器,不同字符,会有差异;
计算高度,比较展示全部和添加截断时的高度值是否相等,相等时,说明不会截断;不相等则说明发生截断。

判断文本是否截断

我们不能直接使用该段落元素做判断,用户体验很不好,我们可以添加一个辅助段落元素:

<p class="fake-content text-slice">郑成月的经历就是一部中国社会历史!很有价值的!不管是社会研究还是真心纠错,都是非常好的案例。历史就是用各种个人经历写成的,那样就很有实在感。作家们没有素材?都在书写歌功颂德之文?想要把自己的作品流传后世,这就是最好的素材</p>复制代码

样式如下:

.fake-content {position: absolute;z-index: -1; /* 隐藏 */opacity: 0; /* 透明 */pointer-events: none; /*元素不可交互/点击*/}复制代码

然后比较此元素在设置截断样式和不设置截断样式时高度,相等即不会发生截断,不相等即发生截断:

// 文本是否发生截断function hasTextSliced($ele) {var initHeight = $ele.height();var height;$ele.removeClass('text-slice'); // 删除截断样式height = $ele.height();if (initHeight < height) {// 发生截断return true;}return false;}复制代码

如上,在删除截断样式后,若高度变大,则说明发生文本截断,否则不发生截断。

CSS实现

CSS可以有两种方式实现:

  • :target伪类 实现
  • :checked伪类 + ~(临近兄弟节点选择符)实现

点击查看实例

:target伪类

我们知道HTML中,a链接可以设置锚点,点击后该锚点可以使用:target伪类选择获取,于是可以为其设置文字不截断样式:

#content:target {overflow: auto;display: block;}复制代码

其html结构如下:

<p class="content text-slice" id="content">...        </p><p class="fake-content text-slice">...</p><a class="expand-more" href="#content">更多</a>复制代码

:checked伪类 + ~选择符

此种方式原理是,选择框可以使用CSS伪类:checked获取,然后通过~选择符給元素设置样式不截断文本:

#expand-check:checked ~ .content {overflow: auto;display: block;}复制代码

html结构如:

<input type="checkbox" id="expand-check" style="display: none;pointer-events: none;"><p class="content text-slice">...</p><p class="fake-content-2 text-slice">...</p><label class="expand-more" for="expand-check">更多</label>复制代码

如上,通过在文本前面添加一个隐藏的·<input type="checkbox">元素,在更多按钮中使用label的for属性,通过设置<label class="expand-more" for="expand-check">使其点击时可以改变前面添加的选择框元素的checked状态,从而实现切换效果。

总结

不同的方式都能实现效果,那什么情况适合使用哪一种呢,现进行比较:

  • 对比Js和CSS方式,Js实现可配置性,操作性强,而CSS实现有一定限制,无法在切换展示的同时进行其他Js处理;但是CSS实现更稳定,高效,代码,出错性小,js错误不影响此功能,在内容展示型页面适合使用。
  • 对比:target伪类和:checked伪类,前者代码量少,不需要添加额外元素,但是我们知道锚点点击时,页面是会滚动锚点元素到当前页面顶部的,这不适合长页面。
  • :checked伪类方式需要为每一个需要切换展示的段落都添加额外辅助元素,因此不适于在长列表中使用,如评论列表,新闻简介列表页。

本篇中实例详细代码参考https://github.com/codingplayboy/web_demo/tree/master/smallcase/expand_more

此篇关于文本截断切换展示的总结,主要出于学习与实用的目的,若喜欢请点赞,文笔水平有限,望包含。

欢迎移步我的个人博客

优雅的使用Js或CSS处理文本的截断与展示相关推荐

  1. 文字超过省略_纯CSS实现“文本溢出截断省略”的几种方法

    在我们的日常开发工作中,文本溢出截断省略是很常见的一种需考虑的业务场景细节.看上去 "稀松平常" ,但在实现上却有不同的区分,是单行截断还是多行截断?多行的截断判断是基于行数还是基 ...

  2. Springboot2.x+Websocket+js实现实时在线文本协同编辑,并展示协同用户

    文章目录 诉求 相关技术 思路展开 相关步骤 pom配置 服务端相关配置 文本信息.用户广播处理逻辑 前端功能代码 功能测试 小结 诉求 实现页面实时在线文本协同编辑,且显示当前同时编辑文本的用户. ...

  3. html设置文本框只读属性,juqery/js/css设置文本框只读属性的方法

    一.设置HTML表单文本框为只读的几种方式 有时候,我们希望表单中的文本框是只读的,让用户只能查看信息而不能修改其中的信息,使 input type="text" name=&qu ...

  4. bootstrap-wysiwyg中JS控件富文本的用法

    1.引入js和css文件(注:这里必须引入正确,下面是我的路径,你修改为你自己的,不多说了) <link href="/css/bootstrap-combined.no-icons. ...

  5. [转]基于 aspnet 的自动合并输出js和css的解决方案

    这是一个基于 aspnet 的自动合并输出js和css的解决方案. 首先感谢 LoveCherry 的文章<httpmodule和httphandler配合的又一应用--合并脚本样式>(h ...

  6. 放出php压缩HTML函数,轻松压缩html、js和Css

    缩HTML的起因 如何 提高网页加载速度 ,需要怎么对html页面优化相信是每个拟提高建站技术站长曾想到的问题,其实 网页优化 的方法还是很多. 有童鞋询问higrid如何 压缩HTML,也就是说能不 ...

  7. css 注入,electron程序,如何在主进程远程页面中注入js及css?

    本博客不欢迎:各种镜像采集行为,请尊重知识产权法律法规.大家都是程序员,不要闹得不开心. 每日一篇的苏南大叔写代码教程,又来了.在本文中,苏南大叔描述的是,在electron程序加载远程页面的时候,如 ...

  8. 推荐20款基于 jQuery CSS 的文本效果插件

    jQuery 和 CSS 可以说是设计和开发行业的一次革命.这一切如此简单,快捷的一站式服务.jQuery 允许你在你的网页中添加一些真正令人惊叹的东西而不用付出很大的努力,要感谢那些优秀的 jQue ...

  9. js,jquery,css,html5特效

    js,jquery,css,html5特效 包含js,jquery,css,html5特效,源代码 本文地址:http://www.cnblogs.com/Jeremy2001/p/6089343.h ...

最新文章

  1. ceph rados命令使用
  2. 学金融买计算机配置,我是学金融投资的计算机等级考试哪个方向对我工作有用...
  3. AI:百度飞桨EasyDL多门视频课程,手把手教你如何定制高精度AI模型
  4. 云原生推动全云开发与实践
  5. 一个html文档的文件主题,HTML清单
  6. virtualbox安装centos 6之增强工具
  7. python的sys.path
  8. 2016.07.24
  9. 多线程join,强制执行完
  10. 【Git】GitHub无法解析Latex语句的解决方法
  11. 如何使用Windows OVERLAPPED优化你的应用
  12. 小米路由器爆款产品遭遇友商恶意抹黑 官方怒晒黑稿...
  13. html5 显示圆形图片,《小白HTML5成长之路40》怎样显示圆角图片
  14. 「解读苏宁」30年门店数字化发展心法与实践分享
  15. adc0809工作过程C语言,ADC0809引脚图、时序图、工作流程图详解
  16. android 路由跟踪,手机移动端网络路由跟踪探测方式
  17. 【Git】git add
  18. 西北大学计算机转专业,2021年西北大学大一新生转专业及入学考试相关规定
  19. 网络调试助手简单使用教程
  20. DataGridView 基本用法及注意事项

热门文章

  1. m.2接口和nvme区别_M.2接口硬盘当真速度就快吗?这些不懂就别乱买!今天再说一遍...
  2. 截至2018年,目前,企业主流的消息中间件有哪些?各有什么优缺点?面试常问 RabbitMQ使用较多
  3. 源码共享,希望一起互相学习
  4. KVM热迁移方式漫谈
  5. 图解 Go 切片的深拷贝和浅拷贝
  6. 给大家介绍一下实现Go并发同步原语的基石
  7. 用Kubernetes搭建便携式开发环境之MongoDB
  8. python来构建多层网络
  9. #20165323 Java实验四 Android程序设计
  10. iscroll.js 下拉刷新和上拉加载