【前端界面分享】

实现效果:html源码来自b站up主:【CSS+JS】甲方:啊?没叫你做那么超前啊_哔哩哔哩_bilibili

本人仅实现了将html格式改为vue3

html版:

对于前端连入门可能都没摸到,学了半天也就改成vue3了,对于输入密码时会显示两个查看密码的问题还是没头绪,希望有大佬会的话可以讲一下。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>山羊の前端小窝</title><style>* {box-sizing: border-box;transition: .2s;}:root {--bgColor: white;--border: black;--inputColor: black;--outlineColor: rgb(60, 115, 235);}body {display: flex;justify-content: center;align-items: center;height: 100vh;overflow: hidden;background: var(--bgColor);}body.show-password {--bgColor: rgba(0, 0, 0, 0.9);--inputColor: white;--border: rgb(255, 255, 255);}.shell {width: 100%;height: 100vh;display: flex;align-items: center;justify-content: center;background-image: url(./img/1.png);background-size: cover;}form {transform: translate3d(0, 0, 0);padding: 50px;border: 20px solid var(--border);border-radius: 10px;box-shadow: 10px 10px 10px #00000065;}form > * + * {margin-top: 15px;}.form-item > * + * {margin-top: 0.5rem;}h2,label,input,button {font-size: 2rem;font-family: '优设标题黑';color: var(--inputColor);}h2 {font-size: 4rem;margin: 0;}label:focus,input:focus,button:focus {outline-offset: 2px;}label::-moz-focus-inner,input::-moz-focus-inner,button::-moz-focus-inner {border: none;}label[id=password],input[id=password],button[id=password] {color: black;}button {border: none;}[id=submit] {cursor: pointer;width: 100%;margin: 20px 0 0 2px;padding: 0.75rem 1.25rem;color: var(--bgColor);background-color: var(--inputColor);box-shadow: 4px 4px 0 rgba(30, 144, 255, 0.2);}[id=submit]:active {transform: translateY(1px);}.input-wrapper {position: relative;}input {padding: 0.75rem 4rem 0.75rem 0.75rem;width: 100%;border: 2px solid transparent;border-radius: 0;/* 设置背景颜色为透明 */background-color: transparent;box-shadow: inset 0 0 0 2px black,inset 6px 6px 0 rgba(30, 144, 255, 0.2),3px 3px 0 rgba(30, 144, 255, 0.2);-webkit-appearance: none;}input:focus {outline-offset: 1px;}.show-password input {box-shadow: inset 0 0 0 2px black;border: 2px dashed white;}.show-password input:focus {outline: none;border-color: rgb(255, 255, 145);}/* 设置眼睛按钮样式 */[id=eyeball] {--size: 1.25rem;display: flex;align-items: center;justify-content: center;cursor: pointer;outline: none;position: absolute;top: 50%;right: 0.75rem;border: none;background-color: transparent;transform: translateY(-50%);}[id=eyeball]:active {transform: translateY(calc(-50% + 1px));}.eye {width: var(--size);height: var(--size);border: 2px solid var(--inputColor);border-radius: calc(var(--size) / 1.5) 0;transform: rotate(45deg);}.eye:before,.eye:after {content: "";position: absolute;top: 0;right: 0;bottom: 0;left: 0;margin: auto;border-radius: 100%;}.eye:before {width: 35%;height: 35%;background-color: var(--inputColor);}.eye:after {width: 65%;height: 65%;border: 2px solid var(--inputColor);border-radius: 100%;}/* 设置光束样式 */[id=beam] {position: absolute;top: 50%;right: 1.75rem;clip-path: polygon(100% 50%, 100% 50%, 0 0, 0 100%);width: 100vw;height: 25vw;z-index: 1;mix-blend-mode: multiply;transition: transform 200ms ease-out;transform-origin: 100% 50%;transform: translateY(-50%) rotate(var(--beamDegrees, 0));pointer-events: none;}.show-password [id=beam] {background: rgb(255, 255, 145);}</style>
</head><body>
<div class="shell"><form><h2>LOGIN</h2><div class="form-item"><label for="username">Username</label><div class="input-wrapper"><input type="text" id="username"/></div></div><div class="form-item"><label for="password">Password</label><div class="input-wrapper"><input type="password" id="password"/><button type="button" id="eyeball"><div class="eye"></div></button><div id="beam"></div></div></div><button id="submit">Sign in</button></form>
</div>
<script>const root = document.documentElement;const eye = document.querySelector('#eyeball');const beam = document.querySelector('#beam');const passwordInput = document.querySelector('#password');root.addEventListener('mousemove', (e) => {let rect = beam.getBoundingClientRect();let mouseX = rect.right + (rect.width / 2);let mouseY = rect.top + (rect.height / 2);let rad = Math.atan2(mouseX - e.pageX, mouseY - e.pageY);let degrees = (rad * (20 / Math.PI) * -1) - 350;root.style.setProperty('--beamDegrees', `${degrees}deg`);});eye.addEventListener('click', e => {e.preventDefault();document.body.classList.toggle('show-password');passwordInput.type = passwordInput.type === 'password' ? 'text' : 'password';//passwordInput.focus();});
</script>
</body></html>

vue3版本:

不是很会前端,改为vue3后部分效果消失,自己试着改了改,可以直接在handleLogin中处理自己的提交方法。

会提示beam元素可能为空,但不影响实际使用。

<template><div ref="bigBox" class="bigBox" :class="{ showPassword: isshowPassword }"><div class="shell"><form @submit.prevent="handleLogin"><h2>LOGIN</h2><div class="form-item"><label for="username">Username</label><div class="input-wrapper"><inputtype="text"id="userAccount"v-model="Loginform.userAccount"autocomplete="off"autocorrect="off"autocapitalize="off"spellcheck="false"data-lpignore="true"/></div></div><div class="form-item"><label for="userPassword">Password</label><div class="input-wrapper"><input:type="showPasswordType"id="password"ref="password"v-model="Loginform.userPassword"autocomplete="off"autocorrect="off"autocapitalize="off"spellcheck="false"data-lpignore="true"/><button type="button" id="eyeball" @click="eyeball"><div class="eye"></div></button><div id="beam"></div></div></div><button id="submit">Login in</button></form></div></div>
</template>
<script setup lang="ts">
import { computed, onMounted, reactive, ref } from "vue";
import { UserControllerService, UserLoginRequest } from "../../../../generated";
import { useRouter } from "vue-router";
import { useStore } from "vuex";const router = useRouter();
const store = useStore();
// 创建响应式表单数据
const Loginform = reactive({userAccount: "",userPassword: "",
} as UserLoginRequest);
// 定义登录处理函数
const handleLogin = async () => {// 弹窗显示账号密码alert(JSON.stringify(Loginform));  
};
/*** css样式*/const form = reactive({showPassword: false,
});
let passwordInput = document.querySelector("#password");
// 计算属性,根据 showPassword 的值返回 'password' 或 'text'
const showPasswordType = computed(() =>form.showPassword ? "text" : "password"
);let isshowPassword = ref(false);onMounted(() => {const root = ref(document.documentElement); // 获取根元素const beam = document.querySelector("#beam"); // 获取光束元素const eye = document.querySelector("#eyeball"); // 获取眼睛按钮元素passwordInput = document.querySelector("#password"); // 获取密码输入框元素// 然后使用 beam.value, eye.value, passwordInput.value 来访问 DOM 元素// 鼠标移动事件监听器root.value.addEventListener("mousemove", (e) => {// 获取光束的位置和鼠标位置let rect = beam.getBoundingClientRect(); // 获取光束元素的位置信息let mouseX = rect.right + rect.width / 2; // 光束的横坐标let mouseY = rect.top + rect.height / 2; // 光束的纵坐标// 计算角度let rad = Math.atan2(mouseX - e.pageX, mouseY - e.pageY); // 计算鼠标和光束之间的角度let degrees = rad * (20 / Math.PI) * -1 - 350; // 将弧度转换为角度// 设置根元素的样式变量root.value.style.setProperty("--beamDegrees", `${degrees}deg`); // 设置根元素的样式变量,控制光束的旋转角度});
});
//点击显示密码
const eyeball = () => {form.showPassword = !form.showPassword;if (!isshowPassword.value) {isshowPassword.value = true;} else {isshowPassword.value = false;}
};
</script>
<style scoped>
/* 设置全局样式 */
* {box-sizing: border-box;transition: 0.2s;
}/* 设置根元素变量 */
:root {--bgColor: white;/* 设置背景颜色变量为白色 */--inputColor: black;/* 设置输入框颜色变量为黑色 */--outlineColor: rgb(60, 115, 235);/* 设置输入框边框颜色变量为RGB(60, 115, 235) */--border: black;--beamDegrees: 0deg; /* 添加默认值 *//* ... 其他变量定义 */
}/* 设置body样式 */
.bigBox {display: flex;/* 设置body元素为flex布局 */justify-content: center;/* 水平居中对齐 */align-items: center;/* 垂直居中对齐 */height: 100vh;/* 设置body元素的高度为视口高度 */overflow: hidden;/* 隐藏溢出内容 */background: var(--bgColor, #ffffff);/* 设置背景颜色为变量--bgColor的值 */
}/* 设置外层容器样式 */
.shell {width: 100%;/* 设置外层容器的宽度为100% */height: 100vh;/* 设置外层容器的高度为视口高度 */display: flex;/* 设置外层容器为flex布局 */align-items: center;/* 垂直居中对齐 */justify-content: center;/* 水平居中对齐 */background-image: url(../../img/1.webp);/* 设置背景图片为./img/1.png */background-size: cover;/* 背景图片等比例缩放铺满容器 */
}/* 设置表单样式 */
form {transform: translate3d(0, 0, 0);/* 3D变换,无位移 */padding: 50px;/* 设置内边距为10px */border: 20px solid var(--border, #000000);border-radius: 10px;box-shadow: 10px 10px 10px #00000065;
}form > * + * {margin-top: 15px;/* 设置相邻元素之间的上边距为15px */
}.form-item > * + * {margin-top: 0.5rem;/* 设置相邻元素之间的上边距为0.5rem */
}/* 设置label, input, button样式 */
h2,
label,
input,
button {font-size: 2rem;/* 设置字体大小为2rem */color: var(--inputColor, #000000);/* 设置字体颜色为变量--inputColor的值 */font-family: "优设标题黑";
}h2 {font-size: 4rem;margin: 0;
}label:focus,
input:focus,
button:focus {outline-offset: 2px;/* 设置聚焦时的外边距为2px */
}label::-moz-focus-inner,
input::-moz-focus-inner,
button::-moz-focus-inner {border: none;/* 去掉Firefox浏览器的聚焦时的内边框 */
}/* 设置密码相关样式 */
label[id="userPassword"],
input[id="userPassword"],
button[id="userPassword"] {color: black;/* 设置字体颜色为黑色 */
}/* 设置按钮样式 */
button {border: none;/* 去掉按钮的边框 */
}[id="submit"] {width: 100%;cursor: pointer;/* 设置鼠标样式为手型 */margin: 20px 0 0 2px;/* 设置外边距为20px 0 0 2px */padding: 0.75rem 1.25rem;/* 设置内边距为0.75rem 1.25rem */color: var(--bgColor, #ffffff);/* 设置字体颜色为变量--bgColor的值 */background-color: var(--inputColor, #000000);/* 设置背景颜色为变量--inputColor的值 */box-shadow: 4px 4px 0 rgba(30, 144, 255, 0.2);/* 设置阴影效果 */
}[id="submit"]:active {transform: translateY(1px);/* 设置点击时向下位移1px */
}/* 设置输入框包裹器样式 */
.input-wrapper {position: relative;/* 设置相对定位 */
}/* 设置输入框样式 */
input {padding: 0.75rem 4rem 0.75rem 0.75rem;/* 设置内边距为0.75rem 4rem 0.75rem 0.75rem */width: 100%;/* 设置宽度为100% */border: 2px solid transparent;/* 设置边为2px透明 */border-radius: 0;/* 设置边框圆角为0 */background-color: transparent;/* 设置背景颜色为透明 */box-shadow: inset 0 0 0 2px black, inset 6px 6px 0 rgba(30, 144, 255, 0.2),3px 3px 0 rgba(30, 144, 255, 0.2);/* 设置阴影效果 */-webkit-appearance: none;/* 去掉Webkit浏览器的默认样式 */
}/*输入密码后样式*/
input:focus {outline-offset: 1px;/* 设置聚焦时的外边距为1px */
}/* 设置显示密码时的输入框样式 */
.showPassword input {box-shadow: inset 0 0 0 2px black;/* 设置阴影效果 */border: 2px dashed white;/* 设置边框为2px虚线白色 */
}.showPassword input:focus {outline: none;/* 去掉聚焦时的外边框 */border-color: rgb(255, 255, 145);/* 设置边框颜色为RGB(255, 255, 145) */
}.showPassword input[id="userPassword"] {type: text;
}/* 设置眼睛按钮样式 */
[id="eyeball"] {--size: 1.25rem;/* 设置变量--size的值为1.25rem */display: flex;/* 设置为flex布局 */align-items: center;/* 垂直居中对齐 */justify-content: center;/* 水平居中对齐 */cursor: pointer;/* 设置鼠标样式为手型 */outline: none;/* 去掉聚焦时的外边框 */position: absolute;/* 设置绝对定位 */top: 50%;/* 设置顶部距离为50% */right: 0.75rem;/* 设置右侧距离为0.75rem */border: none;/* 去掉边框 */background-color: transparent;/* 设置背景颜色为透明 */transform: translateY(-50%);/* 设置向上位移50% */
}[id="eyeball"]:active {transform: translateY(calc(-50% + 1px));/* 设置点击时向上位移50% + 1px */
}.eye {width: var(--size);/* 设置宽度为变量--size的值 */height: var(--size);/* 设置高度为变量--size的值 */border: 2px solid var(--inputColor, #000000);/* 设置边框为2px实线,颜色为变量--inputColor的值 */border-radius: calc(var(--size) / 1.5) 0;/* 设置边框圆角为变量--size的值除以1.5,0 */transform: rotate(45deg);/* 设置旋转45度 */
}.eye:before,
.eye:after {content: "";/* 清空内容 */position: absolute;/* 设置绝对定位 */top: 0;/* 设置顶部距离为0 */right: 0;/* 设置右侧距离为0 */bottom: 0;/* 设置底部距离为0 */left: 0;/* 设置左侧距离为0 */margin: auto;/* 设置自动外边距 */border-radius: 100%;/* 设置边框圆角为100% */
}.eye:before {width: 35%;/* 设置宽度为35% */height: 35%;/* 设置高度为35% */background-color: var(--inputColor, #000000);/* 设置背景颜色为变量--inputColor的值 */
}.eye:after {width: 65%;/* 设置宽度为65% */height: 65%;/* 设置高度为65% */border: 2px solid var(--inputColor, #000000);/* 设置边框为2px实线,颜色为变量--inputColor的值 */border-radius: 100%;/* 设置边框圆角为100% */
}/* 设置光束样式 */
[id="beam"] {position: absolute;/* 设置绝对定位 */top: 50%;/* 设置顶部距离为50% */right: 1.75rem;/* 设置右侧距离为1.75rem */clip-path: polygon(100% 50%, 100% 50%, 0 0, 0 100%);/* 设置剪切路径为多边形 */width: 100vw;/* 设置宽度为100vw */height: 25vw;/* 设置高度为25vw */z-index: 1;/* 设置层级为1 */mix-blend-mode: multiply;/* 设置混合模式为multiply */transition: transform 200ms ease-out;/* 设置过渡效果为200ms的ease-out */transform-origin: 100% 50%;/* 设置变换原点为右侧50% */transform: translateY(-50%) rotate(var(--beamDegrees, 0));/* 设置向上位移50%并旋转--beamDegrees度 */pointer-events: none;/* 禁用指针事件 */
}.showPassword [id="beam"] {background: rgb(255 255 145 / 73%);/* 设置背景颜色为RGB(255, 255, 145) */
}/* 设置显示密码时的样式 */
.showPassword {--bgColor: rgba(0, 0, 0, 0.9);/* 设置背景颜色变量为RGBA(0, 0, 0, 0.9) */--inputColor: white;/* 设置输入框颜色变量为白色 */--border: rgb(255, 255, 255);
}
</style>

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

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

相关文章

【ARM系列】1 of N SPI

1 of N模式 SPI 概述配置流程 概述 GIC-600AE支持1 of N模式SPI。在此模式下可以将SPI target到多个core&#xff0c;并且GIC-600AE可以选择哪些内核接收SPI。 GIC-600AE只向处于powered up 并且使能中断组的core发送SPI。 GIC-600AE会优先考虑那些被认为是active的核&#xf…

SQL注入基础入门

文章目录 前言SQL注入基本操作SQL注入类型分类数字型字符型搜索型xx型Json型数据类型提交的方式 SQL注入的位置分类报错注入报错注入实战案例 SQL注入语句分类insert注入update注入delete注入 编码Tips&#xff1a;Mysql版本区别information_schema数据库详解 其他注入手段宽字…

面试官:Java线程可以无限创建吗?

1. 面试连环call Java线程可以无限创建吗? Java线程和操作系统线程有什么关联? 操作系统为什么要区分内核态和用户态? ⏩要想解答这些问题&#xff0c;我们要先从操作系统线程开始说起&#xff0c;让我们开始吧&#x1f389;&#x1f389;&#x1f389; 2. 操作系统线程…

为什么要学习Go

本文旨在探讨为什么Go语言值得学习,以及它如何能够提升您的编程技能和职业发展。我们将深入分析Go语言的核心优势,包括其简洁的语法、强大的并发支持、卓越的性能表现,以及在云计算、微服务和系统编程等领域的广泛应用 GO logo的核心理念&#xff0c;即简单胜于复杂。使用现代…

Redis-Redis可视化工具Redis Insight下载及安装

下载 1、博主已经上传资源&#xff0c;点此下载 2、点此进入官方下载 2.1 点击Installing Redis Insight 2.2 点击Install on desktop 2.3 选择Install on desktop&#xff0c;点击Redis Insight is available for download for free from this web site从网站下载 2.4 下载…

Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO

官网&#xff1a;https://streamlit.io/ github&#xff1a;https://github.com/streamlit/streamlit API 参考&#xff1a;https://docs.streamlit.io/library/api-reference 最全 Streamlit 教程&#xff1a;https://juejin.cn/column/7265946243196436520 Streamlit-中文文档…

MYSQL 四、mysql进阶 7(性能分析工具的使用)

一、数据库服务器的优化步骤 数据库调优流程图: 整个流程划分成了 观察&#xff08;Show status&#xff09; 和 行动&#xff08;Action&#xff09; 两个部分。字母 S 的部分代表观察&#xff08;会使 用相应的分析工具&#xff09;&#xff0c;字母 A 代表的部分是行…

算法012:将x减到0的最小操作数

将x减到0的最小操作数. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/minimum-operations-to-reduce-x-to-zero/ 这个题使用到的是滑动窗口。 乍一看&#xff0c…

U盘管理软件有哪些?3款好用的软件亲测有效!

在数字化办公与数据交换日益频繁的今天&#xff0c;U盘作为便携的存储设备&#xff0c;其重要性不言而喻。 然而&#xff0c;U盘的使用也带来了数据泄露、病毒感染等安全隐患。为了有效管理U盘&#xff0c;确保数据安全与合规性&#xff0c;市场上涌现出了众多U盘管理软件。 小…

大话C语言:第29篇 指针

1 指针概念 指针&#xff1a;地址的变量化形式&#xff0c;其存储的是内存中某个存储单元的地址。它是地址的数值表示。 指针变量&#xff1a;一种特殊的变量&#xff0c;它专门用于存放变量的地址&#xff08;即指针&#xff09;。 注意&#xff0c;指针和指针变量的区别&am…

【Linux】线程池|单例模式|STL、智能指针线程安全|读者写者问题

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;理解【Linux】线程池|单例模式|STL、智能指针线程安全|读者写者问题。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会…

2024 年 07 月编程语言排行榜|Rust 即将进入前十

TIOBE 2024 年 07 月份的编程语言排行榜已经公布&#xff0c;官方的标题是&#xff1a;Rust 即将进入前十&#xff08;Rust is preparing itself for the top 10&#xff09;。 Python 继续保持第一&#xff0c;而 C 超越 C 升至第二&#xff1a; 在 TIOBE 7 月编程语言排行榜…

深度解析:当下流行的人工智能大模型生成逻辑

在过去的几年里&#xff0c;人工智能领域经历了前所未有的革新&#xff0c;其中最引人注目的就是大规模预训练模型的崛起。这些模型&#xff0c;如GPT系列、BERT、T5、DALLE和CLIP等&#xff0c;凭借其强大的语言理解和生成能力&#xff0c;已经在自然语言处理&#xff08;NLP&…

《初级C++》(一)

初级C&#xff08;一&#xff09; 1: C参考⽂档2&#xff1a;C创建与实现创建C的第一套程序命名空间的理解空间命名的实现C输⼊&输出缺省参数 1: C参考⽂档 https://legacy.cplusplus.com/reference/ 《非官方》 https://zh.cppreference.com/w/cpp 《官方中文版》 https:/…

vue3 学习 之 vue3使用

为什么要学习vue3呢&#xff1f; vue2.0也是现在比较稳定的一个版本&#xff0c;社区还有周边都比较完善&#xff0c;如果不是非必要其实我们不需要着急直接升级到vue3.0; 那为什么还要学习&#xff0c;主要是还是为了了解一下vue3.0相较于2.0的优势和特性&#xff0c;方便之后…

Unity实现安卓App预览图片、Pdf文件和视频的一种解决方案

一、问题背景 最近在开发app项目&#xff0c;其中有个需求就是需要在app软件内显示图片、pdf和视频&#xff0c;一开始想的解决方案是分开实现&#xff0c;也就是用Image组件显示图片&#xff0c;找一个加载pdf的插件和播放视频的插件&#xff0c;转念一想觉得太麻烦了&#x…

浏览器控制台打印日志的方法汇总

目录 console.table用法 打印数组 打印对象 打印数组对象 打印数组对象里的指定字段 console.count用法 不传参打印 传参打印 console.warn用法 打印文本 打印对象 console.error用法 打印文本 打印对象 console.assert用法 打印文本 打印对象 consol…

AI视频创作一条龙!达摩院“寻光”平台炸场WAIC,突破可控编辑难题

卡奥斯智能交互引擎是卡奥斯基于海尔近40年工业生产经验积累和卡奥斯7年工业互联网平台建设的最佳实践&#xff0c;基于大语言模型和RAG技术&#xff0c;集合海量工业领域生态资源方优质产品和知识服务&#xff0c;旨在通过智能搜索、连续交互&#xff0c;实时生成个性化的内容…

开源模型应用落地-FastAPI-助力模型交互-进阶篇(一)

一、前言 FastAPI 的高级用法可以为开发人员带来许多好处。它能帮助实现更复杂的路由逻辑和参数处理&#xff0c;使应用程序能够处理各种不同的请求场景&#xff0c;提高应用程序的灵活性和可扩展性。 在数据验证和转换方面&#xff0c;高级用法提供了更精细和准确的控制&#…

C语言下结构体、共用体、枚举类型的讲解

主要内容 结构体结构体数组结构体指针包含结构体的结构链表链表相关操作共用体枚举类型 结构体 结构体的类型的概念 结构体实现步骤 结构体变量的声明 struct struct 结构体名{ 数据类型 成员名1; 数据类型 成员名2; ..…