哔哩哔哩导航背景写法

本文介绍了如何模仿哔哩哔哩导航背景图片跟随鼠标移动的效果。作者通过添加mousemove事件到遮罩层实现图片移动,并提示需要注意图片的宽高和z-index。原始效果使用canvas绘制,而作者使用了简单的HTML和CSS实现。
摘要由CSDN通过智能技术生成

个人对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[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值