基于Vue.js实现简洁的多屏切换效果

 更新时间:2024年09月09日 11:28:43   作者:清空代码  
在实际开发中,多屏切换是常见的需求,尤其是在需要展示大量内容或信息时,下面我将向大家展示我是如何实现三屏,并通过动态按钮控制切换屏幕的,感兴趣的小伙伴跟着小编一起来看看吧

准备工作

在开始之前,请确保你已经安装了 Vue CLI。我们将使用以下命令创建一个新的 Vue.js 项目,并运行:

vue create screen-switcher
cd screen-switcher
npm run serve

实现多屏布局

首先,我们需要定义多个屏幕,并确保每个屏幕占据整个视口的宽度和高度。我们将使用 CSS 的 vw 和 vh 单位来保证每个屏幕自适应设备尺寸。

<div class="screens">
  <div class="screen left-screen">
    <h1>左屏</h1>
  </div>
  <div class="screen center-screen">
    <h1>中屏</h1>
  </div>
  <div class="screen right-screen">
    <h1>右屏</h1>
  </div>
</div>

每个屏幕都使用 flex 布局进行居中,确保内容能够完美显示在屏幕中央。

.screen {
  width: 100vw;
  height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 3em;
}

实现动态屏幕切换

通过 Vue.js 的 data 和 methods,我们可以根据用户的操作来动态切换屏幕。我们使用 translateX 属性让屏幕在水平方向上滑动。

export default {
  data() {
    return {
      currentScreen: 1, // 当前显示的屏幕索引,默认为中屏
    };
  },
  methods: {
    switchScreen(screenIndex) {
      this.currentScreen = screenIndex; // 切换到指定屏幕
    },
  },
};

通过动态绑定 transform,我们可以在用户切换屏幕时平滑过渡。

<div class="screens" :style="{ transform: `translateX(-${currentScreen * 100}vw)` }"></div>

添加用户交互与按钮

接下来,在页面底部添加切换屏幕的按钮。当用户鼠标悬停在按钮区域时,按钮会平滑显示,允许用户切换不同的屏幕。

<div class="controls" @mouseover="showButtons = true" @mouseleave="showButtons = false">
  <transition name="fade">
    <div v-if="showButtons" class="button-wrapper">
      <button @click="switchScreen(0)">左屏</button>
      <button @click="switchScreen(1)">中屏</button>
      <button @click="switchScreen(2)">右屏</button>
    </div>
  </transition>
</div>

优化按钮样式与动画

为了提升用户体验,我为按钮和按钮容器添加了一些样式,例如渐变背景、阴影效果和悬停动画。

效果图:

完整代码及完整注释:

<template>
  <div class="container">
    <!-- 三屏显示区域 -->
    <div class="screens" :style="{ transform: `translateX(-${currentScreen * 100}vw)` }">
      <div class="screen left-screen">
        <h1>左屏</h1>
      </div>
      <div class="screen center-screen">
        <h1>中屏</h1>
      </div>
      <div class="screen right-screen">
        <h1>右屏</h1>
      </div>
    </div>

    <!-- 控制按钮显示区域,当鼠标悬停时显示按钮 -->
    <div
        class="controls"
        @mouseover="showButtons = true"
        @mouseleave="showButtons = false"
    >
    <transition name="fade"> <!-- 使用Vue的过渡效果 -->
      <div v-if="showButtons" class="button-wrapper">
        <!-- 切换到左屏 -->
        <button @click="switchScreen(0)">左屏</button>
        <!-- 切换到中屏 -->
        <button @click="switchScreen(1)">中屏</button>
        <!-- 切换到右屏 -->
        <button @click="switchScreen(2)">右屏</button>
      </div>
    </transition>
  </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      currentScreen: 1, // 当前显示的屏幕索引,默认显示中屏
      showButtons: false, // 控制按钮的显示与隐藏,初始为隐藏状态
    };
  },
  methods: {
    // 切换屏幕的函数,接收屏幕索引作为参数
    switchScreen(screenIndex) {
      this.currentScreen = screenIndex; // 更新当前屏幕为点击的屏幕
    },
  },
};
</script>

<style scoped>
/* 设置页面和容器的基础样式,确保页面无滚动条 */
html, body {
  height: 100%;  /* 页面高度占满视口 */
  margin: 0;  /* 去除默认的页面外边距 */
  overflow: hidden;  /* 禁止页面滚动 */
}

.container {
  width: 100vw;  /* 容器宽度为整个视口宽度 */
  height: 100vh;  /* 容器高度为整个视口高度 */
  overflow: hidden;  /* 禁止滚动条 */
  position: relative;  /* 设置相对定位,为了让控制区域绝对定位在底部 */
}

/* 三个屏幕的布局样式 */
.screens {
  display: flex;  /* 使用flex布局,使屏幕在水平方向排列 */
  width: 300vw;  /* 容器宽度为三个屏幕的总宽度 */
  height: 100%;  /* 高度占满整个父容器 */
  transition: transform 0.5s ease-in-out;  /* 添加屏幕切换时的平滑过渡动画 */
}

/* 单个屏幕的样式 */
.screen {
  width: 100vw;  /* 每个屏幕宽度为视口宽度 */
  height: 100vh;  /* 每个屏幕高度为视口高度 */
  display: flex;  /* flex布局,方便内容居中显示 */
  align-items: center;  /* 垂直居中 */
  justify-content: center;  /* 水平居中 */
  font-size: 3em;  /* 设置屏幕标题的字体大小 */
}

/* 各个屏幕的背景色 */
.left-screen {
  background-color: #ffcccc;  /* 左屏为淡红色 */
}

.center-screen {
  background-color: #ccffcc;  /* 中屏为淡绿色 */
}

.right-screen {
  background-color: #ccccff;  /* 右屏为淡紫色 */
}

/* 控制区域的样式 */
.controls {
  position: absolute;  /* 绝对定位,确保控制区域固定在底部 */
  bottom: 20px;  /* 离底部20px */
  left: 50%;  /* 居中对齐 */
  transform: translateX(-50%);  /* 通过transform将其完全居中 */
  display: flex;  /* 使用flex布局 */
  justify-content: center;  /* 按钮在容器内居中 */
  width: 100%;  /* 控制区域宽度为父容器的100% */
  height: 100px;  /* 高度为100px */
}

/* 按钮容器的样式,优化按钮区域外观 */
.button-wrapper {
  display: flex;  /* flex布局,方便按钮水平排列 */
  justify-content: center;  /* 按钮居中排列 */
  background-color: rgba(255, 255, 255, 0.8);  /* 半透明的背景色 */
  padding: 15px 30px;  /* 设置内边距 */
  border-radius: 25px;  /* 圆角效果 */
  box-shadow: 0 8px 30px rgba(0, 0, 0, 0.15);  /* 添加柔和的阴影效果 */
  transition: all 0.3s ease;  /* 设置容器过渡效果 */
}

/* 按钮的样式 */
.button-wrapper button {
  padding: 15px 25px;  /* 内边距,确保按钮大小适中 */
  margin: 0 15px;  /* 按钮之间的间距 */
  font-size: 1.2em;  /* 按钮文字大小 */
  font-weight: bold;  /* 按钮文字加粗 */
  cursor: pointer;  /* 鼠标悬停时显示为指针 */
  background: linear-gradient(135deg, #6dd5ed, #2193b0);  /* 按钮的渐变背景色 */
  color: #fff;  /* 按钮文字为白色 */
  border: none;  /* 无边框 */
  border-radius: 15px;  /* 圆角按钮 */
  box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);  /* 按钮阴影效果 */
  transition: background-color 0.3s ease, box-shadow 0.3s ease, transform 0.3s ease;  /* 添加按钮的过渡效果 */
}

/* 鼠标悬停时按钮的效果 */
.button-wrapper button:hover {
  background: linear-gradient(135deg, #2193b0, #6dd5ed);  /* 背景色反转 */
  box-shadow: 0 6px 20px rgba(0, 0, 0, 0.2);  /* 阴影加深 */
  transform: translateY(-5px);  /* 按钮有轻微升起效果 */
}

/* 过渡动画样式 */
.fade-enter-active, .fade-leave-active {
  transition: opacity 0.5s ease;  /* 控制透明度的过渡效果 */
}
.fade-enter, .fade-leave-to {
  opacity: 0;  /* 进入时透明度从0开始,离开时透明度为0 */
}
</style>

到此这篇关于基于Vue.js实现简洁的多屏切换效果的文章就介绍到这了,更多相关Vue.js多屏切换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 对vuex中getters计算过滤操作详解

    对vuex中getters计算过滤操作详解

    今天小编就为大家分享一篇对vuex中getters计算过滤操作详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • 学习笔记之Vuex的用法总结(Vue状态管理)

    学习笔记之Vuex的用法总结(Vue状态管理)

    这篇文章主要介绍了学习笔记之Vuex的用法总结(Vue状态管理),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Vue3使用element-plus组件不显示问题

    Vue3使用element-plus组件不显示问题

    这篇文章主要介绍了Vue3使用element-plus组件不显示问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • vue3.0如何使用computed来获取vuex里数据

    vue3.0如何使用computed来获取vuex里数据

    这篇文章主要介绍了vue3.0如何使用computed来获取vuex里数据问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Vue项目中使用WebUploader实现文件上传的方法

    Vue项目中使用WebUploader实现文件上传的方法

    WebUploader是由 Baidu WebFE(FEX) 团队开发的一个简单的以 HTML5为主 , FLASH为辅 的现代 文件上传组件 。这篇文章主要介绍了在Vue项目中使用WebUploader实现文件上传,需要的朋友可以参考下
    2019-07-07
  • vue 3.0使用element-plus按需导入方法以及报错解决

    vue 3.0使用element-plus按需导入方法以及报错解决

    Vue3是不能直接使用Element-ui了,需要换成Element-plus,下面这篇文章主要给大家介绍了关于vue 3.0使用element-plus按需导入方法以及报错解决的相关资料,需要的朋友可以参考下
    2024-02-02
  • cdn模式下vue的基本用法详解

    cdn模式下vue的基本用法详解

    这篇文章主要介绍了cdn模式下vue的基本用法,本文通过图文并茂的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-10-10
  • vue中组件之间相互传值的6种方法小结

    vue中组件之间相互传值的6种方法小结

    Vue.js 中组件间通信的方法有很多种,这篇文章主要为大家详细介绍了6种常见的直接或间接的组件传值方式,有需要的小伙伴可以参考一下
    2024-01-01
  • Vue.js实现表格渲染的方法

    Vue.js实现表格渲染的方法

    今天小编就为大家分享一篇对Vue.js实现表格渲染的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • Element-UI中el-table如何合并相同单元格

    Element-UI中el-table如何合并相同单元格

    这篇文章主要给大家介绍了关于Element-UI中el-table如何合并相同单元格的相关资料,el-table的组件的可以合并单元格,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2023-08-08

最新评论