【vue.js】手把手教你做一个会躲避鼠标指针的登录按钮

news2024/10/6 6:42:07

效果

在这里插入图片描述

背景

在登录的时候,我们都会做账号密码不可为空的验证,如何做出一个会躲避鼠标指针的登录按钮呢。废话不多说,3、2、1,上代码~

代码

<!DOCTYPE html>
<html lang="en" style="overflow: hidden;">
<head>
  <title>登录测试</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
  <link rel="shortcut icon" href="../favicon.ico">
  <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/element-plus/2.3.3/index.css" rel="stylesheet">
  <script src="https://unpkg.com/vue@3"></script>
  <script src="https://cdn.bootcdn.net/ajax/libs/element-plus/2.3.3/index.full.js"></script>
  <style>
    body {
      background-color: rgb(132, 141, 156);
      user-select: none;
    }
    #form {
      width: 300px;
      perspective: 400px;
      position: absolute;
      top: 300px;
      left: 50%;
      margin-left: -150px;
      padding: 20px;
      box-shadow: var(--el-box-shadow-light);
      border-radius: 5px;
      border: 1px solid var(--el-card-border-color);
      background-color: rgb(230, 240, 250);
    }
    .remember-me-wrapper {
      float: right;
      margin-bottom: 18px;
    }
    .remember-me-wrapper .el-checkbox {
      z-index: 0;
    }
    #button {
      width: 100%;
      transition: all 0.1s ease;
      transform: translate(0px, 0px) rotateX(0deg) rotateY(0deg);
      box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.15)
    }
  </style>
</head>
<body>
  <div id="app">
    <el-form id="form" :model="loginForm" :rules="loginRules" label-width="60">
      <el-form-item label="账号" prop="username">
        <el-input v-model="loginForm.username" clearable />
      </el-form-item>
      <el-form-item label="密码" prop="password">
        <el-input v-model="loginForm.password" clearable type="password" />
      </el-form-item>
      <div class="remember-me-wrapper">
        <el-checkbox v-model="loginForm.rememberMe" label="记住我" class="rememberMe" />
      </div>
      <el-button id="button" type="primary" @click="login()">登录</el-button>
    </el-form>
  </div>
  <script type="text/javascript">
    const { createApp, reactive, ref } = Vue
    const app = createApp({
      setup() {
        const loginForm = reactive({
          username: '',
          password: '',
          rememberMe: false
        })
        const loginRules = reactive({
          username: [
            { required: true, message: '不可为空', trigger: 'blur' }
          ],
          password: [
            { required: true, message: '不可为空', trigger: 'blur' }
          ]
        })
        const distanceBetween = (p1x, p1y, p2x, p2y) => {
          const dx = p1x - p2x
          const dy = p1y - p2y
          return Math.sqrt(dx * dx + dy * dy)
        }
        document.addEventListener('mousemove', (event) => {
          const button = document.getElementById('button')
          const form = document.getElementById('form')
          if (loginForm.username && loginForm.password) {
            button.style.transform = `translate(0px, 0px) rotateX(0deg) rotateY(0deg)`
            button.style.boxShadow = `0px 0px 0px rgba(0, 0, 0, 0.15)`
            button.style.pointerEvents = 'auto'
            return
          }
          const bx = form.offsetLeft + button.offsetLeft + button.offsetWidth / 2
          const by = form.offsetTop + button.offsetTop + button.offsetHeight / 2
          const dist = distanceBetween(event.clientX, event.clientY, bx, by) * 2
          const angle = Math.atan2(event.clientY - by, event.clientX - bx)
          // 椭圆半径公式
          const radius = Math.sqrt(Math.pow(button.offsetWidth + 20, 2) * Math.pow(Math.cos(angle), 2) + Math.pow(button.offsetHeight + 20, 2) * Math.pow(Math.sin(angle), 2))
          const ox = -1 * Math.cos(angle) * (Math.max((radius - dist) / 2, 0))
          const oy = -1 * Math.sin(angle) * (Math.max((radius - dist) / 2, 0))
          const rx = oy / 2
          const ry = -ox / 2
          button.style.transform = `translate(${ox}px, ${oy}px) rotateX(${rx}deg) rotateY(${ry}deg)`
          button.style.boxShadow = `0px ${Math.abs(oy)}px ${Math.abs(oy) / radius * 40}px rgba(0, 0, 0, 0.15)`
          button.style.pointerEvents = 'none'
        })
        const login = () => {
          if (loginForm.username && loginForm.password) {
            ElementPlus.ElMessage({
              message: '登录成功',
              type: 'success',
            })
          }
        }
        return {
          loginForm,
          loginRules,
          login
        }
      }
    })
    app.use(ElementPlus).mount("#app")
  </script>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/880526.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ad+硬件每日学习十个知识点(34)23.8.14 (DCDC详细设计,续流二极管的选择,COMP引脚的环路设计)

文章目录 1.二极管的rrm电压和rms电压有什么不同2.DCDC续流二极管的选择3.充电电容4.COMP引脚的环路设计5.DCDC设计总结6.多路并联7.相位匹配8.工作模式9.低温输出偏离10.电源负载与效率11.降压升压模块 1.二极管的rrm电压和rms电压有什么不同 答&#xff1a; 二极管的 RRM &a…

JS_围绕圆形滑动

需求&#xff1a;滑动手势最大不能超过一个半径为50的圆形&#xff0c;超出围绕圆形边线滑动 这里只提供一个思路&#xff0c;下面代码可以运行&#xff0c;但是要使用需要改成自己的参数 <div style"width: 100%;height: 100vh;display: flex;justify-content: cente…

从雷军代码再上热搜给程序员们的启示

不久前&#xff0c;小米的一则关于雷军的宣传广告火了&#xff0c;这个宣传广告里隐藏了菜单&#xff0c;那些密密麻麻的字母就是雷军曾经写的代码&#xff0c;据小米公关部负责人王化表示&#xff0c;这张海报上的代码来自30年前&#xff0c;雷军在DOS环境下采用汇编语言亲自编…

Java鹰眼轨迹服务 轻骑小程序 运动健康与社交案例

Java地图专题课 基本API BMapGLLib 地图找房案例 MongoDB 百度地图鹰眼轨迹服务 鹰眼轨迹服务概述 鹰眼是一套轨迹管理服务&#xff0c;提供各端SDK和API供开发者便捷接入&#xff0c;追踪所管理的车辆/人员等运动物体。 基于鹰眼提供的接口和云端服务&#xff0c;开发者可以迅…

【 BERTopic应用 02/3】 分析卡塔尔世界杯推特数据

摄影&#xff1a;Fauzan Saari on Unsplash 一、说明 这是我们对世界杯推特数据分析的第3部分&#xff0c;我们放弃了。我们将对我们的数据进行情绪分析&#xff0c;以了解人们对卡塔尔世界杯的感受。我将在这里介绍的一个功能强大的工具包是Hugging Face&#xff0c;您可以在…

Mac鼠标增强工具Smooze Pro

Smooze Pro是一款Mac上的鼠标手势增强工具&#xff0c;可以让用户使用鼠标手势来控制应用程序和系统功能。 它支持多种手势操作&#xff0c;包括单指、双指、三指和四指手势&#xff0c;并且可以自定义每种手势的功能。例如&#xff0c;您可以使用单指向下滑动手势来启动Expos视…

el-table分页后序号连续的两种方法

实现效果&#xff1a; 第一页排序到10&#xff0c;第二页的排序应从11开始 实现方法一&#xff1a; 在el-table的序号列中使用template定义 <el-table><el-table-columnmin-width"10%"label"序号"><template slot-scope"scope"…

使用pymupdf实现PDF内容搜索并显示功能

简介&#xff1a; 在日常工作和学习中&#xff0c;我们可能需要查找和提取PDF文件中的特定内容。本文将介绍如何使用Python编程语言和wxPython图形用户界面库来实现一个简单的PDF内容搜索工具。我们将使用PyMuPDF模块来处理PDF文件&#xff0c;并结合wxPython构建一个用户友好的…

比例电磁铁控制放大器

GP63系列比例电磁铁应用于电液比例控制系统中&#xff0c;与比例控制放大器配套使用共同控制力士(REXROTH)型十通径螺纹比例阀。在额定行程及额定电流范围内&#xff0c;其输出力与输入电流成比例&#xff0c;通过内置反力弹簧&#xff0c;改变了输出力的特性&#xff0c;使系统…

能源存储蓄电池管理,0基础也能快速上手!

随着能源储存需求的不断增加&#xff0c;蓄电池作为关键的能量储存装置&#xff0c;其稳定性和性能的监测变得尤为重要。 蓄电池监控有助于提高能源系统的可靠性&#xff0c;确保连续供电&#xff0c;同时为维护人员提供及时的故障信息&#xff0c;以便他们能够迅速采取适当的措…

百望云联合华为发布票财税链一体化数智解决方案 赋能企业数字化升级

随着数据跃升为数字经济关键生产要素&#xff0c;数据安全成为整个数字化建设的重中之重。为更好地帮助企业发展&#xff0c;中央及全国和地方政府相继出台了多部与数据相关的政策法规&#xff0c;鼓励各领域服务商提供具有自主创新的软件产品与服务&#xff0c;帮助企业在合规…

【AutoLayout案例03-设置底部按钮之间相同间距 Objective-C语言】

一、好,咱们继续啊 1.咱们继续把autoLayout介绍一下 咱们的自动布局 给大家介绍一下 那么,自动布局呢 继续咱们给大家做的案例 做几个例子 把这几个例子做完以后 我们再给它 我们再给大家说一下,如何通过代码,来实现自动布局 虽然说,通过代码来实现自动布局,并不推荐 但…

AIF360入门教学

1、AIF360简介 AI Fairness 360 工具包(AIF360)是一个开源软件工具包&#xff0c;可以帮助检测和缓解整个AI应用程序生命周期中机器学习模型中的偏见。在整个机器学习的过程中&#xff0c;偏见可能存在于初始训练数据、创建分类器的算法或分类器所做的预测中。AI Fairness 360…

UI自动化测试(下拉框(select类),多窗口,属性,类的方法实战)

一、下拉框&#xff08;select类实现的&#xff09; 在UI的自动化测试实战中&#xff0c;如果遇到下拉框的选择&#xff0c;我们可以使用Select类里面的方法来具体进行定位和解决。下面我们使用HTML的代码来写一个下拉框的页面交互&#xff0c;让大家从直观上知道下拉框的交互…

Node工程的依赖包管理方式

在前端工程化中&#xff0c;JavaScript 依赖包管理是非常重要的一环。依赖包通常是项目所依赖的第三方库、工具和框架等资源&#xff0c;它们能够帮助我们减少重复开发、提高效率并且确保项目可以正确的运行。 目前比较常见的前端包管理器有 npm 和 Yarn&#xff0c;npm 是 No…

16.3.2 【Linux】程序的管理

程序之间是可以互相控制的。举例来说&#xff0c;你可以关闭、重新启动服务器软件&#xff0c;服务器软件本身是个程序&#xff0c; 你既然可以让她关闭或启动&#xff0c;当然就是可以控制该程序。 使用kill-l或者是man 7 signal可以查询到有多少个signal。主要的讯号代号与名…

Stable Diffusion 告别复制关键词,高质量提示词自动生成插件

在使用SD时,我们经常会遇到心中无想法,或不知如何描述心中所想的图像。有时由于提示词的选择不当,生成的图片质量也不尽如人意。为此,我今天为大家推荐一个高质量的提示词自动生成插件——One Button Prompt。 下面是他生成的一些样图。 文章目录 插件安装插件说明主菜单工…

【Linux】可重入函数 volatile关键字 以及SIGCHLD信号

可重入函数 volatile关键字 以及SIGCHLD信号 一、可重入函数1、引入2、可重入函数的判断 二、volatile关键字1、引入2、关于编译器的优化的简单讨论 三、SIGCHLD信号 一、可重入函数 1、引入 我们来先看一个例子来帮助我们理解什么是可重入函数&#xff1a; 假设我们现在要对…

基于Yolov5与LabelMe训练自己数据的图像分割完整流程

基于Yolov5与LabelMe训练自己数据的实例分割完整流程 1. Yolov5配置2. 创建labelme虚拟环境4. 接下来开始使用labelme绘制分割数据集4.1 json to txt4.2 划分数据集(可分可不分) 5. 训练 1. Yolov5配置 参照这边文章&#xff1a; https://blog.csdn.net/ruotianxia/article/de…

Python3,lmproof库,你不知道的小技能,这一篇给安排。

lmproof技能介绍 1、引言2、代码实战2.1 定义2.2 常用语法2.3 安装2.4 示例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c;鱼哥&#xff0c;我要考考你 小鱼&#xff1a;你要考考我&#xff1f; 小屌丝&#xff1a;是的啊&#xff0c; 我要考你&#xff0c; 小鱼&#…