应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

视差特效的原理和实现方法

  前言本文的案例代码并非作者原创。本文主要讲解视差效果是如何实现的(原生三件套),本文并不涉及性能优化相关的知识点讲解(你就当我耍流氓吧)。本文会从原理讲起,然后结合多个案例由浅入深去实现最终效果。
  本文案例如图所示
  原理pc端的视差效果通常是根据鼠标、键盘、滚动条的变化和操作进行视觉上的差异化控制。移动端可能还会有重力陀螺仪之类的交互,本文不讲移动端。
  举些例子:鼠标移到屏幕左上方:某元素就飞到屏幕右下方(跟鼠标反着来)。页面往下滑动:背景图不动,文本元素等其他元素往上移动。
  实现
  理解了实现的原理,那实现的关键就是事件监听addEventListener了。
  简单例子
  先来一个简单的例子玩玩
  这个例子实现的效果是:鼠标往左移,元素就往右移;鼠标往上移,元素就往下移。
  style。box{width:200px;height:300px;background:lightblue;position:absolute;绝对定位}style
  当鼠标在页面左上方(加入x和y坐标分别是10和20),就设置元素在页面右下方(右:10,下:20)。
  就是根据《原理》里讲的那样去实现。
  如果不懂clientX和clientY,可以看看下面这篇文章:
  《JS之clientX,clientY,screenX,screenY,offsetX,offsetY区别测试关耳佳的博客CSDN博客clientx》
  注意:
  本例使用了right和left移动元素。之所以这样做,是为了从最简单的方式讲解和实现。
  实际开发中这会带来一定的布局问题和性能问题(会导致布局更改或重新绘制,并会导致动画不稳定。),推荐优先考虑使用transforms对元素进行移动等操作。
  进阶版
  好玩的交互除了移动元素外,还可以移动背景图位置、旋转元素等操作。
  同时还需要考虑元素的动画幅度。像上面的例子就完全没控制元素移动幅度,所以当鼠标移动到屏幕最右侧或者最底部的时候,元素就会超出屏幕。这也许不是一种好的操作体验。
  说到动画幅度,就要考虑参照物的事情。常见的参照物有浏览器宽高、容器宽高、容器位置等。
  比如这个例子:
  这个例子所操控的元素看上去很多,但其实逐层拆分,逐层控制起来就很简单。
  要考虑的因素包括:容器旋转背景图轻微移动人物跟随鼠标移动
  这里的参照物是鼠标位置与文档的宽高比例,并通过自己设置的公式来限制元素移动或旋转的范围。
  1、容器旋转
  创建一个p容器,设置了阴影。
  stylehtml,body{width:100;height:100;margin:0;padding:0;}body{display:flex;justifycontent:center;alignitems:center;}容器。card{width:175px;height:250px;borderradius:8px;boxshadow:0px10px20px20pxrgba(0,0,0,0。17);}style
  通过JS控制容器旋转
  获取容器元素constcarddocument。querySelector(。card)计算函数functioncomputedTransform(num,doc){return(numdoc4020)。toFixed(1)}给文档添加一个鼠标移动的事件监听document。addEventListener(mousemove,e{旋转容器card。style。transformrotateX({computedTransform(e。clientX,window。innerWidth)}deg)rotateY({computedTransform(e。clientY,window。innerHeight)}deg)})
  2、移动背景图
  添加背景图
  !省略部分重复代码style。card{width:175px;height:250px;borderradius:8px;boxshadow:0px10px20px20pxrgba(0,0,0,0。17);backgroundimage:url(。img3drspirited。jpg);backgroundrepeat:norepeat;backgroundposition:5050;backgroundsize:110110;}style
  这段css主要看最后添加的4行(background相关)。
  直接在css里通过backgroundimage添加一个背景图,背景图不重复,起始位置在中心,背景图比容器稍微大一点点,但不会超出容器。
  JS控制:背景图也跟随鼠标移动
  录制的GIF有点小问题,最后出现了鼠标残影,先将就看着效果吧。
  省略部分重复代码constcarddocument。querySelector(。card)计算functioncomputedBGPosition(num,doc){return(60Number((numdoc20)。toFixed(1)))}给文档添加鼠标移动的事件监听document。addEventListener(mousemove,e{移动背景card。style。backgroundPosition{computedBGPosition(e。clientX,window。innerWidth)}{computedBGPosition(e。clientY,window。innerHeight)}})复制代码
  这部分的移动幅度我控制在一个比较小的范围内,使用backgroundposition来控制背景图起始位置。
  再结合1、容器旋转的代码,就变成如下所示的效果:
  3、移动图片(人物)
  人物跟随鼠标移动
  完整代码stylehtml,body{width:100;height:100;margin:0;padding:0;}body{display:flex;justifycontent:center;alignitems:center;}容器。card{width:175px;height:250px;overflow:hidden;backgroundimage:url(。img3drspirited。jpg);backgroundrepeat:norepeat;backgroundposition:5050;backgroundsize:110110;transformorigin:5050;perspective:1800px;transformstyle:preserve3d;borderradius:8px;boxshadow:0px10px20px20pxrgba(0,0,0,0。17);}图片样式(小千)。cardimg{height:100;position:relative;top:25px;left:25px;}styleimgsrca2020imgdataimg。jpgdatasrcimg03。bs178。comcb1j66d19d83c6cb1ab8。jpgalt
  样式部分:容器:需要设置overflow:hidden;,图片在移动过程中超出的部分不展示人物图片:人物需要设置position:relative;,并且往下移动一点,这样可以隐藏下半身。
  JS部分:constimgcard。querySelector(img)计算translatefunctioncomputedTransform(num,doc){return(numdoc4020)。toFixed(1)}img。style。transformtranslateX({computedTransform(e。clientX,window。innerWidth)}px)translateY({computedTransform(e。clientY,window。innerHeight)}px)
  主要添加了这部分,通过鼠标当前位置和屏幕宽高来计算出图片移动的距离。
  终极版
  上面的进阶版讲解了实现视差效果的秘密。
  平时见到更加复杂的效果,其实可以把元素逐一拆分,逐一控制。
  比如本文的终极版效果:
  这部分的讲解都放在代码注释里,建议自己建一个项目来运行。
  有不懂的地方可以在评论区交流讨论。
  完整代码如下所示:style。pagex{width:1000px;height:700px;居中布局display:flex;justifycontent:center;alignitems:center;overflow:hidden;设置元素被查看位置的视图perspective:1800px;背景色(兼容性写法)background:642b73;background:lineargradient(tobottom,c6426e,642b73);}Popularh1{底部外边距marginbottom:30px;z轴偏移transform:translateZ(35px);字母间距letterspacing:1px;字号fontsize:32px;字体粗细fontweight:800;字体颜色color:3e3e42;}Moviesh3{底部外边距marginbottom:6px;z轴偏移transform:translateZ(25px);字号fontsize:16px;字体颜色color:eb285d;}卡片主容器。cards{行内块元素display:inlineblock;最小宽度minwidth:595px;内边距padding:30px35px;设置元素被查看位置的视图perspective:1800px;旋转基点transformorigin:5050;使被转换的子元素保留其3D转换transformstyle:preserve3d;圆角borderradius:15px;文本左对齐textalign:left;背景色background:fff;投影boxshadow:0px10px20px20pxrgba(0,0,0,0。17);}卡片。card{行内块元素display:inlineblock;宽width:175px;高height:250px;相对定位position:relative;隐藏溢出部分overflow:hidden;设置元素被查看位置的视图perspective:1200px;使被转换的子元素保留其3D转换transformstyle:preserve3d;z轴偏移transform:translatez(35px);过渡transition:transform200mseaseout;文本居中对齐textalign:center;圆角borderradius:15px;投影boxshadow:5px5px20px5pxrgba(0,0,0,0。6);}除了最后一个卡片之外的卡片。card:not(:lastchild){右侧外边距marginright:30px;}卡片的图片。cardimg{相对定位position:relative;高度height:100;}卡片背景。cardbg{bottom:50px;left:50px;position:absolute;right:50px;top:50px;旋转基点transformorigin:5050;transform:translateZ(50px);zindex:0;}幽灵公主图片。princessmononoke。cardimg{top:14px;right:10px;height:110;}幽灵公主背景。princessmononoke。cardbg{background:url(img3drmonobg。jpg)centercovernorepeat;}千与千寻图片。spiritedaway。cardimg{top:25px;}千与千寻背景。spiritedaway。cardbg{background:url(img3drspirited。jpg)centercovernorepeat;}哈尔的移动城堡图片。howlsmovingcastle。cardimg{top:5px;left:4px;height:110;}哈尔的移动城堡背景。howlsmovingcastle。cardbg{background:url(img3drhowlbg。jpg)centercovernorepeat;}卡片的文本内容。cardtext{弹性布局display:flex;主轴为垂直方向flexdirection:column;主轴居中对齐justifycontent:center;交叉轴的中点对齐alignitems:center;宽width:100;高height:70px;绝对定位position:absolute;堆叠顺序zindex:2;离底部距离bottom:0;背景色:渐变background:lineargradient(tobottom,rgba(0,0,0,0)0,rgba(0,0,0,0。55)100);}卡片的标题。cardtitle{底部外边距marginbottom:3px;设置左右10px内边距padding:010px;字号fontsize:18px;字体的粗细fontweight:700;字体颜色color:fff;}styleh3Moviesh3h1Popularh1!幽灵公主imgclasscardimgsrca2020imgdataimg。jpgdatasrcimg03。bs178。comcb1j42b3f77505194f97。jpgpclasscardtitlePrincessMononoke!千与千寻imgclasscardimgsrca2020imgdataimg。jpgdatasrcimg03。bs178。comcb1j66d19d83c6cb1ab8。jpgpclasscardtitleSpiritedAway!哈尔的移动城堡imgclasscardimgsrca2020imgdataimg。jpgdatasrcimg03。bs178。comcb1jd4e5b804db5b3672。jpgpclasscardtitleHowlsMovingCastle
  推荐
  日常开发中很少直接用原生的方式去实现视差效果的。
  这里推荐一个轻量JS动画库:anime。jsJavaScriptanimationengine
  这个库的用法太简单了,直接看《anime。js官方文档》就知道怎么用了,本文不进行讲解。

印太经济框架首轮会谈刚结束,印度就宣布退群,原因和中国有关?和特朗普相比,拜登在反华立场上有过之而无不及。为了拉拢亚洲国家围堵中国,美方组建印太经济框架(IPEF),这是美国2017年退出《跨太平洋伙伴协定》(TPP)后,为加强与印太国……北京小程序开发的必要性与重要性微信小程序应用,诞生于2017年,基于微信运行的手机应用。现如今,北京小程序开发如火如荼,不少企业都开发了属于自己的小程序,而且有不少企业的小程序也正在筹备当中。为什么现在这么……飞天奖红毯梅婷变脸王鸥绝美,孙俪黑丝拉跨,关晓彤又壮了11月1日,第33届电视剧飞天奖、第22届电视文艺星光奖的颁奖典礼隆重举行,红毯上也是星光熠熠,感觉好久都没有见过这么多明星大咖齐聚的红毯了!凭借《叛逆者》入围的童瑶朱一……杨洋时尚芭莎11月刊封面,穿背心秀好身材,绅士优雅又帅气满分闪闪发光的他杨洋最新杂志封面出炉,时尚芭莎11月刊的封面就是他。这是他第四次登上时尚芭莎,一身白毛衣软糯温暖,尽显成熟魅力。穿着白色背心,秀了一波好身材,这肌肉线条……温柔到骨子里的自愈文案1。发光不是太阳的专利,我是说你也可以。2。万物皆有裂痕,那是光照进来的地方。3。醉眼看人间,世事皆温柔。4。时光里山南水北,你我间人山人海。5。慢慢遇……人民日报里的神仙句子1,在心里种花,人生才不会荒芜。《人民日报》2,时代的考题已经列出,我们的答案正在写就。《人民日报》3,距离不是问题,相向而行才是关键。《人民日报》4,夜色难……孕检的重要性以前的人怀孕几乎都不会做孕检这些的,现在对于每个怀孕期间的女人来说,为了腹中胎宝宝能够健康的生长发育,除了良好的饮食和生活作息习惯外,还要定期进行孕检,这样才可以更好的了解到腹……濮阳市实验幼儿园举行国培计划中西部项目县级骨干教师培训班10月12日上午,国培计划(2022)中西部项目县级骨干教师培训班开班典礼在濮阳市实验幼儿园举行。濮阳市教育局党组成员、副局长孙腾海,濮阳市教育局教师教育科科长王章喜,濮阳市实……进入八九天之后,饮食要少荤多素,清淡营养,孩子爱吃今天已经是进入八九天的第4天了,民间有一句俗语,七九河开,八九燕来,九九加一九,耕牛遍地走,八九天时燕子从南方飞回来了,这个时候天气也转暖了,现在已经明显的感觉到空气中的凉风变……网友票选浪姐3门面担当,阿娇断层第一,28位姐姐人气差距大跟前两季不同,《浪姐3》不再设置场外投票。没有了粉丝打投,姐姐们最终能否成团,咖位、名气、路人缘成为决定性因素。第三季初舞台已于本月三号录完,十六日将录制第一轮公演。……在太阳系中,哪里的黄金最多?在太阳系中,哪里的黄金最多?要回答这个问题,我们首先需要弄清楚太阳系中的黄金是从哪里来的。根据科学界的主流观点,我们所处的宇宙诞生于大约138亿年前,在刚开始的时候,宇宙……辽宁一位女老师在班级中爆粗口被停职,为什么家长还说她很好导语:近几年来,我国对于教育事业十分的看重,陆陆续续地进行了许多的教育改革,这些教育改革,大多数都是针对义务教育阶段的孩子,为了减轻孩子们的压力,前后推出了双减政策,客户……
马来西亚各界期盼线下参展第20届东博会图为韦朝晖在第20届东博会全球路演(马来西亚站)现场致辞。东博会秘书处供图中新网南宁3月21日电(黄令妍)中国东盟博览会(以下简称东博会)秘书处秘书长韦朝晖率团于3月16……40006000预算,需求以渲染为主的主机推荐渲染是非常吃CPU性能的,因此需要将预算向CPU进行倾斜。2499根据需求以及40006000的整机预算,我觉得CPU可以选择一个十三代的I5处理器。13代I5处理器无论……未知全貌,不予置评未尝君苦,不劝大度1、未知全貌,不予置评未尝君苦,不劝大度2、尊重所有声音但只成为自己3、生活给你苦难,其实是在铺垫浪漫4、可以不万丈光芒,但不要停止发光5、不要因……河南人独特的鱼头酒,从头到尾108杯,看看你能坚持到第几杯若问我国的饮酒大省是哪些,想必酒友们脱口而出的就是东北、山东和内蒙了,其实除了这三省外,河南人的饮酒量在全国也是能排得上号的。不过,因每个城市的饮酒规矩不同,所以酒桌文化也略有……主播为霍格沃兹之遗游戏打造可同步手势的魔杖IT之家2月21日消息,YouTube频道That’sSoMo在最新一期视频中,分享了如何制作可在《霍格沃兹之遗》游戏中使用的魔杖。在硬件方面主要包括KanoWand和Rasp……草长莺飞二月天春韵草长莺飞二月天咋暖还寒各色蓓蕾在枝头偷偷孕育麦苗泛起青绿草儿从土里探出头来青青子衿浓浓春味朝阳映照春风拂面漫步田野抬眸一片金……62,首个决赛席位出炉,中国80后名将惨败止步,不敌46岁老2023斯诺克威尔士公开赛第一场半决赛,田鹏飞对阵罗伯特米尔金斯,最终,米尔金斯62大胜,率先杀入到了决赛!田鹏飞遭遇了一场惨败,遗憾止步,不敌米尔金斯,结果有些遗憾。中……陈飞宇塌房,古人塌房也嚣张这几天的瓜大家都吃到了吗?网络图片,侵权必删明星偶像黑料如潮,粉丝舆论一片哗然,一波又一波的瓜喂饱了上蹿下跳的猹。有人快乐吃瓜,有人却笑不出来。别问,问就是,……豫筑平安春警怡人,魏都公安与你温暖同行许昌市公安局魏都分局春警怡人春回大地万物复苏那一抹藏蓝犹如跳动的音符奏响了春天里和谐的乐章播撒了一串春天的警色春天的景美春天的警……开学了,与其跟孩子说上课要认真听讲,不如告诉他们具体方法家长百问百答文兰妈谈育儿纸上谈兵得不到真本领,投机取巧也学不到真知识,那些学习能力出色的孩子,都是在一点一滴的知识积累中厚积薄发孩子们终于开学了,学校门口也再……惠州市政协委员张文丽从四个方面促专精特新企业大发展点击查看专题报道。专精特新企业是制造业细分领域的单打冠军和配套专家,也是提升产业链供应链稳定性和竞争力的重要力量。作为制造业大市,惠州如何培育更多优质的专精特新企业?……人间理想型随身播放器索尼NWWM1AM2黑砖二代六年的时间,更新一款产品,这是什么概念?在科技高速发展的今天,特别是在数码领域,产品的更新换代节奏越来越快,每年都有新的产品,新的技术出现在市场当中。HIFI圈相对来说是……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网