js案例:节流阀、返回顶部案例、筋斗云案例

九、节流阀

防止轮播图按钮点击造成播放过快

9.1目的

当上一个函数动画内容执行完毕,再去执行下一个函数动画,使得事件无法连续触发。

9.2思路

利用回调函数,添加一个变量来控制,锁住函数和解锁函数。

  • 设置flag变量,初始值为true

  • 利用if判断,先将flag=false关闭节流阀,再执行事件

    if(flag){//关闭水龙头

    ​ flag=false;

    ​ do something;

    }

  • 最后,利用回调函数动画执行完毕,在将flag=true,打开节流阀

以此达到本张图片轮播完毕后,再切换下一张图片。

十、短路与

短路与的性质就是,当左边为真,才执行右边的。

所以

if(条件表达式){

​ 执行代码

}其中的执行代码只有一句时,就可以写成短路与的形式。

 // if (callback) {
            //     callback(); //回调函数
            // }
            callback && callback();

十一、返回顶部

滚动浏览器窗口到文档特定位置

10.1window.scroll(x,y)

表示让窗口滚动到的x坐标+y坐标

  • 为直接瞬移滚动,不带缓冲
  • 其中x,y不带单位
10.1缓动动画上下滚动

①把动画函数中的left相关值改为 --> 页面垂直滚动距离相关

②window.pageYOffset得到页面滚动的距离

animate.js(上下)
//缓动动画---上下滑动
function animate(obj, targt, callback) {
    // 当我们不断地点击按钮,元素的速度越来越快,因为开启了太多定时器
    // 解决方案,让元素只有一个定时器(清除上一个定时器,只保留当前的定时器)
    clearInterval(obj.timer);
    obj.timer = setInterval(function () {
        // 步长值
        // 把步长值改为正直 ,向上取整
        var step = (targt - window.pageYOffset) / 10;
        step = step > 0 ? Math.ceil(step) : Math.floor(step);
        if (window.pageYOffset == targt) {
            // 停止定时器
            clearInterval(obj.timer);
            // if (callback) {
            //     callback(); //回调函数
            // }
            callback && callback();
        }
        // 把每次+1这个步长值逐渐变小,步长公式  (目标位置值 - 现在的位置)/10 
        // obj.style.left = obj.offsetLeft + step + 'px';
        window.scroll(0,window.pageYOffset + step);//函数不带单位
    }, 15);
}
10.2筋斗云

1679745405636

  • 功能:

鼠标经过某个li,筋斗云跟到当前小li位置

鼠标离开这个li,筋斗云复原为原来的位置

鼠标点击了某个li,筋斗云就会留在这个li的位置

  • 思路:

①利用动画函数做动画效果

②原先筋斗云起始位置为0

③鼠标经过哪个小li,就将当前小li的offsetLeft值作为目标值

④鼠标离开后,就将目标值设为0

⑤鼠标点击哪个li,就将当前li存起来,赋做cloud的初始值

  • 定义current变量,存储cloud的当前位置,初始值0
  • 点击li后,将li.offsetLeft赋给current,使cloud会从当前点击的li为起点移动
html+css代码
<style>
    * {
        margin: 0;
        padding: 0
    }
    
    ul {
        list-style: none;
    }
    
    body {
        background-color: black;
    }
    
    .c-nav {
        width: 900px;
        height: 42px;
        background: #fff url(./rss.png) no-repeat right center;
        margin: 100px auto;
        border-radius: 5px;
        position: relative;
    }
    
    .c-nav ul {
        position: absolute;
    }
    
    .c-nav li {
        float: left;
        width: 83px;
        text-align: center;
        line-height: 42px;
    }
    
    .c-nav li a {
        color: #333;
        text-decoration: none;
        display: inline-block;
        height: 42px;
    }
    
    .c-nav li a:hover {
        color: white;
    }
    
    .cloud {
        position: absolute;
        left: 0;
        top: 0;
        width: 83px;
        height: 42px;
        background: url(./cloud.png) no-repeat;
        background-color: #fff;
    }
</style>
<body>
    <div id="c_nav" class="c-nav">
        <span class="cloud"></span>
        <ul>
            <li><a href="#">首页新闻</a></li>
            <li><a href="#">师资力量</a></li>
            <li><a href="#">活动策划</a></li>
            <li><a href="#">企业文化</a></li>
            <li><a href="#">招聘信息</a></li>
            <li><a href="#">公司简介</a></li>
            <li><a href="#">我是佩奇</a></li>
            <li><a href="#">啥是佩奇</a></li>
        </ul>
    </div>
筋斗云js代码
  • 因为要调用动画函数,所以要引入animate.js文件
 <script src="./animate.js"></script>
     <script>
        window.addEventListener('load',function(){
        //1.获取元素
        var cloud = document.querySelector('.cloud');
        var c_nav = document.querySelector('.c-nav');
        var ul = c_nav.querySelector('ul');
        //cloud原先的位置
        var current = 0; 
        //2.给所有li绑定事件
        for(var i = 0; i < ul.children.length;i++){
            //(1)鼠标经过,跟随至小li
            ul.children[i].addEventListener('mouseenter',function(){
                // cloud.style.left = this.offsetLeft + 'px'; 瞬间移动
                animate(cloud,this.offsetLeft);
            })
            //(2)鼠标离开,恢复至原位
            ul.children[i].addEventListener('mouseleave',function(){
                // cloud.style.left = 0 ;  瞬间移动
                animate(cloud,current);
            
            })
            //(3)鼠标点击,将当前li的位置赋值给cloud的初始位置
            ul.children[i].addEventListener('click',function(){
                console.log(this.offsetLeft);
                current = this.offsetLeft;
        
            })
        }
        })
     </script>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个基于uniapp的下拉分页节流案例: 1. 在页面的data中定义一个数组,用来存储分页数据: ``` data() { return { listData: [], currentPage: 1, // 当前页码 pageSize: 10, // 每页数据量 isLoading: false, // 是否正在加载数据 isFinished: false, // 是否已经加载完全部数据 } } ``` 2. 在页面的onLoad生命周期中,调用获取第一页数据的函数: ``` onLoad() { this.getDataList() } ``` 3. 实现获取数据的函数getDataList: ``` async getDataList() { if (this.isLoading || this.isFinished) return // 如果正在加载或已经加载完全部数据,则不再发起请求 this.isLoading = true // 设置正在加载标识 const res = await request({ url: '/api/list', data: { page: this.currentPage, pageSize: this.pageSize, }, }) this.isLoading = false // 请求完成后,取消正在加载标识 if (res.code === 0) { this.listData = [...this.listData, ...res.data] // 将新数据合并到原数据中 if (res.data.length < this.pageSize) { this.isFinished = true // 如果返回数据不足一页,则说明已经加载完全部数据 } else { this.currentPage++ // 否则,页码加一,继续加载下一页 } } else { uni.showToast({ title: res.msg || '请求出错', icon: 'none', }) } } ``` 4. 在滚动到底部时触发加载更多数据: ``` onReachBottom() { this.getDataList() } ``` 5. 实现下拉刷新,用于重新加载第一页数据: ``` onPullDownRefresh() { this.currentPage = 1 this.isFinished = false this.listData = [] this.getDataList() uni.stopPullDownRefresh() } ``` 6. 为了防止频繁触发滚动事件,可以使用lodash的throttle函数来进行节流处理: ``` import _ from 'lodash' export default { data() { return { // ... } }, onLoad() { this.getDataList() this.throttledGetDataList = _.throttle(this.getDataList, 1000) // 在mounted中定义节流函数 }, methods: { onScrollToLower() { this.throttledGetDataList() // 使用节流函数 }, // ... } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邓六日

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值