浅谈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 相关文章推荐
JavaScript库 开发规则
Jan 31 Javascript
Javascript this 的一些学习总结
Aug 31 Javascript
如何学习Javascript入门指导
Nov 01 Javascript
用jQuery与JSONP轻松解决跨域访问的问题
Feb 04 Javascript
基于javascript、ajax、memcache和PHP实现的简易在线聊天室
Feb 03 Javascript
浅谈javascript获取元素transform参数
Jul 24 Javascript
使用jquery实现的循环连续可停顿滚动实例
Nov 23 Javascript
使用JavaScript解决网页图片拉伸问题(推荐)
Nov 25 Javascript
node.js中的事件处理机制详解
Nov 26 Javascript
node学习记录之搭建web服务器教程
Feb 16 Javascript
详解ElementUI之表单验证、数据绑定、路由跳转
Jun 21 Javascript
vue实现跨域的方法分析
May 21 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
ThinkPHP Where 条件中常用表达式示例(详解)
2017/03/31 PHP
PHP+jQuery实现滚屏无刷新动态加载数据功能详解
2017/05/04 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
2020/04/13 PHP
PHP date_default_timezone_set()设置时区操作实例分析
2020/05/16 PHP
Sample script that deletes a SQL Server database
2007/06/16 Javascript
说明你的Javascript技术很烂的五个原因
2011/04/26 Javascript
js 如何实现对数据库的增删改查
2012/11/23 Javascript
javascript中直接写php代码的方法
2013/07/31 Javascript
深入理解javascript作用域和闭包
2014/09/23 Javascript
AngularJS基础学习笔记之控制器
2015/05/10 Javascript
javascript+HTML5 Canvas绘制转盘抽奖
2020/05/16 Javascript
D3.js实现折线图的方法详解
2016/09/21 Javascript
利用Bootstrap实现表格复选框checkbox全选
2016/12/21 Javascript
微信小程序删除处理详解
2017/08/16 Javascript
浅谈Vue 初始化性能优化
2017/08/31 Javascript
动态创建Angular组件实现popup弹窗功能
2017/09/15 Javascript
nodeJS服务器的创建和重新启动的实现方法
2018/05/12 NodeJs
关于Vue组件库开发详析
2018/07/01 Javascript
小程序自定义单页面、全局导航栏的实现代码
2019/03/15 Javascript
微信小程序自定义扫码功能界面的实现代码
2020/07/02 Javascript
Node快速切换版本、版本回退(降级)、版本更新(升级)
2021/01/07 Javascript
[01:46]2020完美世界全国高校联赛秋季赛报名开启
2020/10/15 DOTA
Python递归实现汉诺塔算法示例
2018/03/19 Python
Django实现学员管理系统
2019/02/26 Python
python中的单引号双引号区别知识点总结
2019/06/23 Python
python中列表的切片与修改知识点总结
2019/07/23 Python
Golang GBK转UTF-8的例子
2019/08/26 Python
python用requests实现http请求代码实例
2019/10/31 Python
纽约21世纪百货官网:Century 21
2016/08/27 全球购物
关键字throw与throws的用法差异
2016/11/22 面试题
小学五年级语文上册教学计划
2015/01/22 职场文书
2015年招生工作总结
2015/05/04 职场文书
生活小常识广播稿
2015/08/19 职场文书
2016年幼儿园教研活动总结
2016/04/05 职场文书
2021-4-5课程——SQL Server查询【3】
2021/04/05 SQL Server