浅谈Angular文字折叠展开组件的原理分析


Posted in Javascript onNovember 24, 2017

自己写了个Angular的文字折叠组件,这种组件其实很多地方都能用到效果如下

展开后的效果

浅谈Angular文字折叠展开组件的原理分析

折叠后的效果

浅谈Angular文字折叠展开组件的原理分析

先放全部代码,使用的时候只需要把自己需要展现的文字{{designer.des}}替换成自己所在路由器所需要绑定的数据即可

.directive('textfold', function() {
    return {
      restrict: 'EA',
      template: '<p style="font-size: 14px; border-left:5px solid #dddddd; padding: 15px; padding-bottom: 10px; margin-bottom: 15px; margin-top: 15px;">' + '<span id="textfold" style="display:block; overflow:hidden;">{{designer.des}}</span>' + '<br />' + '<span style="color: #1bb7ac; position: relative; bottom: 10px;" ng-click="more(this)">{{isMore}}</span>' + '</p>',
      link: function(scope, element, attrs) {
        var height;
        var maxheight;
        function textfold() {
          height = angular.element('#textfold').height();
          maxheight = angular.element('#textfold').height();
        }
        scope.$watch('designer.des', function(data) {
          if (data) {
            textfold();
          }
        })
        var isExtend = true;
        scope.isMore = "折叠";
        scope.more = function() {
          var minheight = 23;
          if (isExtend) {
            if (height >= minheight) {
              document.getElementById('textfold').style.height = height + "px";
              setTimeout(function() {
                scope.more();
              }, 1);
              height -= 10;
            } else {
              scope.isMore = "查看更多...";
              scope.$apply();
              isExtend = !isExtend;
              height += 10;
            }
          } else {
            if (height <= maxheight) {
              document.getElementById('textfold').style.height = height + "px";
              setTimeout(function() {
                scope.more();
              }, 1);
              height += 10;
            } else {
              scope.isMore = "折叠";
              scope.$apply();
              isExtend = !isExtend;
              height -= 10;
            }
          }
        }
      }
    }
  })

下面我一句句的分析这个组件的思路

首先肯定是定义好Angular该组件化的模板和使用模式

restrict: 'EA',
template: '<p style="font-size: 14px; border-left:5px solid #dddddd; padding: 15px; padding-bottom: 10px; margin-bottom: 15px; margin-top: 15px;">' + '<span id="textfold" style="display:block; overflow:hidden;">{{designer.des}}</span>' + '<br />' + '<span style="color: #1bb7ac; position: relative; bottom: 10px;" ng-click="more(this)">{{isMore}}</span>' + '</p>',

EA为,使用元素和属性的方法都可以在DOM里面展现这个插件,既我可以这样 <textfold></textfold>也可以这样<div textfold="Wsscat"></div>的形式来复用该组件 后面我们使用link定义一个函数

var height;
var maxheight;

这两个变量一个是此时折叠完后的高度(这个是在展开变成折叠的过程中不断发生变化的,最后折叠后就是等于minheight),一个文字完全展开时候获取的高度

function textfold() {
          height = angular.element('#textfold').height();
          maxheight = angular.element('#textfold').height();
        }
        scope.$watch('designer.des', function(data) {
          if (data) {
            textfold();
            scope.more();
          }
        })

这两句其实很重要的,当我们获取文字的高度时候,是必须要捕获文字的变化(文字完全渲染后的高度),所以我们用scope.$watch来捕获designer.des的变化,当data不为空,即文字已渲染后

if (data) {
            textfold();
          }

再去执行回调函数textfold来获取当前文字的高度,暂时试过这种方法可以获取到文字渲染后的高度

如果顺序执行而不是回调执行

angular.element('#textfold').height()

只会拿到span标签的默认高度而已

这里还可以添加个小技巧,增加一句scope.more();

if (data) {
            textfold();
            scope.more();
          }

这样就可以让它页面渲染完后先展开,然后再折叠,那么我们就在进来页面的时候默认是折叠的状态了,在程序里面,写这种效果,一般是先让它文字展开获取到高度再返回成折叠状态,来达到进来页面就是折叠的文字状态效果

var isExtend = true;这句是让下面的scope.more进入第一个分支折叠状态

setTimeout(function() {
                scope.more();
              }, 1);

这句是一句递归,其实就相当于实现jQuery的animate的文字框伸缩动画,只是这里用了一个递归来实现不断进来判断状态从而改变height值

然后通过改变scope.isMore改变它是查看更多…还是折叠

由于这里是用DOM操作

document.getElementById('textfold').style.height = height + "px";

下面这里最好加多一句

scope.$apply();

来获取DOM的变化

其实大概思路就是很简单的,其他一些地方也是很容易理解~有什么好的方法欢迎推荐,或者文中有什么错漏或者不足还请多多留言告知,以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery下的几个你可能没用过的功能
Aug 29 Javascript
JavaScript内核之基本概念
Oct 21 Javascript
jquery插件开发注意事项小结
Jun 04 Javascript
Egret引擎开发指南之运行项目
Sep 03 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
Sep 26 Javascript
触屏中的JavaScript事件分析
Feb 06 Javascript
jQuery实现动画效果circle实例
Aug 06 Javascript
jQuery Password Validation密码验证
Dec 30 Javascript
Angular学习教程之RouterLink花式跳转
May 03 Javascript
微信小程序用户授权,以及判断登录是否过期的方法
May 10 Javascript
轻松学习JavaScript函数中的 Rest 参数
May 30 Javascript
返回上一个url并刷新界面的js代码
Sep 12 Javascript
vue 文件目录结构详解
Nov 24 #Javascript
获取本机IP地址的实例(JavaScript / Node.js)
Nov 24 #Javascript
js判断数组是否包含某个字符串变量的实例
Nov 24 #Javascript
最新Javascript程序员面试试题和解题方法
Nov 23 #Javascript
详解bootstrap导航栏.nav与.navbar区别
Nov 23 #Javascript
Vue添加请求拦截器及vue-resource 拦截器使用
Nov 23 #Javascript
bootstrap datetimepicker控件位置异常的解决方法
Nov 23 #Javascript
You might like
德生PL330测评
2021/03/02 无线电
模拟OICQ的实现思路和核心程序(二)
2006/10/09 PHP
PHP生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
php格式化日期实例分析
2014/11/12 PHP
thinkphp关于简单的权限判定方法
2017/04/03 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
2020/02/29 PHP
encode脚本和normal脚本混用的问题与解决方法
2007/03/08 Javascript
Ruffy javascript 学习笔记
2009/11/30 Javascript
用Jquery实现多级下拉框无刷新的联动
2010/12/22 Javascript
js里怎么取select标签里的值并修改
2012/12/10 Javascript
客户端js判断文件类型和文件大小即限制上传大小
2013/11/20 Javascript
最简单的tab切换实例代码
2016/05/13 Javascript
jqGrid翻页时数据选中丢失问题的解决办法
2017/02/13 Javascript
vue中如何引入jQuery和Bootstrap
2017/04/10 jQuery
vue mixins组件复用的几种方式(小结)
2017/09/06 Javascript
Vue2.0 axios前后端登陆拦截器(实例讲解)
2017/10/27 Javascript
Vue底层实现原理总结
2018/02/17 Javascript
JavaScript引用类型之基本包装类型实例分析【Boolean、Number和String】
2018/08/09 Javascript
vue实现商品加减计算总价的实例代码
2018/08/12 Javascript
Python中使用 Selenium 实现网页截图实例
2014/07/18 Python
python检测远程端口是否打开的方法
2015/03/14 Python
Python语言实现获取主机名根据端口杀死进程
2016/03/31 Python
对python 多个分隔符split 的实例详解
2018/12/20 Python
在PyCharm导航区中打开多个Project的关闭方法
2019/01/17 Python
pygame实现成语填空游戏
2019/10/29 Python
Python Numpy,mask图像的生成详解
2020/02/19 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
2020/09/21 Python
python中pow函数用法及功能说明
2020/12/04 Python
澳大利亚最大的女装零售商:Millers
2017/09/10 全球购物
数字漫画:comiXology
2020/06/13 全球购物
高中军训第一天感言
2014/03/06 职场文书
关爱残疾人演讲稿
2014/05/24 职场文书
旷工辞退通知书
2015/04/17 职场文书
学校食堂食品安全承诺书
2015/04/29 职场文书
《文化苦旅》读后感:阅读,让人诗意地栖居在大地上
2019/12/24 职场文书
nginx location 带斜杠【 / 】与不带的区别
2022/04/13 Servers