浅谈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 相关文章推荐
在html页面上拖放移动标签
Jan 08 Javascript
Jquery Ajax学习实例 向页面发出请求,返回XML格式数据
Mar 14 Javascript
jquery实现多级下拉菜单的实例代码
Oct 02 Javascript
通过Jquery的Ajax方法读取将table转换为Json
May 31 Javascript
Javascript中With语句用法实例
May 14 Javascript
JavaScript小技巧整理篇(非常全)
Jan 26 Javascript
JavaScript实现页面跳转的方式汇总
May 16 Javascript
EasyUI Pagination 分页的两种做法小结
Jul 09 Javascript
JS实现简单的tab切换选项卡效果
Sep 21 Javascript
JavaScript ES2019中的8个新特性详解
Feb 20 Javascript
微信小程序非跳转式组件授权登录的方法示例
May 22 Javascript
快速解决element的autofocus失效问题
Sep 08 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
使用Apache的rewrite技术
2006/06/22 PHP
Search Engine Friendly的URL设计
2006/10/09 PHP
php工具型代码之印章抠图
2018/07/18 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
json实现添加、遍历与删除属性的方法
2016/06/17 Javascript
JS实现兼容火狐及IE iframe onload属性的遮罩层隐藏及显示效果
2016/08/23 Javascript
Javascript使用function创建类的两种方法(推荐)
2016/11/19 Javascript
关于ES6的六个小特性(二)
2017/02/20 Javascript
Nginx 配置多站点vhost 的方法
2018/01/07 Javascript
深入理解es6块级作用域的使用
2019/03/28 Javascript
小程序如何定位所在城市及发起周边搜索
2020/02/11 Javascript
js根据后缀判断文件文件类型的代码
2020/05/09 Javascript
jquery实现穿梭框功能
2021/01/19 jQuery
python单线程实现多个定时器示例
2014/03/30 Python
python+mysql实现简单的web程序
2014/09/11 Python
python编写Logistic逻辑回归
2020/12/30 Python
Python模拟简单电梯调度算法示例
2018/08/20 Python
python实现本地图片转存并重命名的示例代码
2018/10/27 Python
解决pycharm的Python console不能调试当前程序的问题
2019/01/20 Python
python环境路径配置以及命令行运行脚本
2019/04/02 Python
Python字典底层实现原理详解
2019/12/18 Python
django queryset相加和筛选教程
2020/05/18 Python
Python 创建TCP服务器的方法
2020/07/28 Python
Python爬虫+Tkinter制作一个翻译软件的示例
2021/02/20 Python
CSS3 RGBA色彩模式使用实例讲解
2016/04/26 HTML / CSS
美国知名的家庭连锁百货商店:Boscov’s
2017/07/27 全球购物
eBay英国购物网站:eBay.co.uk
2019/06/19 全球购物
电子商务专业实习生自我鉴定
2013/09/24 职场文书
暑期学习心得体会
2014/09/02 职场文书
酒店优秀员工推荐信
2015/03/24 职场文书
2015暑假打工实践报告
2015/07/13 职场文书
校运会加油稿大全
2015/07/22 职场文书
2016优秀毕业生个人事迹材料
2016/02/29 职场文书
创业的9条正确思考方式
2019/08/26 职场文书
PyTorch梯度裁剪避免训练loss nan的操作
2021/05/24 Python
Python实战之OpenCV实现猫脸检测
2021/06/26 Python