仿一个好玩的滑动效果

起因

昨天跑步的时候,看到一个app(华为手机自带的运动健康)上的滑动效果很有意思,回来之后就想着,能不能在dom上实现一下,于是有了这篇文章。首先看一下效果图,滑动下面的绿色滑块可以看到效果:

贴出app上的效果图,模仿效果可以说是差强人意吧:

实现

其实原理很简单,就是在小圆点移动时,计算数字和小圆点的距离,来控制数字的上升和下降。

首先,要使小圆点跟随鼠标移动起来:代码如下:

slide.addEventListener(‘mousedown‘, function(e){
  e.preventDefault()
  let left = parseInt(slide.style.left) || 0
  let startX = e.clientX
  // slider能移动的最远距离
  let maxLength = document.querySelector(‘.table‘).getBoundingClientRect().width - slideWidth
  function move(e){
    // move的逻辑

  }
  document.addEventListener(‘mousemove‘, move)

  document.addEventListener(‘mouseup‘, function(){
    document.removeEventListener(‘mousemove‘, move)
  })
})

这段代码监听了3个事件,mousedown,mouseup,mousemove,当鼠标按下时,触发滑块的mousedown事件,同时给document绑定了mousemove和mouseup事件,来使滑块可以跟着鼠标移动,当鼠标弹起时,使滑块不再随鼠标移动。

之所以在document元素上监听mousemove事件,是因为如果在滑块上监听,很容易由于鼠标滑动过快,造成鼠标离开滑块的区域,导致mousemove事件失效,而在document元素上监听就不会有这样的问题。接下来我们来看看move这个函数:

  function move(e){
    e.preventDefault()
    let moveX = e.clientX - startX
    if(left + moveX < 0 || left + moveX > maxLength) {
      return
    }
    newLeft = left + moveX
    let newCenterLeft = newLeft + slideWidth / 2
    slide.style.left = newLeft + ‘px‘
    // 控制数字的上升和下降
    // console.log(‘========‘)
    for(let label of labels){

      let dist = label.left - newCenterLeft
      // console.log(dist, slideWidth/2)
      if(Math.abs(dist) <= slideWidth / 2){
        label.el.style.top = Math.abs(dist) - slideWidth / 2 + ‘px‘
        label.el.style.opacity = 0.3 + Math.abs(1 - dist / (slideWidth / 2)) * 0.7
      } else {
        label.el.style.top = ‘0px‘
        label.el.style.opacity = 0.3
      }
    }
  }

move函数主要干了两件事,一个是改变滑块的位置,另一个是通过实时判断数字和滑块的距离来改变数字的高度。改变位置都是通过改变元素的left/top样式来实现的。在改变数字高度的实现上,偷了一点懒,从形状上看,滑块边缘是一个半圆形,因此数字距离底部的高度(y)和数字距离滑块圆心的距离(x)应该是一个非线性的关系,函数表达式:

y = Math.sqrt(R*R - x*x)// R是滑块边缘半径

在实现上直接线性转换了一下R-x。(完)

原文地址:https://www.cnblogs.com/imgss/p/9655845.html

时间: 2024-08-29 01:38:18

仿一个好玩的滑动效果的相关文章

仿qq会话列表滑动效果

一.功能分析 qq会话列表可以向左滑动,然后出现删除按钮 二.知识点 touch事件,css3的transform属性 三.实现思路 为每个列表项绑定touch事件,计算touch移动的距离,在touchmove事件中实现滑动,在touchend中判断touch移动的距离,根据距离大小判断删除按钮是否弹出 四.js代码 1 // 左滑列表项,删除按钮出现,右滑消失 2 window.onload = function(){ 3 //获取rem的值 4 sRem = document.queryS

jqery实现一个图标上下滑动效果

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> </head> <style type="text/css"> .contain-foot-nav { width: 33.3%; float: left; text-align: center; position: relative;}

android仿系统Launcher界面,实现分屏,左右滑动效果(ViewSwitcher)

ViewSwitcher代表了视图切换组件, 本身继承了FrameLayout ,可以将多个View叠在一起 ,每次只显示一个组件.当程序控制从一个View切换到另个View时,ViewSwitcher 支持指定动画效果. 为了给ViewSwitcher 添加多个组件, 一般通过ViewSwitcher 的setFactory 方法为止设置ViewFactory ,并由ViewFactory为之创建View 即可. 下面通过一个实例来介绍 ViewSwitcher的用法.(仿Android系统L

高仿微信对话列表滑动删除效果(转)

前言 用过微信的都知道,微信对话列表滑动删除效果是很不错的,这个效果我们也可以有.思路其实很简单,弄个ListView,然后里面的每个item做成一个可以滑动的自定义控件即可.由于ListView是上下滑动而item是左右滑动,因此会有滑动冲突,也许你需要了解下android中点击事件的派发流程,请参考Android源码分析-点击事件派发机制.我的解决思路是这样的:重写ListView的onInterceptTouchEvent方法,在move的时候做判断,如果是左右滑动就返回false,否则返

【转】高仿微信对话列表滑动删除效果--不错

原文网址:http://blog.csdn.net/singwhatiwanna/article/details/17515543 转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/17515543 前言 用过微信的都知道,微信对话列表滑动删除效果是很不错的,这个效果我们也可以有.思路其实很简单,弄个ListView,然后里面的每个item做成一个可以滑动的自定义控件即可.由于ListView是上下滑动而item是左右滑动,因

高仿微信对话列表滑动删除效果

前言 用过微信的都知道.微信对话列表滑动删除效果是非常不错的,这个效果我们也能够有. 思路事实上非常easy,弄个ListView.然后里面的每一个item做成一个能够滑动的自己定义控件就可以.由于ListView是上下滑动而item是左右滑动,因此会有滑动冲突.或许你须要了解下android中点击事件的派发流程,请參考Android源代码分析-点击事件派发机制.我的解决思路是这种:重写ListView的onInterceptTouchEvent方法,在move的时候做推断,假设是左右滑动就返回

关于高仿微信对话列表滑动删除效果代码优化

原文:http://blog.csdn.net/singwhatiwanna/article/details/17515543 最近公司项目需用到微信滑动拉出按钮的效果,发现一位牛人已经实现了相关效果,但控件仍与业务代码存有耦合,于是花了点时间做了些去耦合,并于此进行记录,以防遗忘. 个人认为耦合主要在于两点: 第一点是SlideListView中的onTouchEvent 通过获取item间接得到SlideView,但这样会引入外部数据类MessageItem.          @Overr

写了一个好玩的弹性列表效果

闲来没事,随遍写写,有需要的尽管拿去用. <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> #list{ width:302px; margin:50px auto; padding:0; list-style: none; } #list li{

分享一个购物车的demo(效果高仿饿了么软件的购物效果)

这次分享的是一个很常见的效果,凡是涉及到购物的app或者旅游类以及订餐类的app都有看到过这种效果,两个list view联动显示,添加购物车时的一个抛物线动画实现,以及图标或者item右上角的数字显示.下面是我空闲时候写的一个demo,界面比较陋,但是基本效果都实现了. 不多说,看效果图: 只对添加按钮做了监听,删除没去写(没什么必要). 讲一些主要的代码,想下载源码的可以去这里下载(https://github.com/bobge/LinkedListView.git): 左边的listvi