乐趣区

前端自学笔记第三篇完整链路思想createJsvuejs平滑滚动

一、完整链路的思想

作者文章链接

我在淘宝做前端的这三年 — 第二年:https://juejin.im/post/5c7daf…

ps: 作者的文章有三篇,涉及第一至第三年。我是看了快半个多小时,收益匪浅。建议大家花上一点时间好好看看

最大收获 - 完整链路思想

无论是职业发展,事业选择,还是生活的小事,是否值当的评判标准可以加上一条:完整链路

比如:这个项目赚钱,然后不断迭代,赚更多的钱,再迭代。。。循环下去。这就是个好的链路,是一个完整的闭环。而坏的链路是:产品原型就行不通,硬把项目开发完,很显然项目不赚钱,迭代后还是不赚钱,慢慢就不了了之了,还落得一地鸡毛。

预判未来多了一个标准

你可能会想,这个有什么,不就是鸡汤嘛。

其实不然,他的作用更大 体现在事情发生之前,体现在未雨绸缪。当我们做决策的时候,是需要综合各方信息,并结合未来的走势综合去判断。

有了完整联络的思想,可以把未来窜起来。如果这个链路是通的,说明这个方案(或者想法。。)的可行性比较高。如果初期链路预想都不通,那是否去做去执行,就要打上大大的问号。

完整链路 - 个人应用的栗子

我最近也用在自己身上

  1. 早睡早起就是个好习惯。之前我都是 12 点睡,8 点起。现在改为 11 点睡,7 点起。早上反而有 2 个左右时间学习或者做其他事情的时间。这个早睡早起的习惯,就比之前更可持续。
  2. 再比如,前端各种技术,先学那个,后学哪个。有了完整链路思想,就简单了。当然是目前最重要,而且对于后期的发展更有利的技术。(目前就是下面提到的动效 createJs 技术)。就不会乱学一通,跟无头苍蝇一样。
  3. 再举个栗子吧:自己做饭也是个很好的链路。饭做得好吃,就不喜欢去外面吃了。之后手艺变的更好,吃的花样也就越来越多,可持续的很。
    (ps: 做了几个礼拜的饭,确实觉得外面的饭菜越来越难吃了)

二、canvas 动效框架 createJs

使用教程链接

CreateJS 入门 — 注释详细到爆炸(My Style):https://juejin.im/post/5b4eff…

官网 API: http://www.createjs.cc/src/do…

心得

公司偏动效开发,而热门产品的动效使用的正是 createJs 技术。自己也很快要开发类似产品,相关的技术也要学起来,作为储备。

通过两三个早上的学习,createJs 学起来还是比 canvas 简单,毕竟他跟 vue 框架一样是封装好的,调取 api 即可。

本次学习 createJS 不同以往,之前主要是跟着别人的思路走:要么是纯教程或者视频。而跟着别人走,虽然看似节省时间,但对于技术的整体脉络会比较片面,只是掌握了教材中教的技术而已。

这次主要是看官方的文档,再去整理笔记,不断消化主要的 api。这种学习方式比上面的效率反而更高,学习方式也是可持续的。

当然这种学习方法也是有前提的,最好是官网文档比较齐全,入门教容易的,太难的还是其他的方法吧。

三、vue+js: 预览图随着滚动条平滑移动

技术要点

  1. 产品需求很简单,只是预览图能够拖动就行。想着顺便做一个随着滚动条移动的效果,这样体验会更好。
  2. 技术难点:
  • 在 mounted 中获取全局以及局部滚动条的高度
  • 因为是在 vue 项目中操作 dom,且不使用 jQuery 的情况下。要让滚动条平滑移动,这里采用的是网上分段的方法,然后递归去递增或者递减。
  • 涉及到向上和向下滚动,滚动的临界点,如果快速上下滚动,会发生抖动。我是加了锁,而且把临界点隔开几像素来避免。
  • 为了让滚动条始终保持在底部,可以采用:scrollTop=scrollHeight-clientHeight

代码参考

<template>
    <div class="content" ref='mobileRef'> // 固定高度
        <div class='content-scroll' ></div>
    </div>
</template>

<script>
    data () {
        return {once: true}
    },
    mounted() {
        // 监听页面内 div 元素滚动条
        // this.$refs.mobileRef.addEventListener('scroll', ()=>{//         console.log('scrollHeight', this.$refs.mobileRef.scrollHeight)
        //         if(this.form.backgroundImg) {
        //             this.$refs.mobileRef.scrollTop = this.$refs.mobileRef.scrollHeight 
        //         }
        //         console.log("scroll" + this.$refs.mobileRef.scrollTop)
        // }, false)
        this.$nextTick(function () {window.addEventListener('scroll', this.onScroll) // 监听滚动条
        })
    },
    methods: {onScroll () {
            let that = this
            let scrolled = document.documentElement.scrollTop || document.body.scrollTop // 获取滚动条 srcollTop
            let step = ''
            if(this.form.backgroundImg) {
                let divHeight =  that.$refs.mobileRef.scrollHeight // 左侧元素的滚动条高度
                let divClient = that.$refs.mobileRef.clientHeight // 滚动条本身的高度
                step =  divHeight/50  // 平滑滚动,设置了 50,后面设置定时器,每 10 秒变化一次
                if(scrolled <705 && this.once == false) {  // once 锁一定要是全局的,不能设置在方法 onScroll 中
                    smoothUp()} else if(scrolled >710 &&  this.once == true) { // 为了形成互斥效果,两边都需要判断 scrolled 的高度,以及互斥锁
                    smoothDown()}
         
                function smoothDown() {if(that.$refs.mobileRef.scrollTop <divHeight-divClient) { // divHeight-divClient 就是 srcollTOP 的最大高度
                        that.$refs.mobileRef.scrollTop += step
                        // 递归,会一直调用,直到 return false . 递归的出口是:that.$refs.mobileRef.scrollTop =divHeight-divClient
                        setTimeout(smoothDown, 10)                         
                    } else {setTimeout(()=>{  // 锁设置了定时器,主要是为了防止 scrolled 在 710 的节点出现快速上下滑动出现的抖动行为
                            that.once = false
                        }, 200 )
                    }
                }
                function smoothUp() {if(that.$refs.mobileRef.scrollTop > 0) {
                        that.$refs.mobileRef.scrollTop -= step
                        setTimeout(smoothUp, 10) // 递归的出口是:that.$refs.mobileRef.scrollTop = 0
                    } else {setTimeout(()=>{that.once = true}, 200 )
                    }
                }
            } 
        }
    }

</script>
退出移动版