【前端 JavaScript WebAPI】 06 - 缓动动画 + JS动画特效+触屏事件

1. 动画函数封装

1.1 缓动效果原理

  1. 缓动动画就是让元素运动速度有所变化,最常见的是让速度慢慢停下来。
缓动动画

1.2 思路

  1. 让盒子每次移动的距离慢慢变小,速度就会慢慢落下来;

  2. 核心算法: (目标值 - 现在的位置) / 10 做为每次移动的距离步长

  3. 停止的条件是: 让当前盒子位置等于目标位置就停止定时器 ;

  4. 注意步长值需要取整 。

1.3 动画函数多个目标值之间移动

  1. 可以让动画函数从 800 移动到 500;

  2. 当我们点击按钮时候,判断步长是正值还是负值;

  3. 如果是正值,则步长往大了取整;

  4. 如果是负值,则步长 向小了取整。

案例:移动距离可以在 500 ~ 800
* {
      padding: 0;
      margin: 0;
    }

    div {
      position: absolute;
      left: 0;
      top: 0;
      width: 200px;
      height: 200px;
      background-color: skyblue;
      margin-top: 100px;
    }

<button class="btn-500">播放动画 + 500</button>
<button class="btn-800">播放动画 + 800</button>
<div></div>
// 回调函数 : 等上一件事执行完毕之后再执行的函数
  // 回调函数写到定时器结束的位置
  let btn_500 = document.querySelector('.btn_500');
  let btn_800 = document.querySelector('.btn_800');
  let div = document.querySelector('div');

  function animation(ele, target, callback) {
    // 在每次设置定时器之前清除对象中的默认定时器
    // 注意1
    clearInterval(ele.timer);
    ele.timer = setInterval(() => {
      // 计算缓动动画 步长
      let step = (target - ele.offsetLeft) / 10;
      // 判断如果是正值就向上取整 , 如果是负值就向下取整
      // 注意2
      step = step > 0 ? Math.ceil(step) : Math.floor(step);
      // 移动盒子
      ele.style.left = ele.offsetLeft + step + 'px';

      // 判断当前是否超出目标值 如果超出就清除定时器
      if (ele.offsetLeft === target) {
        clearInterval(ele.timer);
        // 在清除定时器之后 需要执行一个回调函数
        // 注意3
        if (callback) {
          callback();
        }
      }
    }, 10);
  }

  btn_500.addEventListener('click', function () {
    animation(div, 500, () => {
      div.style.backgroundColor = 'pink';
    });
  });

  btn_800.addEventListener('click', function () {
    animation(div, 800, () => {
      div.style.backgroundColor = 'purple';
    });
  })

  // 匀速动画 就是盒子当前的位置 + 固定值10

  // 缓动动画就是盒子当前的位置 + 变化的值(目标值  - 现在的值) / 10

1.4 动画函数添加回调函数

  1. 回调函数原理:函数可以作为一个参数。将这个函数作为参数传到另一个函数里面,当那个函数执行完之后,再执行传进去的这个函数,这个过程就叫做回调。

  2. 回调函数写的位置:定时器结束的位置。

2. 常见网页特效案例

2.1 案例:网页轮播图

  1. 网页轮播图:网页轮播图

2.2 节流阀

  1. 原因 : 防止轮播图按钮连续点击造成播放过快。

  2. 节流阀目的:当上一个函数动画内容执行完毕,再去执行下一个函数动画,让事件无法连续触发。

  3. 核心实现思路:利用回调函数,添加一个变量来控制,锁住函数和解锁函数。

  4. 开始设置一个变量 let flag= true;

  5. If(flag){flag = false; do something} 关闭水龙头

  6. 利用回调函数动画执行完毕, flag = true 打开水龙头

2.3 案例:返回顶部

2.4 案例:筋头云案例

  1. 案例:筋头云案例: 筋头云案例

3. 触屏事件

3.1 触屏事件概述

  1. 移动端浏览器兼容性较好,我们不需要考虑以前 JS 的兼容性问题,可以放心的使用原生 JS 书写效果,但是移动端也有自己独特的地方。比如触屏事件 touch(也称触摸事件),AndroidIOS 都有。

  2. touch 对象代表一个触摸点。触摸点可能是一根手指,也可能是一根触摸笔。触屏事件可响应用户手指(或触控笔)对屏幕或者触控板操作。

常见的触屏事件如下:
常见的触摸事件
div {
      width: 200px;
      height: 200px;
      background-color: pink;
    }
<div></div>
 /**
   *
   * 1. 手指触摸DOM元素 touchstart
   *
   * 2. 手指在元素身上移动 touchmove
   *
   * 3. 手指离开了元素  touchend
   */
  let div = document.querySelector('div');

  div.addEventListener('touchstart', () => {
    console.log('我摸摸你!');
  })

  div.addEventListener('touchmove', () => {
    console.log('我拖动你!');
  })

  div.addEventListener('touchend', () => {
    console.log('我走了!');
  })

3.2 触摸事件对象(TouchEvent)

  1. TouchEvent 是一类描述手指在触摸平面(触摸屏、触摸板等)的状态变化的事件。这类事件用于描述一个或多个触点,使开发者可以检测触点的移动,触点的增加和减少,等等

  2. touchstarttouchmovetouchend 三个事件都会各自有事件对象。

  3. 触摸事件对象重点我们看三个常见对象列表:

触摸事件三种常见的对象

3.3 案例:移动端拖动元素

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

推荐阅读更多精彩内容