模拟钉钉官网动画

实现思路:利用粘性定位sticky,以及滚动事件实现。首先我们应该设置滚动动画开始位置和结束位置 ,然后根据位置计算透明度或者transform,scale的值。

首先根据上述图线计算属性值,代码如下:

javascript 复制代码
function createAnimate(scrollStart, scrollEnd, valueStart, valueEnd) {
      return function (x) {
        if (x < scrollStart) {
          return valueStart;
        }
        if (x > scrollEnd) {
          return valueEnd;
        }
        const bili = (valueEnd - valueStart) / (scrollEnd - scrollStart);
        return bili * (x - scrollStart) + valueStart;
      };
    }

然后考虑到每个dom它的动画不是只有一个属性可能有多个,例如scale,opacity,transform等。然后应该将dom和属性存储到map集合中,key为dom,属性为value。

javascript 复制代码
const items = document.querySelectorAll('.list-item');
const animationMap = new Map();


const getTitleAnimation = (scrollStart, scrollEnd, dom) => {
      const opacityAnimation = createAnimate(scrollStart, scrollEnd, 1, 0);
      const yAnimation = createAnimate(scrollStart, scrollEnd, 0, -200);
      const transform = function (x) {
        return `translate(0,${yAnimation(x)}px)`;
      };
      const opacity = function (x) {
        return opacityAnimation(x);
      };
      return {
        transform,
        opacity,
      };
    };


const updateMap=()=>{
    for (const item of items) {
        animationMap.set(
          item,
          getTitleAnimation(scrollStart + 50, scrollEnd, item)
        );
      }
}

然后就是属性赋值:

javascript 复制代码
const updateStyles = () => {
      const scrollY = window.scrollY;
      for (const [dom, animations] of animationMap) {
        for (const prop in animations) {
          const value = animations[prop](scrollY);
          dom.style[prop] = value;
        }
      }
    };
updateStyles();
window.addEventListener('scroll', updateStyles);

全部代码访问: liuzicheng/web - Gitee.com

相关推荐
CIO_Alliance2 天前
鼎捷和钉钉系统集成破局:iPaaS成制造业破解“系统割裂”关键
人工智能·钉钉·ipaas·系统集成·制造业·企业数智化转型·零售电商
科技与数码3 天前
鸿蒙智能待办:钉钉学而思待办自动同步日历
华为·钉钉·harmonyos
roseonly_h4 天前
如何将钉钉微应用在浏览器打开
前端·钉钉
Miss roro5 天前
通用OA能不能替代专业法务系统?钉钉飞书和律杏法务云的实测对比
java·钉钉·飞书·法律科技·企业诉讼管理·法务管理系统
蓝速科技6 天前
蓝速科技智能会议预约屏:打通钉钉飞书,终结会议室“撞车”难题
科技·钉钉·飞书
tongyiixiaohuang12 天前
MySQL与钉钉数据同步的灵活高效方案详解
android·mysql·钉钉
伟大的大威15 天前
用 AI Agent 给已有测试套件加一层“无人值守“:Hermes + Claude Code + Playwright + 云效 + 钉钉
人工智能·钉钉·hermes
wjc123131316 天前
蓝印RPA|钉钉应用机器人Agent配置说明
机器人·钉钉·rpa
切糕师学AI21 天前
钉钉API双轨制升级:平台演进的两难抉择与技术哲学
架构·钉钉
令狐少侠201123 天前
创建钉钉企业内应用,钉钉AI助手操作钉钉文档
ai·钉钉