浅谈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 Onunload与Onbeforeunload使用小结
Dec 31 Javascript
扩展Jquery插件处理mouseover时内部有子元素时发生样式闪烁
Dec 08 Javascript
图片动画横条广告带上下滚动可自定义图片、链接等等
Oct 20 Javascript
JS复制内容到剪切板的实例代码(兼容IE与火狐)
Nov 19 Javascript
浅谈jQuery 选择器和dom操作
Jun 07 Javascript
AngularJS应用开发思维之依赖注入3
Aug 19 Javascript
js脚本编写简单刷票投票系统
Jun 27 Javascript
BootStrap给table表格的每一行添加一个按钮事件
Sep 07 Javascript
vue全局组件与局部组件使用方法详解
Mar 29 Javascript
jQuery实现输入框的放大和缩小功能示例
Jul 21 jQuery
JS实现拼图游戏
Jan 29 Javascript
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
May 03 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
全国FM电台频率大全 - 17 湖北省
2020/03/11 无线电
解析thinkphp基本配置 convention.php
2013/06/18 PHP
9个实用的PHP代码片段分享
2015/01/22 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
使Ext的Template可以解析二层的json数据的方法
2007/12/22 Javascript
javascript动态加载二
2012/08/22 Javascript
js监听键盘事件示例代码
2013/07/26 Javascript
在JS中如何调用JSP中的变量
2014/01/22 Javascript
js特殊字符过滤的示例代码
2014/03/05 Javascript
javascript实现给定半径求出圆的面积
2015/06/26 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
2016/10/30 Javascript
JS jQuery使用正则表达式去空字符的简单实现代码
2017/05/20 jQuery
史上最全JavaScript数组去重的十种方法(推荐)
2017/08/17 Javascript
浅谈vue 单文件探索
2018/09/05 Javascript
JS使用正则表达式判断输入框失去焦点事件
2019/10/16 Javascript
[39:21]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.24
2019/09/10 DOTA
python调用短信猫控件实现发短信功能实例
2014/07/04 Python
在Python中使用dict和set方法的教程
2015/04/27 Python
Python列表删除的三种方法代码分享
2017/10/31 Python
python爬虫之自制英汉字典
2019/06/24 Python
Python中的单下划线和双下划线使用场景详解
2019/09/09 Python
python的等深分箱实例
2019/11/22 Python
Python 词典(Dict) 加载与保存示例
2019/12/06 Python
python爬取本站电子书信息并入库的实现代码
2020/01/20 Python
python如何把字符串类型list转换成list
2020/02/18 Python
使用Python封装excel操作指南
2021/01/29 Python
PHP如何与mysql建立链接
2013/05/05 面试题
生产管理的三大手法
2013/11/11 职场文书
2014年国培研修感言
2014/03/09 职场文书
团队经理竞聘书
2014/03/31 职场文书
2014年工作总结与下年工作计划
2014/11/27 职场文书
《比的意义》教学反思
2016/02/18 职场文书
Python Django框架介绍之模板标签及模板的继承
2021/05/27 Python
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
2021/08/23 MySQL
关于maven依赖 ${xxx.version}报错问题
2022/01/18 Java/Android