浅谈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的实现回车键Enter切换焦点
Sep 14 Javascript
3款实用的在线JS代码工具(国外)
Mar 15 Javascript
js语法学习之判断一个对象是否为数组
May 13 Javascript
在Html中使用Requirejs进行模块化开发实例详解
Apr 15 Javascript
JavaScript读二进制文件并用ajax传输二进制流的方法
Jul 18 Javascript
基于jQuery实现选项卡效果
Jan 04 Javascript
JS中如何实现点击a标签返回页面顶部的问题
Jan 19 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
Oct 24 Javascript
JS使用canvas中的measureText方法测量字体宽度示例
Feb 02 Javascript
vue2配置scss的方法步骤
Jun 06 Javascript
layui实现鼠标移动到单元格上显示数据的方法
Sep 11 Javascript
JS+CSS实现炫酷光感效果
Sep 05 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
Laravel 4 初级教程之安装及入门
2014/10/30 PHP
ThinkPHP上使用多说评论插件的方法
2014/10/31 PHP
Yii2单元测试用法示例
2016/11/12 PHP
基于PHP+mysql实现新闻发布系统的开发
2020/08/06 PHP
jquery中load方法的用法及注意事项说明
2014/02/22 Javascript
选择复选框按钮置灰否则按钮可用
2014/05/22 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
2014/12/08 Javascript
浅析JavaScript访问对象属性和方法及区别
2015/11/16 Javascript
JS简单实现String转Date的方法
2016/03/02 Javascript
Winform客户端向web地址传参接收参数的方法
2016/05/17 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
2016/09/06 Javascript
jQuery实现手机版页面翻页效果的简单实例
2016/10/05 Javascript
JavaScript实现翻页功能(附效果图)
2017/02/16 Javascript
webstorm添加vue.js支持的方法教程
2017/07/05 Javascript
JavaScript hasOwnProperty() 函数实例详解
2017/08/04 Javascript
vue.js使用watch监听路由变化的方法
2018/07/08 Javascript
浅谈Vue.use的使用
2018/08/29 Javascript
JavaScript实现图片伪异步上传过程解析
2020/04/10 Javascript
原生javascript如何实现共享onload事件
2020/07/03 Javascript
Vue.js原理分析之nextTick实现详解
2020/09/07 Javascript
Openlayers测量距离与面积的实现方法
2020/09/25 Javascript
Python通过递归遍历出集合中所有元素的方法
2015/02/25 Python
python 随机生成10位数密码的实现代码
2019/06/27 Python
python实现按首字母分类查找功能
2019/10/31 Python
Python3的socket使用方法详解
2020/02/18 Python
python中用Scrapy实现定时爬虫的实例讲解
2021/01/18 Python
Html5实现移动端、PC端 刮刮卡效果
2016/06/30 HTML / CSS
施华洛世奇英国官网:SWAROVSKI英国
2017/03/13 全球购物
应届生文秘专业个人自荐信格式
2013/09/21 职场文书
财务部经理岗位职责
2014/02/03 职场文书
新闻编辑专业毕业自荐书范文
2014/02/05 职场文书
优秀护士先进事迹
2014/05/08 职场文书
亲子运动会的活动方案
2014/08/17 职场文书
小学生自我评价100字(15篇)
2014/09/18 职场文书
计算机实训报告总结
2014/11/05 职场文书
Python 键盘事件详解
2021/11/11 Python