vue 实现钉钉官网的轮播图下面功能滚动排版CSS效果 |
您所在的位置:网站首页 › 钉钉作业发布不了 › vue 实现钉钉官网的轮播图下面功能滚动排版CSS效果 |
前言
最近在写PC端的业主端时候,发现传统的菜单栏比较丑,也不符合实际应用(功能页面并不多-展示为主) 偶然发现钉钉官网的效果挺有意思的,想着把这个效果复原过来,然后夸夸搜索了一番。 经过一顿的cv打法,加上修修补补把大概的效果整了出来,时间关系最基础的,剩下的可以自己补充 视频效果官网效果 细节1.代码中第二屏是300vh是3倍,试过很多遍,3倍滚动时效果最好不建议改,建议不显示滚动条(src/styles/index.scss)效果最好 ::-webkit-scrollbar { // 隐藏滚动条 display: none; /* Chrome Safari */ }2.代码中第二屏的3个class类名最好不要改,因为是根据这几个类名在获取DOM操作 3.代码中第二屏中 list-itme中的data-order="0"等于几(从0开始)控制动画盒子顺序,可以自己调试看效果 完整代码-可复制 生活意义-坦然面对生活并且接受她的事与愿违 export default { name: 'Dashboard', data() { return { animataionMap: new Map(), // 文字显示 titlemanifesto: false } }, created() {}, mounted() { this.updateMap(), this.updateStyle(), window.addEventListener('scroll', this.updateStyle) }, methods: { // 得出动画节点数值 createAnimation(scrollStart, scrollEnd, valueStart, valueEnd) { return (scroll) => { if (scroll = scrollEnd) { return valueEnd } return ( valueStart + ((valueEnd - valueStart) * (scroll - scrollStart)) / (scrollEnd - scrollStart) ) } }, getDomAnimation(scrollStart, scrollEnd, dom) { const list = document.querySelector('.list') scrollStart = scrollStart + dom.dataset.order * 300 const opacityAnimation = this.createAnimation( scrollStart, scrollEnd, 0, 1 ) // 基于当前滚动计算得出的透明度 const opacity = function (scroll) { return opacityAnimation(scroll) } const scaleAnimation = this.createAnimation( scrollStart, scrollEnd, 0.3, 1 ) const xAnimation = this.createAnimation( scrollStart, scrollEnd, list.clientWidth / 2 - dom.offsetLeft - dom.clientWidth / 2, 0 ) const yAnimation = this.createAnimation( scrollStart, scrollEnd, list.clientHeight / 2 - dom.offsetTop - dom.clientHeight / 2, 0 ) const transform = function (scroll) { return `translate(${xAnimation(scroll)}px,${yAnimation( scroll )}px) scale(${scaleAnimation(scroll)})` } return { opacity, transform } }, updateMap() { const items = document.querySelectorAll('.list-item') const playGround = document.querySelector('.playground') this.animataionMap.clear() const playGroundRect = playGround.getBoundingClientRect() // 开始动画的距离 const scrollStart = playGroundRect.top + window.scrollY // 结束动画的距离 相当于playground的高度 const scrollEnd = playGroundRect.bottom + window.scrollY - window.innerHeight for (const item of items) { this.animataionMap.set( item, this.getDomAnimation(scrollStart, scrollEnd, item) ) } // 打开遮罩层 // this.listmsk = true }, updateStyle() { const scroll = window.scrollY // 获取元素-改变背景颜色 const list = document.querySelector('.list') if (scroll > 2200 && scroll < 2862) { console.log('打开遮罩层') list.style.backgroundColor = 'rgba(23, 26, 29, 0.9)' // 显示文字 this.titlemanifesto = true; } else { console.log('关闭遮罩层') list.style.backgroundColor = '#063868' // 隐藏文字 this.titlemanifesto = false } console.log('scroll', scroll) for (let [dom, value] of this.animataionMap) { for (const cssProp in value) { dom.style[cssProp] = value[cssProp](scroll) } } } } } .conter { .flatly-itemone { height: 90vh; background-color: #fff; } .playground { height: 310vh; background-color: #063868; position: relative; .animation-container { display: flex; position: sticky; top: 0; height: 100vh; text { z-index: 999; color: red; } // 标题 .titlemanifesto { height: 50px; width: 1000px; position: absolute; left: 50%; top: 23%; transform: translate(-50%); // background-color: skyblue; text-align: center; color: #fff; font-family: PingFangSC-Medium; font-weight: 500; font-size: 30px; line-height: 50px; } .list { height: 550px; width: 1000px; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -28%); display: flex; flex-wrap: wrap; align-items: center; border-radius: 10px; padding: 15px 20px; opacity: 0.8; .list-item { width: 100px; height: 155px; border-radius: 10px; background-color: #fff; margin: 50px 30px; &:nth-child(2n - 1) { background-color: skyblue; } &:nth-child(2n) { background-color: rgb(111, 245, 111); } &:nth-child(3n) { background-color: orange; } } } } } }总结: 经过这一趟流程下来相信你也对 vue 实现钉钉官网的轮播图下面功能滚动排版CSS效果 有了初步的深刻印象,但在实际开发中我 们遇到的情况肯定是不一样的,所以我们要理解它的原理,万变不离其宗。加油,打工人! 什么不足的地方请大家指出谢谢 -- 風过无痕 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |