浅谈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 相关文章推荐
jQuery中的常用事件总结
Dec 27 Javascript
根据表格中的某一列进行排序的javascript代码
Nov 29 Javascript
angular中使用路由和$location切换视图
Jan 23 Javascript
原生js实现autocomplete插件
Apr 14 Javascript
基于Angularjs实现分页功能
May 30 Javascript
基于JS实现横线提示输入验证码随验证码输入消失(js验证码的实现)
Oct 27 Javascript
node.js平台下利用cookie实现记住密码登陆(Express+Ejs+Mysql)
Apr 26 Javascript
jQuery实现可拖动进度条实例代码
Jun 21 jQuery
vue2中的keep-alive使用总结及注意事项
Dec 21 Javascript
深入浅析JS中的严格模式
Jun 04 Javascript
vue中设置、获取、删除cookie的方法
Sep 21 Javascript
纯javascript实现选择框的全选与反选功能
Apr 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
单一index.php实现PHP任意层级文件夹遍历(Zjmainstay原创)
2012/07/31 PHP
php初始化对象和析构函数的简单实例
2014/03/11 PHP
实例:尽可能写友好的Javascript代码
2006/10/09 Javascript
jquery实现带复选框的表格行选中删除时高亮显示
2013/08/01 Javascript
jquery text()方法取标签中的文本
2014/07/25 Javascript
js调试工具console.log()方法查看js代码的执行情况
2014/08/08 Javascript
Windows系统下Node.js的简单入门教程
2015/06/23 Javascript
JS弹出新窗口被拦截的解决方法
2016/08/09 Javascript
实现easyui的datagrid导出为excel的示例代码
2016/11/10 Javascript
Bootstrap基本组件学习笔记之input输入框组(9)
2016/12/07 Javascript
Jquery把获取到的input值转换成json
2017/05/15 jQuery
Angular2使用Angular CLI快速搭建工程(一)
2017/05/21 Javascript
Vue学习笔记进阶篇之函数化组件解析
2017/07/21 Javascript
vue.extend实现alert模态框弹窗组件
2018/04/28 Javascript
Vue.js 中取得后台原生HTML字符串 原样显示问题的解决方法
2018/06/10 Javascript
vue基础之事件简写、事件对象、冒泡、默认行为、键盘事件实例分析
2019/03/11 Javascript
mpvue开发音频类小程序踩坑和建议详解
2019/03/12 Javascript
Python实现删除排序数组中重复项的两种方法示例
2019/01/31 Python
Django 用户认证组件使用详解
2019/07/23 Python
pytorch 常用线性函数详解
2020/01/15 Python
实现ECharts双Y轴左右刻度线一致的例子
2020/05/16 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
2020/06/18 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
2020/07/02 Python
用CSS3实现背景渐变的方法
2015/07/14 HTML / CSS
Footshop乌克兰:运动鞋的最大选择
2019/12/01 全球购物
正宗的澳大利亚Ugg靴子零售商:UGG Express
2020/04/19 全球购物
如何在Oracle中查看各个表、表空间占用空间的大小
2015/10/31 面试题
Ajax的优点和缺点
2014/11/21 面试题
大学生饮食连锁店创业计划书
2014/01/17 职场文书
小班下学期评语
2014/05/04 职场文书
优秀毕业生求职信
2014/06/05 职场文书
2015年元旦晚会活动总结(学生会)
2014/11/28 职场文书
食堂卫生管理制度
2015/08/04 职场文书
有关浪费资源的建议书
2015/09/14 职场文书
MySQL系列之五 视图、存储函数、存储过程、触发器
2021/07/02 MySQL
xhunter1.sys可以删除嘛? win11提示xhunter1.sys驱动不兼容解决办法
2022/09/23 数码科技