vue中如何动态切换背景图片

最近想复习一下vue,就准备写一个后台练练手,开始写登陆页面时,感觉单一背景太单调了,就想着写一个动态切换的背景登录页,可是发现虽然变量定义了,效果却没实现,图片不显示,下面展示一下成功,以及错误代码,和正确代码

运行效果

错误代码

<template>
  <div id="login" :style="{backgroundImage:`url(${loginImage})`}">
      <div class="isbtn"  @click="change()">切换主题</div>
  </div>
</template>

<script>
export default {
  name: '',
  data() {
    return {
      imgindex:1,
      loginImage:('../assets/bgimg/5.jpg')
    };
  },
  computed:{
  },
  watch:{
  },
  methods: {
    change(){
       if(this.imgindex<10){
        this.imgindex+=1
        console.log(this.imgindex)
       }else{
        this.imgindex=1
       }
       this.loginImage=(`../assets/bgimg/${this.imgindex}.jpg`)
    }
  },
};
</script>

<style scoped lang="scss">
.isbtn{
  position: fixed;
  top: 50px;
  right: 40px;
  // background: red;
  color: #0aa1ed;
  // background: lightsalmon;
  font-size: 14px;
  padding: 5px;
  opacity: 0.8;
  cursor: pointer;
}

#login {
  width: 100vw;
  height: 100vh;
  overflow: hidden;
  position: relative;
  background-repeat: no-repeat;
  background-attachment: fixed;
  background-position: center;
  background-size: cover;
  
}


</style>
正确代码 后来查了查发现如果想要动态引入本地图片的话,需要加一个require引入,不然引入路径是一个字符串,不会被识别出来,具体可以再开发者模式看看有啥区别
<template>
  <div id="login" :style="{backgroundImage:`url(${loginImage})`}">
      <div class="isbtn"  @click="change()">切换主题</div>
  </div>
</template>

<script>
export default {
  name: '',
  data() {
    return {
      imgindex:1,
      loginImage:require('../assets/bgimg/5.jpg')
    };
  },
  computed:{
  },
  watch:{
  },
  methods: {
    change(){
       if(this.imgindex<10){
        this.imgindex+=1
        console.log(this.imgindex)
       }else{
        this.imgindex=1
       }
       this.loginImage=require(`../assets/bgimg/${this.imgindex}.jpg`)
    }
  },
};
</script>

<style scoped lang="scss">
.isbtn{
  position: fixed;
  top: 50px;
  right: 40px;
  // background: red;
  color: #0aa1ed;
  // background: lightsalmon;
  font-size: 14px;
  padding: 5px;
  opacity: 0.8;
  cursor: pointer;
}

#login {
  width: 100vw;
  height: 100vh;
  overflow: hidden;
  position: relative;
  background-repeat: no-repeat;
  background-attachment: fixed;
  background-position: center;
  background-size: cover;
  
}


</style>

### 实现 Vue动态设置 CSS 背景图片 #### 方法一:通过内联样式绑定 `:style` 可以利用 Vue 的数据绑定特性,在模板中直接使用 `v-bind` 或者简写形式 `:` 来为元素添加内联样式。这种方式适合于当背景图像路径存储在一个 JavaScript 变量中的场景。 ```html <div v-bind:style="{ backgroundImage: 'url(' + imageUrl + ')', backgroundSize:'cover', backgroundPosition:'center' }"></div> ``` 其中 `imageUrl` 是定义在组件的数据对象内的字符串类型的变量,用于保存要加载的图片 URL 地址[^1]。 #### 方法二:基于条件切换类名 如果存在有限数量的不同背景图案,则可以通过预先定义好对应的 CSS 类,并依据某些逻辑判断来决定应用哪个类到目标 DOM 元素上来达到目的。这通常适用于有固定几种不同状态的情况。 ```css /* 定义多个不同的背景 */ .bg-img0 { background-image: url('../assets/images/title0.png'); } .bg-img1 { background-image: url('../assets/images/title1.png'); } .bg-img2 { background-image: url('../assets/images/title2.png'); } <!-- 使用 v-bind:class 绑定 --> <div v-bind:class="'bg-img' + index"> </div> ``` 这里假设有一个名为 `index` 的数值型变量用来指示当前应该使用的哪一张背景图。 #### 方法三:借助计算属性或方法构建完整的 style 对象 对于更复杂的业务需求,比如根据 API 返回的结果或者其他复杂规则生成最终的样式表单,那么可以在 script 部分创建一个 computed 属性或者 methods 函数来进行处理: ```javascript export default { data() { return { images: [ require('@/assets/images/title0.png'), require('@/assets/images/title1.png'), require('@/assets/images/title2.png') ], currentIndex: 0, } }, computed: { dynamicStyle() { const imgSrc = this.images[this.currentIndex]; return { 'backgroundImage': `url(${imgSrc})`, 'background-size': 'cover', 'background-position': 'center' }; } } }; ``` 之后再 HTML 模板里像这样调用它: ```html <div :style="dynamicStyle"></div> ``` 这种方法不仅能够保持代码整洁度高而且易于维护更新[^4]。 为了确保背景图片能正常显示,建议总是指定 `background-position` 和 `background-size` 这两个重要的 CSS 属性,因为它们有助于控制图片的位置以及缩放方式,从而避免可能出现的渲染问题[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值