浅谈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 Jquery 遍历Json的实现代码
Mar 31 Javascript
两个select多选模式的选项相互移动(示例代码)
Jan 11 Javascript
自己使用jquery写的一个无缝滚动的插件
Apr 30 Javascript
Egret引擎开发指南之发布项目
Sep 03 Javascript
JavaScript获取网页支持表单字符集的方法
Apr 02 Javascript
以WordPress为例讲解jQuery美化页面Title的方法
May 23 Javascript
两种JavaScript的AES加密方式(可与Java相互加解密)
Aug 02 Javascript
浅谈jQuery中的$.extend方法来扩展JSON对象
Feb 12 Javascript
用最少的JS代码写出贪吃蛇游戏
Jan 12 Javascript
浅谈在Vue.js中如何实现时间转换指令
Jan 06 Javascript
JS数组求和的常用方法实例小结
Jan 07 Javascript
如何使用 JavaScript 操作浏览器历史记录 API
Nov 24 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
php5中类的学习
2008/03/28 PHP
php实现的在线人员函数库
2008/04/09 PHP
php生成gif动画的方法
2015/11/05 PHP
Jquery+JSon 无刷新分页实现代码
2010/04/01 Javascript
Node.js中使用socket创建私聊和公聊聊天室
2015/11/19 Javascript
jquery在ie7下选择器的问题导致append失效的解决方法
2016/01/10 Javascript
理解JavaScript事件对象
2016/01/25 Javascript
基于jQuery日历插件制作日历
2016/03/11 Javascript
javascript和jQuery实现网页实时聊天的ajax长轮询
2016/07/20 Javascript
使用HTML5+Boostrap打造简单的音乐播放器
2016/08/05 Javascript
Vue.js中数组变动的检测详解
2016/10/12 Javascript
基于Javascript实现的不重复ID的生成器
2016/12/25 Javascript
vue-cli+webpack在生成的项目中使用bootstrap实例代码
2017/05/26 Javascript
[js高手之路]单例模式实现模态框的示例
2017/09/01 Javascript
vue使用ajax获取后台数据进行显示的示例
2018/08/09 Javascript
vue实现瀑布流组件滑动加载更多
2020/03/10 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
2020/10/09 Javascript
Python设计模式之代理模式实例
2014/04/26 Python
使用Python中的tkinter模块作图的方法
2017/02/07 Python
使用PyV8在Python爬虫中执行js代码
2017/02/16 Python
Python 转义字符详细介绍
2017/03/21 Python
在java中如何定义一个抽象属性示例详解
2017/08/18 Python
Python中循环后使用list.append()数据被覆盖问题的解决
2018/07/01 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
2019/10/23 Python
python保存log日志,实现用log日志画图
2019/12/24 Python
Django自定义全局403、404、500错误页面的示例代码
2020/03/08 Python
k-means 聚类算法与Python实现代码
2020/06/01 Python
keras 多任务多loss实例
2020/06/22 Python
CSS3使用多列制作瀑布流
2016/05/10 HTML / CSS
Sneaker Studio法国:购买运动鞋
2018/06/08 全球购物
体育教师自荐信范文
2013/12/16 职场文书
清明节网上祭英烈活动总结
2014/04/30 职场文书
商务信函英语问候语
2015/11/10 职场文书
二年级作文之动物作文
2019/11/13 职场文书
JS前端canvas交互实现拖拽旋转及缩放示例
2022/08/05 Javascript
VW、VH适配移动端的解决方案与常见问题
2023/05/21 HTML / CSS