用原生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操作cookie的函数代码
Oct 03 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
Apr 18 Javascript
jQuery 删除或是清空某个HTML元素示例
Aug 04 Javascript
jQuery实现列表自动滚动循环滚动展示新闻
Aug 22 Javascript
javascript实现禁止鼠标滚轮事件
Jul 24 Javascript
利用Node.js制作爬取大众点评的爬虫
Sep 22 Javascript
H5移动端图片压缩上传开发流程
Nov 09 Javascript
微信小程序 Button 组件详解及简单实例
Jan 10 Javascript
微信小程序 缓存(本地缓存、异步缓存、同步缓存)详解
Jan 17 Javascript
微信小程序之电影影评小程序制作代码
Aug 03 Javascript
如何使用proxy实现一个简单完整的MVVM库的示例代码
Sep 17 Javascript
Element InfiniteScroll无限滚动的具体使用方法
Jul 27 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学习之字符串比较和查找
2011/04/17 PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
2014/07/02 PHP
PHP针对常规模板引擎中与CSS/JSON冲突的解决方法
2014/08/19 PHP
php中current、next与reset函数用法实例
2014/11/17 PHP
PHP使用JSON和将json还原成数组
2015/02/12 PHP
PHP实现二维数组去重功能示例
2017/01/12 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
2020/01/26 PHP
一个用js实现控制台控件的代码
2007/09/04 Javascript
用于节点操作的API,颠覆原生操作HTML DOM节点的API
2010/12/11 Javascript
Prototype源码浅析 String部分(一)之有关indexOf优化
2012/01/15 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
2014/05/29 Javascript
JS实现兼容各浏览器解析XML文档数据的方法
2015/06/01 Javascript
关于JavaScript的变量的数据类型的判断方法
2015/08/14 Javascript
js实现左右两侧浮动广告
2018/07/09 Javascript
vue里如何主动销毁keep-alive缓存的组件
2019/03/21 Javascript
深入理解redux之compose的具体应用
2020/01/12 Javascript
nodeJs项目在阿里云的简单部署
2020/11/27 NodeJs
[03:56]还原FTP电影首映式 DOTA2群星拼出遗迹世界
2014/03/26 DOTA
连接Python程序与MySQL的教程
2015/04/29 Python
简介Django框架中可使用的各类缓存
2015/07/23 Python
pandas将numpy数组写入到csv的实例
2018/07/04 Python
python如何制作英文字典
2019/06/25 Python
介绍一款python类型检查工具pyright(推荐)
2019/07/03 Python
django 2.2和mysql使用的常见问题
2019/07/18 Python
简单了解django orm中介模型
2019/07/30 Python
python飞机大战pygame游戏之敌机出场实现方法详解
2019/12/17 Python
python中round函数如何使用
2020/06/19 Python
全网最全python库selenium自动化使用详细教程
2021/01/12 Python
Styleonme中文网:韩国高档人气品牌
2017/06/21 全球购物
巴西葡萄酒商店:Divvino
2020/02/22 全球购物
Linux开机引导的步骤是什么
2015/10/19 面试题
毕业生学校推荐信范文
2014/05/21 职场文书
信访工作经验交流材料
2014/05/23 职场文书
Python数据清洗工具之Numpy的基本操作
2021/04/22 Python
python中opencv实现图片文本倾斜校正
2021/06/11 Python
apache ftpserver搭建ftp服务器
2022/05/20 Servers