滚动条滚动

自动化滚动实现

需求:实现一个自动化履历,页面加载,页面头部是信息栏,有状态显示和状态转动时间,出品人,开始时间,结束时间是自动化完成后显示。
下面是每一步骤的滚动,在每一步骤滚动前,需要有状态转动,有状态转动的时间,随着时间的滚动,日志显示,日志随着内容滚动,展示最新的日志,步骤完成,状态显示完成的,步骤计时器停止,步骤向上滚动一定的距离。

需求图:


p6.jpg

思路:
一. 首先解决状态转动效果,这个可以写css,完成后覆盖即可
二. 解决每一步骤完成后向上滚动一内容的高度,同理解决日志的问题
三.解决每个步骤的计时器。

实现需求:
1.先解决状态转动的效果
这一部分就是完全是css解决,利用css动画

HTML的代码

<div class="main-load-effect"
       ng-class="{successLoading:(autos.datasets.flowStatus=='Success'), failedLoading: (autos.datasets.flowStatus=='fail'),
                 startLoading:(autos.datasets.flowStatus == 'Running')}">
                 <span></span>
                 <span></span>
                 <span></span>
                 <span></span>
                 <span></span>
                 <span></span>
                 <span></span>
                 <span></span>
</div>

大致的意思就是通过span变为圆形,通过改变透明度来实现转动
css的代码

//头部转圈样式
//这个是一个容器
.main-load-effect {
  width:30px;
  height:30px;
  display: inline-block;
  vertical-align: middle;
  line-height: 40px;
  position:relative;

}
.main-load-effect span {
  display:inline-block;
  width:5px;
  height:5px;
  border-radius:50%;
  background:#48a5f4;
  position:absolute;
  -webkit-animation:loading 1.04s ease infinite;
}
// 通过 改变透明度实现转动效果
@-webkit-keyframes loading {
  0% {
    opacity:1;
  }
  100% {
    opacity:0.2;
  }
}
.main-load-effect span:nth-child(1) {
  left:0px;
  top:50%;
  margin-top:-2.5px;
  -webkit-animation-delay:0.13s;
}
.main-load-effect span:nth-child(2) {
  left:3px;
  top:5px;
  -webkit-animation-delay:0.26s;
}
.main-load-effect span:nth-child(3) {
  left:50%;
  top:0px;
  margin-left:-2.5px;
  -webkit-animation-delay:0.39s;
}
.main-load-effect span:nth-child(4) {
  top:5px;
  right:3px;
  -webkit-animation-delay:0.52s;
}
.main-load-effect span:nth-child(5) {
  right:0px;
  top:50%;
  margin-top:-2.5px;
  -webkit-animation-delay:0.65s;
}
.main-load-effect span:nth-child(6) {
  right:3px;
  bottom:5px;
  -webkit-animation-delay:0.78s;
}
.main-load-effect span:nth-child(7) {
  bottom:0px;
  left:50%;
  margin-left:-2.5px;
  -webkit-animation-delay:0.91s;
}
.main-load-effect span:nth-child(8) {
  bottom:5px;
  left:3px;
  -webkit-animation-delay:1.04s;
}
//头部转动结束
//最终样式
.successLoading {
  width:25px;
  height: 25px;
  background: green;
  border-radius: 50%;
  span{
    display: none;
  }
}
.failedLoading {
  width:25px;
  height: 25px;
  background: red;
  border-radius: 50%;
  span{
    display: none;
  }
}

实际的效果如下图所示:


image.png
  1. 完成滚动条
    完成滚动是需要滚动条滚动,js有滚动条事件,scroll()事件
    $(selector).scroll(function) 是scrolld的语法,function是触发的函数当滚动条滚动触发的函数,
    如:
$("div").scroll(
    function(){
        console.log(" 我滚啦");
}
)

当滚动条滚动就会打印出:“我滚啦”
也可以设置滚动条的初始高度 scrollTop
Element.scrollTop 属性可以获取或设置一个元素的内容垂直滚动的像素数。一个元素的 scrollTop 是可以去计算出这个元素最高高度距离它容器顶部的可见高度。当一个元素的容器没有产生垂直方向的滚动条,那它的 scrollTop 的值默认为0.
也就是说需要一个容器,需要给容器设置一个高度,只有内容过多,超过容器的高度才会出现滚动条,

 <div class="logAutoScroll" style="width:100%; height:80%;overflow-y: auto;" >
            <div class="logAutoContent">
              {{item.stepLog}}
            </div>
</div>

这是个日志,会随着stepLog的内容,填充容器,如果需要设置日志始终随着日志的滚动而滚动,只需要设置

var oLog =document.getElementsByClassName("logAutoScroll")[i];
var oLogContent =document.getElementsByClassName("logAutoContent")[i];
$(oLog).scrollTop(oLogContent.scrollHeight);

Element.scrollHeight 是计量元素内容高度的只读属性,包括overflow样式属性导致的视图中不可见内容。没有垂直滚动条的情况下,scrollHeight值与元素视图填充所有内容所需要的最小值clientHeight相同。包括元素的padding,但不包括元素的margin.
这样就可以一直设置为滚动条随着内容滚动

判定元素是否滚动到底

如果元素滚动到底,下面等式返回true,没有则返回false.

element.scrollHeight - element.scrollTop === element.clientHeight


image.png
  1. 解决每个步骤的计时器
    a.这个比较麻烦,因为工程使用的是angular,每一个步骤使用的是ng-repeat,也就是一个变量使用,如果改变一个变量,这样所有的步骤都会改变,这就需要给每一个步骤重新赋值一个变量,刚开始是这样想的,但是楼主技术不行,不会给每个步骤赋值一个新的不同的变量,请教一个大神才知道。
    可以写一个方法,把每个步骤的序号或者$index传进去,然后返回一个变量。这个变量也是动态生成的。
    动态生成变量:
self.datasets.steps.length这个是需要多少变量的长度
  //生成动态变量
            for(var j=0;j<self.datasets.steps.length;j++){
                self["step"+(j+1)] = 0;
            }

ng-repeat 中的变量是这样的 {{autos.getStepNum($index)}}
这样就是把$index 传进去的,在getStepNum()这个方法中这样写

      //根据stepsIndex动态返回相应的变量
            self.getStepNum = function (row) {
                console.log("row",row);
                switch(row) {
                    case row:
                        return self["step"+row];
                }
            };

这样就会得到几个不同的变量,分别是

self.step0
self.step1
self.step2
self.step3
self.step4

每个步骤的计时器只需要赋给对应的变量就行了,不会相互影响
计时器的计算,无非就是使用 setInterval使的一个变量一直增加
setInterval 有几种写法,我感觉是比较迷惑人的,一种是在内部直接写的

var time = setInterval(function(){
    self["step"]++;
    $scope.$evalAsync();
},1000);

另一种是需要写成函数的形式

var time = setInterval(data,1000);
            function data(){
                self["step"]++;
                $scope.$evalAsync();
            }

没有哪个是最好的,看个人喜好就可,上面的代码也正是定时器的写法,只不过写的简单些,每个步骤并未赋值一个刚才创建的变量。
化秒为分和小时

                            //self["timer"+(i+1)] 就是得到的秒数
                           var theSecond=parseInt(self["timer"+(i+1)]);
                            var theMinute=0;
                            var theHour=0;
                            if(theSecond>60){
                                theMinute=parseInt(theSecond/60);
                                theSecond=parseInt(theSecond%60);

                                if(theMinute>60){
                                    theHour=parseInt(theMinute/60);
                                    theMinute = parseInt(theMinute%60);
                                }
                            }

                            self["step"+(i+1)]=""+parseInt(theSecond);
                            $scope.$evalAsync();
                            if(theMinute>0){
                                self["step"+(i+1)]=""+parseInt(theMinute)+"分"+self["step"+(i+1)];
                                $scope.$evalAsync();
                            }
                            if(theHour>0){
                                self["step"+(i+1)]=""+parseInt(theHour)+"小时"+self["step"+(i+1)];
                                $scope.$evalAsync();
                            }

在这里面也有一段逻辑要思考,就是如何判断每个步骤正在跑或者已经完成,这就需要循环每个步骤的状态了,如果显示一个步骤正在跑,那么就启动计时器,日志开始滚动,如果每个步骤已经完成,就清除定时器,然后向上滚动一段距离,当所有的步骤都已经完成,再清除主定时器,或者失败也要清除主定时器,这段代码较长,在此不做粘贴,所有的代码已经上传到codepen

https://codepen.io/holyjunhui/pen/YENWaR

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 前言:实现固定宽高的div内容可滚动,但是又不因为滚动条的出现,影响页面美观 常规情况下,固定宽高的div滚动,默...
    流浪的三鮮餡阅读 2,589评论 0 3
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,725评论 1 92
  • 在异地努力打拼的年轻人们,常常感到孤独,归根结底是因为缺乏归属感!
    簇卡慕珑阅读 172评论 0 0
  • 近来梦不断,多忆从前事。 不知君可好,愿君无忧愁。
    亦子夕阅读 316评论 0 0
  • 人有六官:耳目鼻口舌心,六官即六管。 耳朵掌听,听一切声音,但不辨; 眼睛掌看,看尽人间百...
    百川归心阅读 680评论 1 7