哔哩哔哩导航背景写法
个人对bilibili很感兴趣,也是平时学习和摸鱼的好地方
而且哔站的导航也做的很好玩,
如图(动图太大上传不了,效果就是背景图片跟随鼠标来移动)
然er自己想着白嫖一下代码,结果把度娘打到吐血她也不肯给我看源码(好像还没人闲的没事写这个东东…)
哔哩哔哩,点击这里
然后自己就琢磨了一下,大概模仿了一下
开始喽 ↓↓↓
( - - - 完整代码在最下面 - - - )
首先去b站扣需要的素材
然后简单的写一个盒子
<template><div class="home">/* 这里要加一个遮罩层,也就是覆盖在内容盒子上面的一个盒子,具体原因后面会说 */<div class="mask"></div><div class="nav"><div class="nav_item"><img src="../assets/1.png" class="img1"></div></div></div>
</template>
<style scoped lang="scss">
body {margin: 0;padding: 0;.mask {width: 100%;height: 175px;position: absolute;top: 0;z-index: 39;/* background: rgba(147,258,369,0.5); */}.nav {height: 175px;overflow: hidden;.nav_item {height: 100%;position: relative;overflow: hidden;img {/* 根据图片的实际大小来调整页面上的大小 */height: 200px;/* 定位是要图片根据鼠标移动而移动时要用的,自己有点菜,不知道js怎么用transfrom */position: absolute;bottom: 0;/* 根据图片的实际大小来调整页面上的位置(主要是想着跟人家一样) */transform: translateX(-200px);}}}
}
</style>
然后大概的样子就是这样
然后就要给他添加mousemove鼠标移动事件,跟随鼠标来移动(这里有个坑),这时候你肯定想只接在.nav的盒子上面写,但是当鼠标滑过图片时,在.nav盒子上的鼠标事件就会中断,所以在外层加了一个盒子来做遮罩层,所有的事件都放到遮罩层上面来进行↓↓↓
<template><div class="home">/* 这里要加一个遮罩层,也就是覆盖在内容盒子上面的一个盒子,具体原因后面会说 *//*这里也要加一个out,鼠标离开事件,让跟随鼠标移动的元素,在鼠标离开时复原*//*over事件是来获取鼠标最开始悬浮到盒子上时的坐标,用来计算盒子内图片跟随鼠标移动的距离*/<div class="mask" @mousemove="move" @mouseout="out" @mouseover="over"></div><div class="nav"><div class="nav_item"><img src="../assets/1.png" class="img1"></div></div></div>
</template>
<script>
export default {methods: {move(data) {/*获取图片*/this.img1 = document.getElementsByClassName('img1')/*改变图片绝对定位状态下的left*//*用盒子距离左边的值 减去 鼠标悬浮到盒子那一刻的 x轴的值 等于 盒子要跟随鼠标移动的值*//*除以1.2 是因为值太大,移动太快,具体根据b站来调整*//*改成负数,是因为图片是跟鼠标相反的方向移动的*/this.img1[0].style.left = -(data.screenX - this.overData)/1.2 + 'px'/*跟随鼠标移动时,把过度时间调为0,要不感觉有延迟*/this.img1[0].style.transition = 0 + 's'},out() {/*鼠标离开后,让图片回到原来的位置,这时候要加上过度时间,否则就唰~的一下直接回去了,不好看*/this.img[1].style.left = 0 + 'px'this.img[1].style.transition = 0.2 + 's'},over(data) {/*获取鼠标悬浮到盒子那一刻的x轴坐标,用来计算*/this.overData = data.x}}}
</script>
至此,一张图片跟随鼠标移动就完成了,然后,大致内容就是添加新的图片,然后Ctrl+C/V了,大概就是这样↓↓
<template><div class="home"><div class="mask" @mousemove="move" @mouseout="out" @mouseover="over"></div><div class="nav"><!-- 大背景--最后面/最远处 --><div class="nav_item"><img src="../assets/bg.png" class="img0 imgAll"></div><!-- 主图---两个人坐在树下 --><div class="nav_item"><img src="../assets/1.png" class="img1 imgAll"></div><!-- 左边的桥 --><div class="nav_item"><img src="../assets/2.png" class="img2 imgAll"></div><!-- 主图后方--滑到最右边 带樱花树的 过度图 --><div class="nav_item"><img src="../assets/3.png" class="img3 imgAll"></div><!-- 左边大樱花树--近景 --><div class="nav_item"><img src="../assets/bigTree.png" class="img4 imgAll"></div><!-- 右边大柳枝--近景 --><div class="nav_item"><img src="../assets/willow.png" class="img5 imgAll"></div></div>
</template>
<script>
export default {methods: {move(data) {this.img = document.getElementsByClassName('imgAll')this.img0 = document.getElementsByClassName('img0')this.img0[0].style.left = -(data.screenX - this.overData)/20 + 'px'this.img0[0].style.transition = 0 + 's'this.img1 = document.getElementsByClassName('img1')this.img1[0].style.left = -(data.screenX - this.overData)/1.2 + 'px'this.img1[0].style.transition = 0 + 's'this.img2 = document.getElementsByClassName('img2')this.img2[0].style.left = -(data.screenX - this.overData)/3.3 + 'px'this.img2[0].style.transition = 0 + 's'this.img3 = document.getElementsByClassName('img3')this.img3[0].style.left = -(data.screenX - this.overData)/2.5 + 'px'this.img3[0].style.transition = 0 + 's'this.img4 = document.getElementsByClassName('img4')this.img4[0].style.left = -(data.screenX - this.overData) * 1.9 + 'px'this.img4[0].style.transition = 0 + 's'this.img5 = document.getElementsByClassName('img5')this.img5[0].style.left = -(data.screenX - this.overData) + 'px'this.img5[0].style.transition = 0 + 's'},out() {/*因为每张图片都要加过渡和还原,就简单做了循环*/for(let i = 0;i < this.img.length; i++) {this.img[i].style.left = 0 + 'px'this.img[i].style.transition = 0.2 + 's'}},over(data) {this.overData = data.x}
}
</script>
<style scoped lang="scss">
body {margin: 0;padding: 0;.mask {width: 100%;height: 175px;position: absolute;top: 0;z-index: 39;/* background: linear-gradient(#000,#333,#666,#999,#fff,#f4f4f4); *//* opacity: 0.1; */}.nav {height: 175px;overflow: hidden;position: relative;.img0 {height: 204px;position: absolute;bottom: 2px;transform: translateX(-33%);z-index: 1;}.img1 {height: 205px;position: absolute;bottom: -15px;transform: translateX(-175px);z-index: 19;}.img2 {height: 200px;position: absolute;bottom: -13px;transform: translateX(-37.3%);z-index: 18;}.img3 {height: 143px;position: absolute;bottom: 0px;transform: translateX(25.7%);z-index: 18;}.img4 {height: 204px;position: absolute;bottom: -20px;transform: translateX(-68%);z-index: 20;filter: blur(1.5px);}.img5 {height: 240px;position: absolute;bottom: -20px;transform: translateX(520%);z-index: 20;filter: blur(1.5px);}}
}
</style>
在写图片的样式时,要注意图片的宽高,可以在b站去看具体是多少,还要注意图片的z-index,因为用到了定位,根据原版来确定各个图片的层级
↓
↓
↓
因为有些图片会有淡出淡入的效果,然后没想起来该怎么处理,所以就用了笨方法↓↓↓
this.img9 = document.getElementsByClassName('img9')this.img9[0].style.left = (data.screenX - this.overData)/100 + 'px'this.img9[0].style.transition = 0 + 's' if(this.img9[0].style.left <= 0 + 'px') {this.img9[0].style.opacity = 0} else if(this.img9[0].style.left > 1 + 'px' && this.img9[0].style.left<= 2 + 'px') {this.img9[0].style.opacity = 0.1} else if(this.img9[0].style.left > 2 + 'px' && this.img9[0].style.left<= 3 + 'px') {this.img9[0].style.opacity = 0.2} else if(this.img9[0].style.left > 3 + 'px' && this.img9[0].style.left<= 4 + 'px') {this.img9[0].style.opacity = 0.3} else if(this.img9[0].style.left > 4 + 'px' && this.img9[0].style.left<= 5 + 'px') {this.img9[0].style.opacity = 0.4} else if(this.img9[0].style.left > 5 + 'px' && this.img9[0].style.left<= 6 + 'px') {this.img9[0].style.opacity = 0.5} else if(this.img9[0].style.left > 6 + 'px' && this.img9[0].style.left<= 7 + 'px') {this.img9[0].style.opacity = 0.6} else if(this.img9[0].style.left > 7 + 'px' && this.img9[0].style.left<= 8 + 'px') {this.img9[0].style.opacity = 0.7} else if(this.img9[0].style.left > 8 + 'px' && this.img9[0].style.left<= 9 + 'px') {this.img9[0].style.opacity = 0.8} else if(this.img9[0].style.left > 9 + 'px' && this.img9[0].style.left<= 10 + 'px') {this.img9[0].style.opacity = 0.9} else if(this.img9[0].style.left > 10 + 'px' && this.img9[0].style.left<= 200 + 'px') {this.img9[0].style.opacity = 1}
这样就大概的模仿了一下人家的效果
然后好像没有其他要说的了 下面是全部代码
<template><div class="home"><div class="mask" @mousemove="move" @mouseout="out" @mouseover="over"></div><div class="nav"><!-- 大背景--最后面/最远处 --><div class="nav_item"><img src="../assets/bg.png" class="img0 imgAll"></div><!-- 主图---两个人坐在树下 --><div class="nav_item"><img src="../assets/1.png" class="img1 imgAll"></div><!-- 左边的桥 --><div class="nav_item"><img src="../assets/2.png" class="img2 imgAll"></div><!-- 主图后方--滑到最右边 带樱花树的 过度图 --><div class="nav_item"><img src="../assets/3.png" class="img3 imgAll"></div><!-- 左边大樱花树--近景 --><div class="nav_item"><img src="../assets/bigTree.png" class="img4 imgAll"></div><!-- 右边大柳枝--近景 --><div class="nav_item"><img src="../assets/willow.png" class="img5 imgAll"></div><!-- 左边带小亭子的山 + 河流 北背景 --><div class="nav_item"><img src="../assets/river.png" class="img6 imgAll"></div><!-- 最右边带树/船的 背景 --><div class="nav_item"><img src="../assets/right_tree.png" class="img7 imgAll"></div><!-- 俩船 --><div class="nav_item"><img src="../assets/ship_2.png" class="img8 imgAll"></div><!-- 会隐藏的船 --><div class="nav_item"><img src="../assets/ship.png" class="img9 imgAll"></div><!-- 放风筝背景 --><div class="nav_item"><img src="../assets/kite_bg.png" class="img10 imgAll"></div><!-- 拿着风筝的人 --><div class="nav_item"><img src="../assets/kite.png" class="img11 imgAll"></div><!-- 最风筝的人 --><div class="nav_item"><img src="../assets/kite_2.png" class="img12 imgAll"></div><!-- 两棵树 --><div class="nav_item"><img src="../assets/tree_2.png" class="img13 imgAll"></div><!-- 中间两个人 --><div class="nav_item"><img src="../assets/people.png" class="img14 imgAll"></div><!-- logo --><a href="https://www.bilibili.com/" class="logo" target="blank"><img src="../assets/logo.png"></a></div></div>
</template><script>export default {name: 'Home',data() {return {overData: ''}},methods: {move(data) {this.img = document.getElementsByClassName('imgAll')this.img0 = document.getElementsByClassName('img0')this.img0[0].style.left = -(data.screenX - this.overData)/20 + 'px'this.img0[0].style.transition = 0 + 's'this.img1 = document.getElementsByClassName('img1')this.img1[0].style.left = -(data.screenX - this.overData)/1.2 + 'px'this.img1[0].style.transition = 0 + 's'this.img2 = document.getElementsByClassName('img2')this.img2[0].style.left = -(data.screenX - this.overData)/3.3 + 'px'this.img2[0].style.transition = 0 + 's'this.img3 = document.getElementsByClassName('img3')this.img3[0].style.left = -(data.screenX - this.overData)/2.5 + 'px'this.img3[0].style.transition = 0 + 's'this.img4 = document.getElementsByClassName('img4')this.img4[0].style.left = -(data.screenX - this.overData) * 1.9 + 'px'this.img4[0].style.transition = 0 + 's'this.img5 = document.getElementsByClassName('img5')this.img5[0].style.left = -(data.screenX - this.overData) + 'px'this.img5[0].style.transition = 0 + 's'this.img6 = document.getElementsByClassName('img6')this.img6[0].style.left = -(data.screenX - this.overData)/18 + 'px'this.img6[0].style.transition = 0 + 's'this.img7 = document.getElementsByClassName('img7')this.img7[0].style.left = -(data.screenX - this.overData)/13 + 'px'this.img7[0].style.transition = 0 + 's'this.img8 = document.getElementsByClassName('img8')this.img8[0].style.left = -(data.screenX - this.overData)/17 + 'px'this.img8[0].style.transition = 0 + 's' this.img9 = document.getElementsByClassName('img9')this.img9[0].style.left = (data.screenX - this.overData)/100 + 'px'this.img9[0].style.transition = 0 + 's' if(this.img9[0].style.left <= 0 + 'px') {this.img9[0].style.opacity = 0} else if(this.img9[0].style.left > 1 + 'px' && this.img9[0].style.left<= 2 + 'px') {this.img9[0].style.opacity = 0.1} else if(this.img9[0].style.left > 2 + 'px' && this.img9[0].style.left<= 3 + 'px') {this.img9[0].style.opacity = 0.2} else if(this.img9[0].style.left > 3 + 'px' && this.img9[0].style.left<= 4 + 'px') {this.img9[0].style.opacity = 0.3} else if(this.img9[0].style.left > 4 + 'px' && this.img9[0].style.left<= 5 + 'px') {this.img9[0].style.opacity = 0.4} else if(this.img9[0].style.left > 5 + 'px' && this.img9[0].style.left<= 6 + 'px') {this.img9[0].style.opacity = 0.5} else if(this.img9[0].style.left > 6 + 'px' && this.img9[0].style.left<= 7 + 'px') {this.img9[0].style.opacity = 0.6} else if(this.img9[0].style.left > 7 + 'px' && this.img9[0].style.left<= 8 + 'px') {this.img9[0].style.opacity = 0.7} else if(this.img9[0].style.left > 8 + 'px' && this.img9[0].style.left<= 9 + 'px') {this.img9[0].style.opacity = 0.8} else if(this.img9[0].style.left > 9 + 'px' && this.img9[0].style.left<= 10 + 'px') {this.img9[0].style.opacity = 0.9} else if(this.img9[0].style.left > 10 + 'px' && this.img9[0].style.left<= 200 + 'px') {this.img9[0].style.opacity = 1}this.img10 = document.getElementsByClassName('img10')this.img10[0].style.left = -(data.screenX - this.overData)/1.9 + 'px'this.img10[0].style.transition = 0 + 's'this.img11 = document.getElementsByClassName('img11')this.img11[0].style.left = -(data.screenX - this.overData)/100 + 'px'this.img11[0].style.transition = 0 + 's'if(this.img11[0].style.left <= 0 + 'px') {this.img11[0].style.opacity = 0} else if(this.img11[0].style.left > 1 + 'px' && this.img11[0].style.left<= 2 + 'px') {this.img11[0].style.opacity = 0.2} else if(this.img11[0].style.left > 2 + 'px' && this.img11[0].style.left<= 3 + 'px') {this.img11[0].style.opacity = 0.5} else if(this.img11[0].style.left > 3 + 'px' && this.img11[0].style.left<= 4 + 'px') {this.img11[0].style.opacity = 0.8} else if(this.img11[0].style.left > 4 + 'px' && this.img11[0].style.left<= 5 + 'px') {this.img11[0].style.opacity = 1}this.img12 = document.getElementsByClassName('img12')this.img12[0].style.left = -(data.screenX - this.overData)/100 + 'px'this.img12[0].style.transition = 0 + 's'if(this.img12[0].style.left <= 0 + 'px') {this.img12[0].style.opacity = 0} else if(this.img12[0].style.left > 1 + 'px' && this.img12[0].style.left<= 2 + 'px') {this.img12[0].style.opacity = 0.2} else if(this.img12[0].style.left > 2 + 'px' && this.img12[0].style.left<= 3 + 'px') {this.img12[0].style.opacity = 0.5} else if(this.img12[0].style.left > 3 + 'px' && this.img12[0].style.left<= 4 + 'px') {this.img12[0].style.opacity = 0.8} else if(this.img12[0].style.left > 4 + 'px' && this.img12[0].style.left<= 5 + 'px') {this.img12[0].style.opacity = 1}this.img13 = document.getElementsByClassName('img13')this.img13[0].style.left = -(data.screenX - this.overData)/1.9 + 'px'this.img13[0].style.transition = 0 + 's'this.img14 = document.getElementsByClassName('img14')this.img14[0].style.left = -(data.screenX - this.overData)/1.2 + 'px'this.img14[0].style.transition = 0 + 's'},out() {for(let i = 0;i < this.img.length; i++) {this.img[i].style.left = 0 + 'px'this.img[i].style.transition = 0.2 + 's'}this.img9[0].style.opacity = 0this.img11[0].style.opacity = 0this.img12[0].style.opacity = 0this.img14[0].style.opacity = 1},over(data) {this.overData = data.x}}
}
</script>
<style scoped lang="scss">
body {margin: 0;padding: 0;.mask {width: 100%;height: 175px;position: absolute;top: 0;z-index: 39;/* background: linear-gradient(#000,#333,#666,#999,#fff,#f4f4f4); *//* opacity: 0.1; */}.nav {height: 175px;overflow: hidden;position: relative;.img0 {height: 204px;position: absolute;bottom: 2px;transform: translateX(-33%);z-index: 1;}.img1 {height: 205px;position: absolute;bottom: -15px;transform: translateX(-175px);z-index: 19;}.img2 {height: 200px;position: absolute;bottom: -13px;transform: translateX(-37.3%);z-index: 18;}.img3 {height: 143px;position: absolute;bottom: 0px;transform: translateX(25.7%);z-index: 18;}.img4 {height: 204px;position: absolute;bottom: -20px;transform: translateX(-68%);z-index: 20;filter: blur(1.5px);}.img5 {height: 240px;position: absolute;bottom: -20px;transform: translateX(520%);z-index: 20;filter: blur(1.5px);}.img6 {height: 204px;position: absolute;bottom: -15px;transform: translateX(-10.24%);z-index: 2;}.img7 {height: 183px;position: absolute;bottom: -5px;transform: translateX(44.55%);z-index: 3;}.img8 {width: 284px;height: 71px;position: absolute;bottom: 0px;transform: translateX(521%);z-index: 3;}.img9 {width: 233px;height: 96px;position: absolute;bottom: 0px;transform: translateX(470%);z-index: 3;opacity: 0;}.img10 {height: 92px;position: absolute;bottom: -14.9px;transform: translateX(-11.7%);z-index: 4;}.img11 {width: 225px;height: 157px;position: absolute;bottom: -9px;transform: translateX(430%);z-index: 18;opacity: 0;}.img12 {width: 66px;height: 116px;position: absolute;bottom: -9px;transform: translateX(1670%);z-index: 18;opacity: 0;}.img13 {width: 307px;height: 129px;position: absolute;bottom: 7px;transform: translateX(220%);z-index: 5;}.img14 {width: 476px;height: 167px;position: absolute;bottom: -12px;transform: translateX(197%);z-index: 20;}.logo {position: absolute;z-index: 39;width: 185px;height: 88px;bottom: 10px;left: 6%;cursor: pointer;img {width: 100%;height: 100%;}}}
}
</style>
至于图片,得去b站自己扣了,因为第一次发这个,不知道在哪上传文件,每张图片我都加了备注,注意图片名字就好
人家的原版呢,是用的canvas来绘制的,然er这个东东我只会一点点,不知道在这里该怎么操作,就按自己理解的&&能够写出来的思路去写了,细节虽然达不到人家那样,但大体的效果是可以的,logo部分的问题暂时没想到什么解决方法,如果有大佬能够看到这里,求助~~!!
哔哩哔哩导航背景写法相关推荐
- 仿写哔哩哔哩的头部导航部分(HTML+CSS静态)
介绍 先来看看哔哩哔哩的头部导航部分效果,B站的头部导航背景图片使用的是动态叠加(变形和动画的效果),我们可以采用静态的图片的方式来实现背景图的部分 效果 来看看我的实现效果,是不是可以非常棒? 代码 ...
- python 导航框 | 哔哩哔哩推荐100万收藏的导航网页
import tkinter as tk import time from tkinter import * gwin=None import webbrowser def cmd(x): def i ...
- android仿抽屉动画效果,Android之仿哔哩哔哩客户端首页+抽屉式导航
本文使用Toobar+DrawerLayout+NavigationView仿哔哩哔哩客户端首页+抽屉式导航,同时实现了沉浸式状态栏的效果. 一.效果图 图片及图标色彩等没有刻意模仿,结构相同. 上图 ...
- Drag,drag,drag!拽出哔哩哔哩侧边导航组件
一.前言 文章主要以宏观的形式来聊哔哩哔哩侧边导航拖拽组件,非常适合正在渐进式学习VUE的你,适当的模仿开发项目是前端学习必须要有的技能.大多数人都知道的是,面试需要有自己的作品,而作品最重要的不是切 ...
- 哔哩哔哩弹幕网站大数据分析研究背景
哔哩哔哩(Bilibili)是一个普遍受欢迎的弹幕视频网站,它汇集了大量的用户生成内容,包括视频.评论.弹幕等.因此,对哔哩哔哩上的数据进行分析,有助于了解网络文化.用户行为和消费习惯等方面的信息.此 ...
- 【Vue项目】仿哔哩哔哩网页
一. 项目开发的背景 目前市面上,有一些以短视频为主的手机应用越来越多.如哔哩哔哩.抖音.小红书.快手.youtube,这些手机短视频软件应用,个人认为,之所以能拔地而起,主要是由于以下几点:1.门槛 ...
- 小程序实战--仿bilibil(哔哩哔哩)小程序
项目预览图 小程序?大改变? 之前就被朋友安利使用小程序,最近接近了小程序,发现了它竟然带来了一场"大革命". 简单说,它就是一个可以实现之前只能是原生态APP可以实现的效果和功能 ...
- 超详细!模仿哔哩哔哩搭建静态网页
Web静态页面开发实战学习总结 一.构思与前期准备 灵感来源于csdn博客上看到的其他人开发的模仿官方网站的开发文档,同时鉴于自己喜欢二次元的风格.决定自主设计出一个模仿哔哩哔哩·的低配版哔哩哔哩网页 ...
- 哔哩哔哩Allen前端vue后台管理系统笔记
哔哩哔哩Allen前端vue后台管理系统笔记 Element ui 引入 全局引入 按需引入 嵌套路由 左侧菜单栏的样式 Container布局,左侧菜单栏commonAside组件 commonAs ...
最新文章
- 像素位移_1亿像素放大也清晰 OPPO Ace2超清四摄解析
- 【转】对服务采购订单的条目确认
- 使用CImage双缓冲
- python运算符号输入_【Python】【运算符】
- flex 正则表达式匹配规则
- 工具篇:金蝶K3工具下载
- Struts2面试题
- python 普通克里金(Kriging)法
- 微信如何查看是否被删好友,这4种方法简单快捷!
- vue.js毕业设计,基于vue.js前后端分离教室预约系统(H5移动项目) 开题报告
- WPF 实现圆形进度条
- REDIS哨兵【Sentinel】模式+哨兵的核心知识点+redis哨兵主从切换的数据丢失问题+上一章铺垫的【异步复制数据丢失问题】+【集群脑裂】
- 全国大学生数学建模竞赛2012A题葡萄酒的评价MATLAB程序
- vscode设置背景护眼主题颜色、字体颜色不影响其他主题的颜色
- PCIe4.0扩展坞设备
- java基础改学C++(五)数组(2)字符串
- 程序猿和攻城狮(南大)
- 监控画面时间同步校准
- 用友研究院院长吕建伟:阿里云正在从IBM商业模式走向AWS商业模式
- 非对称加密与证书(上篇)