用原生js统计文本行数的简单示例


Posted in Javascript onAugust 19, 2016

前言

在开发的时候会遇到这种情况,只显示两行,如果超过两行,则显示一个“显示更多”的按钮,点击按钮来显示剩余行的内容。有个 jQuery 的插件 loadingDots 专门实现了这个功能。不过今天这里我们要用原生的Javascript来实现,要实现这个需求,最关键的是要确定这个容器内文本的行数,得到行数后,修改元素高度,并确定是否显示加载按钮。

window.getComputedStyle()

要使用原生 JavaScript 代码获取一个元素的各个 style 属性,使用 window.getComputedStyle() 是必然的。它可以返回一个 HTML 元素在浏览器中真正显示时的各个样式——当然,有些样式会被浏览器给屏蔽,比如,你要获取一个链接的颜色,并准备通过颜色来判断用户是否访问过某个地址,那肯定是不行的。

该方法返回的,是一个样式键值对,是 CSSStyleDeclaration 的实例。各属性索引名没有 - ,且采用驼峰命名法。比如 lineHeight

行数 = 整体高度 / 行高

整体高度通过 height 可以获取。行高可以通过 lineHeight 获取,将其结果再取整即可得到行数。

但有个问题,如果没有针对一个元素设置 line-height 值,则其默认值为 normal ,这个值在桌面浏览器中通常是 1.2 ,但还与字体有关。因此,最好是对需要计算行数的元素设置一下 line-height 值。

一个简单的实现如下:

function countLines(ele) {
 var styles = window.getComputedStyle(ele, null);
 var lh = parseInt(styles.lineHeight, 10);
 var h = parseInt(styles.height, 10);
 var lc = Math.round(h / lh);
 console.log('line count:', lc, 'line-height:', lh, 'height:', h);
 return lc;
}

完整代码示例

<!DOCTYPE html>
<html>
<head>
 <title>Line Count</title>
 <style type="text/css">
  p {
   line-height: 1.3em;
  }
 </style>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"></head>
<body>
<p id="target">She just made having a baby look lovely. Everything is white and she always has a fresh blueberry pie that's steaming and scones and clotted cream and she's reading The Old Man and the Sea and her little boy is rolly with bonnets. It's amazing, and I thought this is lovely. My kid is like playing with like explosive devices. I don't know where she's found them, like sticking them in our dog's ear. She already knows how to dry wall cause she puts holes in the wall.<br />
“今天的中国人一如当年的德国人,沉迷于‘崛起'幻觉,习惯于听信他人的吹捧,还想当然地认为只要中国继续保持经济增长,不仅未来的经济总量超越‘世界老大'美国可以期待,中国实现全面复兴也将是囊中之物。”上海外国语大学国际关系与公共事务学院教授程亚文在其新著《大国战略力》中尖锐地指出中国现下有不少人陷入了“盛世”幻觉,并没有意识到在经济总量的背后,中国其实还是一个极为落后的国家。世界上还没有一个大国是在风平浪静中兴起的,中国的新一轮文明复兴也将充满风险和曲折。防止国家崩溃、解体或衰败应该成为中国国家战略的重中之重。染上“软乎乎的幸福主义”只会让一个国家变得脆弱。
</p>
<p>行数:<span id="shower"></span></p>
改变窗口大小,自动计算
<button onclick="countLines()">立刻计算</button>

<script type="text/javascript">
var target = document.getElementById('target');
var shower = document.getElementById('shower');

function countLines(ele) {
 var styles = window.getComputedStyle(ele, null);
 var lh = parseInt(styles.lineHeight, 10);
 var h = parseInt(styles.height, 10);
 var lc = Math.round(h / lh);
 console.log('line count:', lc, 'line-height:', lh, 'height:', h);
 return lc;
}

function change() {
 shower.innerHTML = countLines(target);
}
window.onresize = change;
change();
</script>
</body>
</html>
[/html]

总结

以上就是本文的全部内容,希望本文的内容对大家使用Javascript能有所帮助。如果有疑问可以留言讨论。

Javascript 相关文章推荐
JavaScript中null与undefined分析
Jul 25 Javascript
JQuery 表单中textarea字数限制实现代码
Dec 07 Javascript
JavaScript Cookie的读取和写入函数
Dec 08 Javascript
jQuery validate 中文API 附validate.js中文api手册
Jul 31 Javascript
在浏览器中获取当前执行的脚本文件名的代码
Jul 19 Javascript
js 获取元素下面所有li的两种方法
Apr 14 Javascript
基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作
May 12 Javascript
jquery插件格式实例分析
Jun 16 Javascript
JS实现的添加弹出层并完成锁屏操作示例
Apr 07 Javascript
详解前端路由实现与react-router使用姿势
Aug 07 Javascript
Javascript将图片的绝对路径转换为base64编码的方法
Jan 11 Javascript
详解Vue项目部署遇到的问题及解决方案
Jan 11 Javascript
jQuery购物网页经典制作案例
Aug 19 #Javascript
手机Web APP如何实现分享多平台功能
Aug 19 #Javascript
浅谈Javascript中的12种DOM节点类型
Aug 19 #Javascript
js实现select选择框效果及美化
Aug 19 #Javascript
JavaScript面向对象编写购物车功能
Aug 19 #Javascript
javascript设计模式之module(模块)模式
Aug 19 #Javascript
JS实现六位字符密码输入器功能
Aug 19 #Javascript
You might like
php中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
VPS中使用LNMP安装WordPress教程
2014/12/28 PHP
初识通用数据库操作类――前端easyui-datagrid,form(php)
2015/07/31 PHP
nodejs命令行参数处理模块commander使用实例
2014/09/17 NodeJs
jQuery实现点击该行即可删除HTML表格行
2014/10/17 Javascript
jquery checkbox 勾选的bug问题解决方案与分析
2014/11/13 Javascript
js图片轮播特效代码分享
2015/09/07 Javascript
js省市县三级联动效果实例
2020/04/15 Javascript
关于JS变量和作用域详解
2016/07/28 Javascript
js 判断附件后缀的简单实现方法
2016/10/11 Javascript
详解Vue2 无限级分类(添加,删除,修改)
2017/03/07 Javascript
angular使用bootstrap方法手动启动的实例代码
2017/07/18 Javascript
vue axios请求拦截实例代码
2018/03/29 Javascript
Vue.js组件通信之自定义事件详解
2019/10/19 Javascript
[01:49]一目了然!DOTA2DotA快捷操作对比第二弹
2014/05/16 DOTA
sqlalchemy对象转dict的示例
2014/04/22 Python
简单介绍Python中的try和finally和with方法
2015/05/05 Python
Django Admin实现上传图片校验功能
2016/03/06 Python
详解python调度框架APScheduler使用
2017/03/28 Python
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
2017/09/24 Python
python opencv设置摄像头分辨率以及各个参数的方法
2018/04/02 Python
python傅里叶变换FFT绘制频谱图
2019/07/19 Python
python如何实现从视频中提取每秒图片
2020/10/22 Python
django自带serializers序列化返回指定字段的方法
2019/08/21 Python
python使用多线程编写tcp客户端程序
2019/09/02 Python
css3.0 图形构成实例练习二
2013/03/19 HTML / CSS
Lentiamo荷兰:在线订购隐形眼镜、隐形眼镜液和太阳镜
2019/10/25 全球购物
水务局局长岗位职责
2013/11/28 职场文书
黄继光的英雄事迹材料
2014/02/13 职场文书
保护环境倡议书300字
2014/05/19 职场文书
医疗器械售后服务承诺书
2014/05/21 职场文书
小学先进集体事迹材料
2014/05/31 职场文书
新教师教学工作总结
2015/08/12 职场文书
2016应届毕业生实习心得体会
2015/10/09 职场文书
《从现在开始》教学反思
2016/02/16 职场文书
vue postcss-px2rem 自适应布局
2022/05/15 Vue.js