首页 > 其他分享 >Vue实现3D卡片效果,几行代码搞定,旋转、立体、自定义组件、嵌套任意内容

Vue实现3D卡片效果,几行代码搞定,旋转、立体、自定义组件、嵌套任意内容

时间:2024-12-17 12:57:40浏览次数:8  
标签:Vue 自定义 卡片 -- 旋转 padding range card 3D

文章目录


写了实现了一个具有3D旋转效果的卡片。下面是对其实现思路的详细解析:

效果预览

在这里插入图片描述

1. 组件结构

  • 模板部分 (<template>):
    • 使用一个<div>元素包裹<slot>,允许父组件传递内容到卡片内部。
    • :id="id"绑定一个唯一的ID,用于在JavaScript中引用该元素。

2. 脚本部分 (<script>)

属性 (props)
  • range: 控制卡片旋转的角度范围,默认值为空字符串。
  • padding: 控制卡片的内边距,默认值为空字符串。
数据 (data)
  • id: 生成一个唯一的ID,确保每个卡片实例都有唯一的标识符。
方法 (methods)
  • getRotate(range, value, max): 计算旋转角度。根据鼠标位置和卡片尺寸计算出旋转角度。
生命周期钩子 (mounted)
  • 在组件挂载后,设置卡片的初始样式。
  • 根据range属性调整旋转角度范围。
  • 设置--padding自定义属性,用于控制卡片的内边距。
  • 添加鼠标移动事件监听器,根据鼠标位置动态计算并设置--rx--ry自定义属性,实现3D旋转效果。
  • 添加鼠标离开事件监听器,当鼠标离开卡片时,重置旋转角度为0度。

3. 样式部分 (<style scoped>)

  • .card-3d:

    • 使用--padding自定义属性控制内边距。
    • 设置cursor: pointer,使鼠标悬停时显示为指针形状。
    • 设置border-radiustransition,使卡片圆角过渡效果平滑。
    • 使用transform属性结合perspectiverotateXrotateY实现3D旋转效果。
    • 设置border,给卡片添加边框。
  • .card-3d img:

    • 设置border-radius继承父元素的圆角样式。
  • .card-3d:hover:

    • 设置box-shadow,当鼠标悬停时增加阴影效果,增强3D效果。

实现思路总结

  1. 唯一标识: 通过生成唯一的ID,确保每个卡片实例都能被单独识别和操作。
  2. 属性配置: 通过props接收外部传入的参数,如旋转角度范围和内边距,提高组件的灵活性和复用性。
  3. 事件监听: 使用onmousemoveonmouseleave事件监听器,动态计算并应用旋转角度,实现3D旋转效果。
  4. 样式控制: 使用CSS变量(自定义属性)动态控制样式,如内边距和旋转角度,使样式更加灵活和易于维护。

完整代码

<!-- 3D卡片效果 -->
<template>
  <main class="page-main">
    <div :id="id" class="card-3d">
      <slot></slot>
    </div>
  </main>
</template>
<script lang="ts">
export default {
  props: {
    range: {type: String},
    padding:{type:String}
  },
  components: {},
  data() {
    return {
      id: new Date().getTime() + "_keller_card-img-3d_" + Math.random(),
    }
  },
  methods: {
  	//计算偏转角度
    getRotate(range, value, max) {
      return value / max * (range[1] - range[0]) + range[0];
    }
  },
  computed: {},
  watch: {},
  mounted() {
    let xRange = [-10, 10];
    let yRange = [-10, 10];
    if (this.$props.range) {
      const offset = this.$props.range;
      xRange = [-1 * offset, offset];
      yRange = [-1 * offset, offset];
    }
    const card = document.getElementById(this.id);
    card.style.setProperty("--padding", this.$props.padding);
    //监听鼠标事件
    card.onmousemove = (e) => {
      const {offsetX, offsetY} = e;
      const {offsetWidth, offsetHeight} = card;
      const ry = 0 - this.getRotate(yRange, offsetX, offsetWidth);
      const rx = this.getRotate(xRange, offsetY, offsetHeight);
      card.style.setProperty("--rx", rx + "deg");
      card.style.setProperty("--ry", ry + "deg");
    }
    card.onmouseleave = (e) => {
      card.style.setProperty("--rx", "0deg");
      card.style.setProperty("--ry", "0deg");
    }

  }
}
</script>
<style scoped>
.card-3d {
  padding: var(--padding,0px);
  cursor: pointer;
  border-radius: 8px;
  transition: 0.1s;
  transform: perspective(500px) rotateX(var(--rx, 0deg)) rotateY(var(--ry, 0deg));
  border: 1px solid #f0f0f0;
}

.card-3d img {
  border-radius: inherit;
}

.card-3d:hover {
  box-shadow: -3px -3px 10px #54a29e, 3px 3px 10px #a79d66;
}
</style>

高清壁纸,古风美女,萌趣表情包,创意视频,唯美图片 https://coder4j.com/

点击下方名片,一起交流,深入学习,也可以体验知识变现的乐趣

标签:Vue,自定义,卡片,--,旋转,padding,range,card,3D
From: https://blog.csdn.net/qq_41089021/article/details/144513743

相关文章

  • 《Vue3笔记》第05节:Vue3项目引入Axios插件实现网络通信
    这篇文章基于前一个小节的代码基础之上,介绍如何在Vue3项目中引入Axios插件实现网络通信的功能。Vue3项目开发(微信文章集合)1.1、安装依赖Axios是一款实现网络通信的插件,在前后的分离的项目中,要和后端接口进行数据通信,就可以采用Axios这个插件。首先安装Axios插件所需要的......
  • vue-实现组件是否显示还是隐藏
    方法一使用route的实例比如我们在home页面需要这个标签在city页面不需要这个标签我们可以在router里面添加meta属性在需要的组件页面导入route实力获取meta属性的值方法二使用css样式......
  • vue2后台管理
    1.前言后台管理系统包含几个功能:权限管理,菜单管理,CRUD模板等权限管理不仅仅体现在菜单的渲染,还涉及到动态路由2.动态路由系统页面分为2种:管理页面(带左侧和顶部的导航,主内容取才是真正的内容),和全屏页面全屏页面:使用一级路由进行注册,直接渲染该页面组件管理页面:使用二级......
  • Vue.js 深度剖析:2024 前端高频面试题详解
    Vue.js深度剖析:2024前端高频面试题详解1.Vue的响应式原理是什么?2.Vue组件通信方式有哪些?3.Vue的生命周期是什么?4.如何优化Vue应用性能?5.什么是Vue的CompositionAPI?6.什么是Vue的VirtualDOM?7.Vuex与Pinia的区别是什么?1.Vue的响应式原理是......
  • Vue2 应用开发必备技能:构建优雅的 Axios 请求封装模块
    Vue2应用开发必备技能:构建优雅的Axios请求封装模块前言第一步:安装Axios第二步:创建Axios封装模块1.引入Axios2.创建Axios实例3.请求拦截器4.响应拦截器5.导出封装的实例第三步:封装具体接口请求第四步:在Vue组件中使用总结前言在Vue2项目中,数据请......
  • 超全免费 管接头3d模型 管接头模型下载 网站汇总
    管接头‌是一种用于连接管道的部件,主要功能是将管道连接在一起,确保流体的顺畅传输。管接头有多种类型,每种类型适用于不同的应用场景和需求。主要包括:焊接式、卡套式、扣压式和扩口式。管接头‌是零部件设计过程中经常用到的零件,经常有小伙伴来咨询这类零件模型在哪能免费下载......
  • Go-Zero自定义goctl实战:定制化模板,加速你的微服务开发效率
    zhuan: https://www.cnblogs.com/wangzhongyang/p/18181397-------------------Go-Zero自定义goctl实战:定制化模板,加速你的微服务开发效率(四) 前言上一篇文章带你实现了Go-Zero和goctl:解锁微服务开发的神器,快速上手指南,本文将继续深入探讨Go-Zero的强大之处,并介绍如何使用......
  • 开发自定义 UDFs 和库
    开发自定义UDFs和库1.创建项目结构使用构建工具设置项目推荐使用SBT或Maven来管理依赖项和构建过程。以下是使用SBT的示例:build.sbt文件配置:name:="CustomUDFLibrary"version:="1.0"scalaVersion:="2.12.15"//根据你的Spark版本选择合适的Sca......
  • JAVA开源毕业设计 在线文档管理系统 Vue.JS+SpringBoot+MySQL网上订餐系统
    本文项目编号T039,文末自助获取源码\color{red}{T039,文末自助获取源码}......
  • JAVA开源毕业设计 在线文档管理系统 Vue.JS+SpringBoot+MySQL网上订餐系统
    本文项目编号T039,文末自助获取源码\color{red}{T039,文末自助获取源码}......