看到b站的animation-banner效果太妙了,就自己也想仿写一个.去查了查资料鼓捣出来一个.

首先是成品展示

大家可能觉得这个效果看起来很复杂,其实拆开来看比较简单.
他的效果就是实现了一个镜头聚焦,那么我们分步骤进行讲解

step1

首先,让图层跟随鼠标进行移动,大家应该已经想到怎么办了,但是有个问题,每个图层跟随鼠标移动的距离不能相同,这里可以用循环进行移动距离的迭代.

step2

其次是让图层跟随鼠标的移动距离进行清晰度的变化,和上述的办法类似,也是构造一个函数来计算清晰度,可以看到,随着鼠标的移动,最后和靠前的图层清晰度都变低(后面称之为失焦点),而靠中间的图层清晰度变高(后面称之为聚焦点).我们可以知道,这个偏移距离和焦点的转移是有关系的


实际上这个函数有很好的选择,就是我们小学二年级就 学过的的二次函数,两端的数值大,中间的数值小,符合我们的要求.
然后我们利用图层的index把六个图层按顺序排列在x轴上,得到的y值就符合我们的要求了

这就是最核心的思路啦,那么我们就开始

首先获得六个图层
这里我就直接用b站的图了,因为咱菜鸡画不出来

放出来方便大家练习,侵删



<!-- 这就是我的html结构,很简单 --><header><div><img src="./img/bilibili-autumn-1.webp"></div><div><img src="./img/bilibili-autumn-2.webp"></div><div><img src="./img/bilibili-autumn-3.webp"></div><div><img src="./img/bilibili-autumn-4.webp"></div><div><img src="./img/bilibili-autumn-5.webp"></div><div><img src="./img/bilibili-autumn-6.webp"></div></header>
    body{margin: 0;//经典margin0}header{height: 155px;//给容器一个高度,防止高度坍塌position: relative;//开定位,六个图层需要以容器为坐标进行左右移动overflow: hidden;//因为图层需要移动,所以图层要略大于容器,容器要做溢出隐藏}header>div{position: absolute;top: 0;left: 0;width: 100%;height: 100%;display: flex;//直接flex居中,太美了这东西justify-content: center;align-items: center;--offset: 0px;//这里定义css的变量方便后面js的处理--blur: 2px;}header>div>img{display: block;width: 110%;//放大点,移动的时候不会有空白溢出height: 100%;object-fit: cover;transform: translateX(var(--offset));//变量的使用filter: blur(var(--blur));}

接下来就是js代码,可能我写的比较繁琐,但是实现的效果我觉得和b站的很像

var startX = 0
const images = document.querySelectorAll('header>div>img')//拿到img元素的数组document.querySelector('header').addEventListener('mouseover', (e)=>{startX = e.clientX//在鼠标移入的时候记录初始位置for (let [index, image] of images.entries()) {image.style.transition = 'none'//在每次鼠标进入的时候让每一项的渐变效果为none,防止鼠标移动时看起来不连贯}
})document.querySelector('header').addEventListener('mousemove', (e)=>{let offsetX = e.clientX - startX + 482//这里是保证初始值为482if(Math.abs(offsetX - 482) < 10)offsetX = 482//鼠标刚刚移动上去会产生很小的偏移,看起来效果就好像图层突然变换了位置,所以做了一个移动最小值检测,这样就没有问题了let percentage = offsetX / window.outerWidth//计算移动距离占视窗宽度的百分比,其实我们的主要目的是拿到这个东西let offset = 15 * percentage//把百分比放大合适的比例就能带入公式了let blur = 20//这里是二次函数公式中二次项的系数,20是比较合适的for (let [index, image] of images.entries()) {offset *= 1.3//每次循环对偏移位置进行迭代let blurValue = (Math.pow(((index / images.length - percentage)), 2) * blur)//每次循环对清晰度进行迭代,这里就使用了刚刚提到的二次函数的形式image.style.setProperty('--offset',`${offset}px`)//赋值回去,实现效果image.style.setProperty('--blur',`${blurValue}px`)}
})document.querySelector('header').addEventListener('mouseout', ()=>{//其实这里完全就是偷了个懒,直接用程序去计算初始位置,我测出来当offset为482的时候,初始效果看起来是最棒的,就不用看了下面的就是上面的公式而已let offsetX = 482let blur = 20let percentage = offsetX / window.outerWidthlet offset = 15 * percentagefor (let [index, image] of images.entries()) {offset *= 1.3blurValue = (Math.pow((index / images.length - percentage), 2) * blur)image.style.setProperty('--offset',`${offset}px`)image.style.setProperty('--blur',`${blurValue}px`)image.style.transition = 'all .3s ease'//给每一项加上渐变效果,图层会平滑回到初始位置,视觉效果不会太突兀}
})
window.addEventListener('load', () => {//这里就是在开始加载时计算初始位置.let offsetX = 482let blur = 20let percentage = offsetX / window.outerWidthlet offset = 15 * percentagefor (let [index, image] of images.entries()) {offset *= 1.3blurValue = (Math.pow((index / images.length - percentage), 2) * blur)image.style.setProperty('--offset',`${offset}px`)image.style.setProperty('--blur',`${blurValue}px`)}
})

其实上面完全没必要写那么冗长的代码,给每一项设置一个初始的偏移位置和初始清晰度就好了,这样代码也能简洁.大家可以自己想想怎么改,其实很简单.

参考了b站的
CodingStartup起码课

下面放出本人的完整代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>body{margin: 0;}header{height: 155px;position: relative;overflow: hidden;}header>div{position: absolute;top: 0;left: 0;width: 100%;height: 100%;display: flex;justify-content: center;align-items: center;--offset: 0px;--blur: 2px;}header>div>img{display: block;width: 110%;height: 100%;object-fit: cover;transform: translateX(var(--offset));filter: blur(var(--blur));}</style>
</head>
<body><header><div><img src="./img/bilibili-autumn-1.webp"></div><div><img src="./img/bilibili-autumn-2.webp"></div><div><img src="./img/bilibili-autumn-3.webp"></div><div><img src="./img/bilibili-autumn-4.webp"></div><div><img src="./img/bilibili-autumn-5.webp"></div><div><img src="./img/bilibili-autumn-6.webp"></div></header><script>var startX = 0
const images = document.querySelectorAll('header>div>img')document.querySelector('header').addEventListener('mousemove', (e)=>{let offsetX = e.clientX - startX + 482let percentage = offsetX / window.outerWidthlet offset = 15 * percentagelet blur = 20for (let [index, image] of images.entries()) {offset *= 1.3let blurValue = (Math.pow(((index / images.length - percentage)), 2) * blur)image.style.setProperty('--offset',`${offset}px`)image.style.setProperty('--blur',`${blurValue}px`)}
})
document.querySelector('header').addEventListener('mouseover', (e)=>{startX = e.clientXfor (let [index, image] of images.entries()) {image.style.transition = 'none'}
})document.querySelector('header').addEventListener('mouseout', ()=>{let offsetX = 482let blur = 20let percentage = offsetX / window.outerWidthlet offset = 15 * percentagefor (let [index, image] of images.entries()) {offset *= 1.3blurValue = (Math.pow((index / images.length - percentage), 2) * blur)image.style.setProperty('--offset',`${offset}px`)image.style.setProperty('--blur',`${blurValue}px`)image.style.transition = 'all .3s ease'}
})
window.addEventListener('load', () => {let offsetX = 482let blur = 20let percentage = offsetX / window.outerWidthlet offset = 15 * percentagefor (let [index, image] of images.entries()) {offset *= 1.3blurValue = (Math.pow((index / images.length - percentage), 2) * blur)image.style.setProperty('--offset',`${offset}px`)image.style.setProperty('--blur',`${blurValue}px`)}
})</script>
</body>
</html>

thanks for reading

b站首页banner景深移动特效 bilibili秋相关推荐

  1. 超好看的B站首页顶部景深动态特效源码

    简介: 我在网上找了很久才找到的源码,个人觉得这个效果很好看,自己对前端不是很懂的原因,没有在自己的网站添加,如果你喜欢的话就下载吧!B站首页顶部景深特效源码主要采用的是CSS+HTML,你可以把代码 ...

  2. xbanner 动画特效设置android,Axure教程:如何实现爱彼迎App首页Banner的切换效果

    原标题:Axure教程:如何实现爱彼迎App首页Banner的切换效果 本文分享一个用Axure实现爱彼迎App首页Banner切换效果的方法,供大家参考,欢迎一起交流. 作者最近闲暇时间试着将爱彼迎 ...

  3. banner特效php,jQuery自适应通栏宽屏banner幻灯片切换特效

    jQuery自适应通栏宽屏banner幻灯片切换特效 这是一款代码简洁的jQuery自适应通栏宽屏banner幻灯片切换特效,jQuery自适应全屏BANNER焦点图代码. js代码 $(" ...

  4. 仿B站首页头部动画的实现

    B站的前端样式一直是我学习和模仿的对象,特别是它的首页头部动画,可以随着鼠标的移动进行场景的变化,很酷,所以我对它进行了大体上的模仿 废话不多说,先看效果 仿B站首页动画演示 视频打不开点击这里 完整 ...

  5. B站首页内容运营分析

    B站首页内容浅析 我们为什么要换首页? B站首页 整体分析 排行榜 内容推荐 内容标签化 用户标签化 探索B站优质内容之源 我们为什么要换首页? 换首页的目的是什么?改善用户体验?提高首页留存?提升C ...

  6. 宽屏自适应php源码,jQuery+H5自适应通栏宽屏banner幻灯片切换特效

    jQuery+H5自适应通栏宽屏banner幻灯片切换特效 代码片段: function(){ $(this).find(".prev,.next").fadeOut() }); ...

  7. 记一次用canvas做出腾讯云首页banner流光效果的经历

    demo实现:线上效果 -------------------------- ↑↑↑以上正文  = v =   ↑↑↑ -------------------------- ↓↓↓以下废话  =.=  ...

  8. 知乎乱码、b站首页乱码、蓝奏云网盘打不开都是DNS惹的祸!修改设备的DNS

    知乎乱码.b站首页乱码.蓝奏云网盘打不开等问题,常常是连接WiFi的时候会出现,一旦将手机切换为蜂窝.或者给电脑用蜂窝热点这个问题就能解决: 接下来教一下大家如何修改自己设备的DNS,从而 修复知乎乱 ...

  9. 微擎模块 抖音口红机 3.2.0+wap登陆1.3.0增加首页banner跳转链接

    此版本是正版打包 加密模块 安装sg11加密 版本号:3.2.0 - H5版 10:46 1.增加首页banner跳转链接2.增加每天领取余额功能3.修复虚假会员添加功能4.优化 下载地址 http: ...

最新文章

  1. 专访小米欧阳辰:深度揭秘小米广告平台的构建、底层模块和坑
  2. 攻破JAVA NIO技术壁垒
  3. 【NOIP2013模拟】Vani和Cl2捉迷藏 题解代码
  4. python面向对象(2)—— 继承(1)
  5. 极度 YM....自己用trie写了个伪 map....( HDU 1075 )
  6. 关于滑轮组的计算机知识点,初中物理:滑轮及滑轮组知识点总结
  7. 基于Java的博客系统
  8. H3C交换机创建ssh用户登录和设置aux密码
  9. FreeRTOS学习教程整理
  10. CRACK秘籍之爆破
  11. 利用arcgis基本比例尺标准分幅编号流程
  12. js unshift性能分析
  13. 网络安全学习笔记6(批处理编写)
  14. 使用python opencv批量对贴图进行除透明边并压缩
  15. 服务器虚拟机的c盘怎么加,xp虚拟机c盘怎么扩容
  16. BUUCTF:[GXYCTF2019]佛系青年
  17. PG学习笔记(1)—— 主从复制:流复制
  18. Pantera Capital创始合伙人:最大遗憾是没有投资以太坊ICO
  19. 什么是IDC服务器租用?
  20. arcgis android 气泡,arcgis for js 通用气泡

热门文章

  1. IT运维管理之数据维护技术方案
  2. ios 图片简单360度旋转动画
  3. win10 开热点 【服务主机:网络服务】 疯狂跑流量的解决方案 亲测有效!!!!
  4. vue实现关系图(组织机构图谱)
  5. Java编程——subString,截取当前字符串的部分内容
  6. 反算坐标方位角小程序(c#)
  7. 告别刷量!公众号的正常阅读曲线是什么样的 ​
  8. python质因子分解_质因子分解_个人文章 - SegmentFault 思否
  9. 阿里云DMS添加ECS自建数据库
  10. 基于 Python 的地理空间绘图指南