javascript超过容器后显示省略号效果的方法(兼容一行或者多行)


Posted in Javascript onJuly 14, 2016

javascript超过容器后显示省略号效果

在实际的项目中,由于文字内容的长度不确定性和页面布局的固定性,难免会出现文字内容超过div(或其他标签,下同)区域的情况,此时比较好的做法就是当文字超过限定的div宽度后自动以省略号(…)显示,这样,按照习惯,人们都会知道这儿有文字被省略了。css中有个属性叫做text-overflow:ellipsis;比如使用css可以这样写:

{width:27em; white-space:nowrap; text-overflow:ellipsis; -o-text-overflow:ellipsis; overflow:hidden;}仅在Firefox火狐浏览器下无法实现文字溢出省略号表示,其文字直接从中间咔掉了,我这边不讲用css怎么样来实现这样的,具体的css实现可以自己百度去,我这边最主要的是讲怎么样用JS来实现,怎么样通过JS写一个简单的组件,我直接调用JS的初始化方法就可以实现掉!比如如下效果:

后面的点点点 来提示用户有更多的内容未显示完成这样的效果!

先废话少说!首先来看看我做的demo效果,就能明白到底是个什么样的效果!

想看效果,请点击我!ok?

一: 先来看看组件的配置项:如下:

targetCls

null,    目标要截取的容器 必填项 默认为null

limitLineNumber 1,     要显示的行数 默认为1行

type '...',      超过了容器长度 显示的type 默认为省略号

lineHeight  18,       dom节点的行高 默认行高为18

isShowTitle true ,      title 是否需要title来显示所有的内容 默认为true

isCharLimit false     根据字符的长度来限制 超过显示省略号

maxLength 20        默认长度为20 超过字符20后 显示省略号

二:分析

1.  首先来讲讲此组件:支持2种方式来截取字符串,第一:根据字符的长度来截取,超过后显示省略号,比如我这样调用:

new MultiEllipsis({
"targetCls" : '.text8',
"isCharLimit":true,
"maxLength": 18

  });

这样初始化的意思是说,isCharLimit为true是指用字符的个数来截取,最大的长度maxLength为18,这样初始化,因为代码里面会首先判断如果isCharLimit为true的话,就直接按照字符的个数来截取,比如如下代码:

2. 第二种是根据多少行数及高度来截取的,比如默认配置项的行高是18,如果我想显示2行,那也就是说高度h = 18*2, 假如容器的高度是100,那么截取的方法是:

使用 (100 - type的长度 - 1)  是否大于 18×2,如果大于的话,继续截取,否则的不截取,且显示省略号效果!如下代码:

缺点:但是使用行高截取的话,如果数据比较少的话,是可以的,但是如果数据很多的话,比如高度为500像素或者更多的话,那么相对来说会影响性能的,因为他们每次都要计算n次(n为循环调用函数多的意思)。

JS所有的代码如下:

复制代码

/* 

* 基于JS的MultiEllipsis 

* @author tugenhua 

*/ 

function MultiEllipsis(options) { 

  var self = this; 

  self.options = $.extend({},defaults,options || {}); 

  self._init(); 

} 

$.extend(MultiEllipsis.prototype,{ 

   // 页面初始化 

  _init: function(){ 

    var self = this, 

      cfg = self.options; 

    if(cfg.targetCls == null || $(cfg.targetCls + "")[0] === undefined) { 

      if(window.console) { 

        console.log("targetCls不为空!"); 

      } 

      return; 

    } 

    if(cfg.isShowTitle) { 

      // 获取元素的文本 添加title属性 

      var title = self.getText(); 

      $(cfg.targetCls ).attr({"title":title}); 

    } 

    // 如果是按照字符来限制的话 那么就不按照高度来比较 直接返回 

    if(cfg.isCharLimit) { 

      self._charCompare(); 

      return; 

    } 

    self._compareHeight(cfg.lineHeight * cfg.limitLineNumber); 

  }, 

  /* 

   * 按照字符的长度来比较 来显示文本 

   * @method _charCompare {private} 

   * @return 返回新的字符串到容器里面 

   */ 

  _charCompare: function(){ 

    var self = this, 

      cfg = self.options; 

    var text = self.getText(); 

    if(text.length > cfg.maxLength) { 

      var curText = text.substring(0,cfg.maxLength); 

      $($(cfg.targetCls + "")[0]).html(curText + cfg.type); 

    } 

  }, 

  /* 

   * 获取目标元素的text 

   * 如果有属性 data-text 有值的话 那么先获取这个值 否则的话 直接去html内容 

   * @method getText {public} 

   */ 

  getText: function(){ 

    var self = this, 

      cfg = self.options; 

    return $.trim($($(cfg.targetCls + "")[0]).html()); 

  }, 

  /* 

   * 设置dom元素文本 

   * @method setText {public} 

   */ 

  setText: function(text){ 

    var self = this, 

      cfg = self.options; 

    $($(cfg.targetCls + "")[0]).html(text); 

  }, 

  /* 

   * 通过配置项的 行数 * 一行的行高 是否大于或者等于当前的高度 

   * @method _compareHeight {private} 

   */ 

  _compareHeight: function(maxLineHeight) { 

    var self = this; 

    var curHeight = self._getTargetHeight(); 

    if(curHeight > maxLineHeight) { 

      self._deleteText(self.getText()); 

    } 

  }, 

  /* 

   * 截取文本 

   * @method _deleteText {private} 

   * @return 返回被截取的文本 

   */ 

  _deleteText: function(text){ 

    var self = this, 

      cfg = self.options, 

      typeLen = cfg.type.length; 

    var curText = text.substring(0,text.length - typeLen - 1); 

    curText += cfg.type; 

    // 设置元素的文本 

    self.setText(curText); 

    // 继续调用函数进行比较 

    self._compareHeight(cfg.lineHeight * cfg.limitLineNumber); 

  }, 

  /* 

   * 返回当前dom的高度 

   */ 

  _getTargetHeight: function(){ 

    var self = this, 

      cfg = self.options; 

    return $($(cfg.targetCls + "")[0]).height(); 

  } 

}); 

var defaults = { 

  'targetCls'        :   null,         // 目标要截取的容器 

  'limitLineNumber'     :   1,           // 限制的行数 通过 行数 * 一行的行高 >= 容器的高度 

  'type'          :   '...',         // 超过了长度 显示的type 默认为省略号 

  'lineHeight'       :   18,         // dom节点的行高 

  'isShowTitle'       :    true,        // title是否显示所有的内容 默认为true 

  'isCharLimit'       :   false,        // 根据字符的长度来限制 超过显示省略号 

  'maxLength'        :   20          // 默认为20 

};

以上这篇javascript超过容器后显示省略号效果的方法(兼容一行或者多行)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用jscript启动sqlserver
Jun 21 Javascript
jquery 多行滚动代码(附详细解释)
Jun 17 Javascript
javascript实现输出指定行数正方形图案的方法
Aug 03 Javascript
详解JavaScript对象序列化
Jan 19 Javascript
Javascript的表单验证-提交表单
Mar 18 Javascript
jQuery解决浏览器兼容性问题案例分析
Apr 15 Javascript
基于jQuery实现中英文切换导航条效果
Sep 18 Javascript
使用Bootstrap4 + Vue2实现分页查询的示例代码
Dec 21 Javascript
解决webpack dev-server不能匹配post请求的问题
Aug 24 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
Nov 03 Javascript
基于javascript实现放大镜特效
Dec 03 Javascript
JS操作JSON常用方法(10w阅读)
Dec 06 Javascript
AngularJS实用开发技巧(推荐)
Jul 13 #Javascript
JS中如何比较两个Json对象是否相等实例代码
Jul 13 #Javascript
js实现可键盘控制的简单抽奖程序
Jul 13 #Javascript
原生js仿jquery animate动画效果
Jul 13 #Javascript
瀑布流的实现方式(原生js+jquery+css3)
Jun 28 #Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
Jul 13 #Javascript
Javascript类型系统之undefined和null浅析
Jul 13 #Javascript
You might like
制作美丽的拉花
2021/03/03 冲泡冲煮
php随机输出名人名言的代码
2012/10/07 PHP
safari下载文件自动加了html后缀问题
2018/11/09 PHP
js获取单选按钮的数据
2006/11/27 Javascript
javascript this用法小结
2008/12/19 Javascript
extJs 下拉框联动实现代码
2010/04/09 Javascript
基于jquery的不规则矩形的排列实现代码
2012/04/16 Javascript
Iframe实现跨浏览器自适应高度解决方法
2014/09/02 Javascript
js实现百度联盟中一款不错的图片切换效果完整实例
2015/03/04 Javascript
js鼠标点击图片切换效果代码分享
2015/08/26 Javascript
基于Jquery代码实现手风琴菜单
2015/11/19 Javascript
微信小程序 加载 app-service.js 错误解决方法
2016/10/12 Javascript
jQuery zTree树插件简单使用教程
2017/01/10 Javascript
AngularJS 霸道的过滤器小结
2017/04/26 Javascript
JS中的数组转变成JSON格式字符串的方法
2017/05/09 Javascript
对vue里函数的调用顺序介绍
2018/03/17 Javascript
Vue通过ref父子组件拿值方法
2018/09/12 Javascript
详解如何制作并发布一个vue的组件的npm包
2018/11/10 Javascript
thinkjs微信中控之微信鉴权登陆的实现代码
2019/08/08 Javascript
Python中AND、OR的一个使用小技巧
2015/02/18 Python
django 修改server端口号的方法
2018/05/14 Python
解决sublime+python3无法输出中文的问题
2018/12/12 Python
Python实现某论坛自动签到功能
2019/08/20 Python
Django url,从一个页面调到另个页面的方法
2019/08/21 Python
Python定义一个Actor任务
2020/07/29 Python
Diamondback自行车:拥有你的冒险
2019/04/22 全球购物
毕业生求职推荐信
2013/11/04 职场文书
做一个有道德的人活动实施方案
2014/08/23 职场文书
2014感恩节演讲稿大全
2014/10/11 职场文书
2014年最新版离婚协议书范本
2014/11/25 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书
教你如何用Python实现人脸识别(含源代码)
2021/06/23 Python
SpringBoot集成Redis的思路详解
2021/10/16 Redis
一次Mysql update sql不当引起的生产故障记录
2022/04/01 MySQL
Python各协议下socket黏包问题原理
2022/04/12 Python
springboot读取nacos配置文件
2022/05/20 Java/Android