浅谈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 相关文章推荐
脚本吧 - 幻宇工作室用到js,超强推荐base.js
Dec 23 Javascript
容易造成JavaScript内存泄露几个方面
Sep 04 Javascript
JS函数this的用法实例分析
Feb 05 Javascript
js实现简易的单数字随机抽奖(0-9)
Mar 19 Javascript
ajax在兼容模式下失效的快速解决方法
Mar 22 Javascript
javascript时间戳和日期字符串相互转换代码(超简单)
Jun 22 Javascript
微信小程序 http请求详细介绍
Oct 09 Javascript
javascript基础知识讲解
Jan 11 Javascript
js学习总结之DOM2兼容处理顺序问题的解决方法
Jul 27 Javascript
详解从买域名到使用pm2部署node.js项目全过程
Mar 07 Javascript
JS实现生成由字母与数字组合的随机字符串功能详解
May 25 Javascript
前端性能优化建议
Sep 17 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
9个PHP开发常用功能函数小结
2011/07/15 PHP
初学PHP的朋友 经常问的一些问题。不断更新
2011/08/11 PHP
CI框架使用composer安装的依赖包步骤与方法分析
2016/11/21 PHP
PHP 配置后台登录以及模板引入
2017/01/24 PHP
PHP不使用内置函数实现字符串转整型的方法示例
2017/07/03 PHP
thinkPHP5框架导出Excel文件简单操作示例
2018/08/03 PHP
PHP7 foreach() 函数修改
2021/03/09 PHP
解决表单中第一个非隐藏的元素获得焦点的一个方案
2009/10/26 Javascript
Javascript的构造函数和constructor属性
2010/01/09 Javascript
cookie 最近浏览记录(中文escape转码)具体实现
2013/06/08 Javascript
js获取UserControl内容为拼html时提供方便
2014/11/02 Javascript
Bootstrap+jfinal实现省市级联下拉菜单
2016/05/30 Javascript
第一次接触神奇的Bootstrap网格系统
2016/07/27 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
2016/11/01 Javascript
原生js实现无缝轮播图效果
2017/01/11 Javascript
详解js的异步编程技术的方法
2017/02/09 Javascript
关于Vue单页面骨架屏实践记录
2017/12/13 Javascript
vue获取当前激活路由的方法
2018/03/17 Javascript
微信小程序6位或多位验证码密码输入框功能的实现代码
2018/05/29 Javascript
vue路由对不同界面进行传参及跳转的总结
2019/04/20 Javascript
python实现的阳历转阴历(农历)算法
2014/04/25 Python
简单介绍Python中的round()方法
2015/05/15 Python
bpython 功能强大的Python shell
2016/02/16 Python
Python编程之序列操作实例详解
2017/07/22 Python
对TensorFlow中的variables_to_restore函数详解
2018/07/30 Python
python画图--输出指定像素点的颜色值方法
2019/07/03 Python
Sunglasses Shop英国:欧洲领先的太阳镜在线供应商之一
2018/09/19 全球购物
大学生活学习的自我评价
2013/12/03 职场文书
网上签名寄语活动留言
2014/01/18 职场文书
环境日宣传活动总结
2014/07/09 职场文书
高中课前三分钟演讲稿
2014/09/13 职场文书
论群众路线学习笔记
2014/11/06 职场文书
2014年党务公开工作总结
2014/12/09 职场文书
担保书范文
2019/07/09 职场文书
vue+spring boot实现校验码功能
2021/05/27 Vue.js
前端框架ECharts dataset对数据可视化的高级管理
2022/12/24 Javascript