滑动登陆注册同页面

这是一个登陆注册在同一个页面滑动选择的页面

技术:html、css、javascript

简单页面实现(为了方便,已将代码放在同一文件引用):

1.1、效果图

login
register

1.2、完整代码:
<!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>
  </head>
  <style>
    /* root根伪类 --为自定义css 属性  方便我们重复使用同一个属性  自定义属性用var() 进行调用 */
    :root {
      /* 背景颜色 */
      --white: #e9e9e9;
      --gray: #333;
      --blue: #0367a6;
      --lightblue: #008997;
      /* 外边框圆角属性 */
      --button-radius: 0.7rem;

      --max-width: 758px;
      --max-height: 420px;
      /* 字体样式 */
      font-size: 16px;
      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen,
        Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
    }

    body {
      align-items: center;
      background-color: var(--white);
      background: url(https://pic1.zhimg.com/v2-95c83933bb8d33685321a2bd5579edf8_r.jpg?source=1940ef5c);
      background-attachment: fixed;
      background-position: center;
      background-repeat: no-repeat;
      background-size: cover;
      display: grid;
      height: 100vh;
      place-items: center;
    }

    .from_title {
      font-weight: 300;
      margin: 0;
      margin-bottom: 1.25rem;
    }

    .link {
      color: var(--gray);
      font-size: 0.9rem;
      margin: 1.5rem 0;
      text-decoration: none;
    }

    .container {
      background-color: var(--white);
      border-radius: var(--button-radius);
      box-shadow: 0 0.9rem 1.7rem rgba(0, 0, 0, 0.25);
      height: var(--max-height);
      max-width: var(--max-width);
      overflow: hidden;
      position: relative;
      width: 100%;
    }

    .container_from {
      height: 100%;
      position: absolute;
      top: 0;
      transition: all 0.6s ease-in-out;
    }

    .container--signin {
      left: 0;
      width: 50%;
      z-index: 2;
    }

    .container.right-panel-active .container--signin {
      transform: translateX(100%);
    }

    .container--signup {
      left: 0;
      opacity: 0;
      width: 50%;
      z-index: 1;
    }

    .container.right-panel-active .container--signup {
      animation: show 0.6s;
      opacity: 1;
      transform: translateX(100%);
      z-index: 5;
    }

    .container_overlay {
      height: 100%;
      left: 50%;
      overflow: hidden;
      position: absolute;
      top: 0;
      transition: transform 0.6s ease-in-out;
      width: 50%;
      z-index: 100;
    }

    .container.right-panel-active .container_overlay {
      transform: translateX(-100%);
    }

    .overlay {
      background-color: var(--lightblue);
      background: url(https://pic1.zhimg.com/v2-95c83933bb8d33685321a2bd5579edf8_r.jpg?source=1940ef5c);
      background-attachment: fixed;
      background-position: center;
      background-repeat: no-repeat;
      background-size: cover;
      height: 100%;
      left: -100%;
      position: relative;
      transform: translateX(0);
      transition: transform 0.6s ease-in-out;
      width: 200%;
    }

    .container.right-panel-active .overlay {
      transform: translateX(50%);
    }

    .overlay_panel {
      align-items: center;
      display: flex;
      flex-direction: column;
      height: 100%;
      justify-content: center;
      position: absolute;
      text-align: center;
      top: 0;
      transform: translateX(0);
      transition: transform 0.6s ease-in-out;
      width: 50%;
    }
    .overlay--left {
      transform: translateX(-20%);
    }

    .container.right-panel-active .overlay--left {
      transform: translateX(0);
    }

    .overlay--right {
      right: 0;
      transform: translateX(0);
    }

    .container.right-panel-active .overlay--right {
      transform: translateX(20%);
    }

    .btn {
      background-color: var(--blue);
      background-image: linear-gradient(
        90deg,
        var(--blue) 0%,
        var(--lightblue),
        74%
      );
      border-radius: 20px;
      border: 1px solid var(--blue);
      color: var(--white);
      cursor: pointer;
      font-size: 0.8rem;
      font-weight: bold;
      letter-spacing: 0.1rem;
      padding: 0.9rem 4rem;
      text-transform: uppercase;
      transition: transform 80ms ease-in;
    }

    .form > .btn {
      margin-top: 1.5rem;
    }

    .btn:active {
      transform: scale(0.95);
    }

    .btn:focus {
      outline: none;
    }

    .from {
      background-color: var(--white);
      display: flex;
      align-items: center;
      justify-content: center;
      flex-direction: column;
      padding: 0 3rem;
      height: 100%;
      text-align: center;
    }
    .input {
      background-color: #fff;
      border: none;
      padding: 0.9rem 0.9rem;
      margin: 0.5rem 0;
      width: 100%;
    }

    @keyframes show {
      0%,
      49.99% {
        opacity: 0;
        z-index: 1;
      }

      50%,
      100% {
        opacity: 1;
        z-index: 5;
      }
    }
  </style>
  <body>
    <!-- 整体布局 -->
    <div class="container right-panel-active">
      <!-- 注册框 -->
      <div class="container_from container--signup">
        <form action="#" class="from" id="from1">
          <h2 class="from_title">注册账号</h2>
          <input type="text" placeholder="User" class="input" />
          <input type="email" placeholder="Email" class="input" />
          <input type="password" placeholder="Password" class="input" />
          <button class="btn" type="button">点击注册</button>
        </form>
      </div>

      <!-- 登录框 -->
      <div class="container_from container--signin">
        <form action="#" class="from" id="from2">
          <h2 class="from_title">欢迎登录</h2>
          <input type="email" placeholder="Email" class="input" />
          <input type="password" placeholder="Password" class="input" />
          <a href="#" class="link">忘记密码?</a>
          <button class="btn" type="button">登录</button>
        </form>
      </div>

      <div class="container_overlay">
        <div class="overlay">
          <div class="overlay_panel overlay--left">
            <button type="button" class="btn" id="signin">
              已有帐号,直接登陆
            </button>
          </div>

          <div class="overlay_panel overlay--right">
            <button type="button" class="btn" id="signup">
              没有账号,点击注册
            </button>
          </div>
        </div>
      </div>
    </div>
  </body>
  <script>
    const signinBtn = document.getElementById("signin");
    const signupBtn = document.getElementById("signup");
    const firstForm = document.getElementById("from1");
    const secondForm = document.getElementById("from2");
    const container = document.querySelector(".container");

    signinBtn.addEventListener("click", () => {
      container.classList.remove("right-panel-active");
    });

    signupBtn.addEventListener("click", () => {
      container.classList.add("right-panel-active");
    });

    firstForm.addEventListener("submit", (e) => e.preventDefault());
    secondForm.addEventListener("submit", (e) => e.preventDefault());
  </script>
</html>

2.1、效果图:

register
login
lufei

2.2、完整代码:
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <meta
      name="viewport"
      content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"
    />
    <title>滑动切换的注册登录界面</title>
  </head>
  <style>
    * {
      /* 初始化 */
      margin: 0;
      padding: 0;
    }

    body {
      /* 100%窗口高度 */
      height: 100vh;
      /* 弹性布局 水平+垂直居中 */
      display: flex;
      justify-content: center;
      align-items: center;
      /* 渐变背景 */
      background: linear-gradient(200deg, #f3e7e9, #e3eeff);
    }

    .container {
      background-color: #fff;
      width: 650px;
      height: 415px;
      border-radius: 5px;
      /* 阴影 */
      box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1);
      /* 相对定位 */
      position: relative;
    }

    .form-box {
      /* 绝对定位 */
      position: absolute;
      top: -10%;
      left: 5%;
      background-color: #d3b7d8;
      width: 320px;
      height: 500px;
      border-radius: 5px;
      box-shadow: 2px 0 10px rgba(0, 0, 0, 0.1);
      display: flex;
      justify-content: center;
      align-items: center;
      z-index: 2;
      /* 动画过渡 加速后减速 */
      transition: 0.5s ease-in-out;
    }

    .register-box,
    .login-box {
      /* 弹性布局 垂直排列 */
      display: flex;
      flex-direction: column;
      align-items: center;
      width: 100%;
    }

    .hidden {
      display: none;
      transition: 0.5s;
    }

    h1 {
      text-align: center;
      margin-bottom: 25px;
      /* 大写 */
      text-transform: uppercase;
      color: #fff;
      /* 字间距 */
      letter-spacing: 5px;
    }

    input {
      background-color: transparent;
      width: 70%;
      color: #fff;
      border: none;
      /* 下边框样式 */
      border-bottom: 1px solid rgba(255, 255, 255, 0.4);
      padding: 10px 0;
      text-indent: 10px;
      margin: 8px 0;
      font-size: 14px;
      letter-spacing: 2px;
    }

    input::placeholder {
      color: #fff;
    }

    input:focus {
      color: #a262ad;
      outline: none;
      border-bottom: 1px solid #a262ad80;
      transition: 0.5s;
    }

    input:focus::placeholder {
      opacity: 0;
    }

    .form-box button {
      width: 70%;
      margin-top: 35px;
      background-color: #f6f6f6;
      outline: none;
      border-radius: 8px;
      padding: 13px;
      color: #a262ad;
      letter-spacing: 2px;
      border: none;
      cursor: pointer;
    }

    .form-box button:hover {
      background-color: #a262ad;
      color: #f6f6f6;
      transition: background-color 0.5s ease;
    }

    .con-box {
      width: 50%;
      /* 弹性布局 垂直排列 居中 */
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
      /* 绝对定位 居中 */
      position: absolute;
      top: 50%;
      transform: translateY(-50%);
    }

    .con-box.left {
      left: -2%;
    }

    .con-box.right {
      right: -2%;
    }

    .con-box h2 {
      color: #8e9aaf;
      font-size: 25px;
      font-weight: bold;
      letter-spacing: 3px;
      text-align: center;
      margin-bottom: 4px;
    }

    .con-box p {
      font-size: 12px;
      letter-spacing: 2px;
      color: #8e9aaf;
      text-align: center;
    }

    .con-box span {
      color: #d3b7d8;
    }

    .con-box img {
      width: 150px;
      height: 150px;
      opacity: 0.9;
      margin: 40px 0;
    }

    .con-box button {
      margin-top: 3%;
      background-color: #fff;
      color: #a262ad;
      border: 1px solid #d3b7d8;
      padding: 6px 10px;
      border-radius: 5px;
      letter-spacing: 1px;
      outline: none;
      cursor: pointer;
    }

    .con-box button:hover {
      background-color: #d3b7d8;
      color: #fff;
    }
  </style>

  <body>
    <div class="container">
      <div class="form-box">
        <!-- 注册 -->
        <form class="register-box hidden">
          <h1>register</h1>
          <input type="text" name="username" placeholder="用户名" />
          <input type="password" name="password" placeholder="密码" />
          <button>注册</button>
        </form>
        <!-- 登录 -->
        <!-- <div class="login-box"> -->
        <form action="" class="login-box">
          <h1>login</h1>
          <input type="text" name="username" placeholder="用户名" />
          <input type="password" name="password" placeholder="密码" />
          <button>登录</button>
        </form>
        <!-- </div> -->
      </div>
      <div class="con-box left">
        <img src="th.jpg" alt="" />
        <p>已有账号</p>
        <button id="login">去登录</button>
      </div>
      <div class="con-box right">
        <img src="th.jpg" alt="" />
        <p>没有账号?</p>
        <button id="register">去注册</button>
      </div>
    </div>
    <script>
      // 要操作到的元素
      let login = document.getElementById("login");
      let register = document.getElementById("register");
      let form_box = document.getElementsByClassName("form-box")[0];
      let register_box = document.getElementsByClassName("register-box")[0];
      let login_box = document.getElementsByClassName("login-box")[0];
      // 去注册按钮点击事件
      register.addEventListener("click", () => {
        form_box.style.transform = "translateX(80%)";
        login_box.classList.add("hidden");
        register_box.classList.remove("hidden");
      });
      // 去登录按钮点击事件
      login.addEventListener("click", () => {
        form_box.style.transform = "translateX(0%)";
        register_box.classList.add("hidden");
        login_box.classList.remove("hidden");
      });
    </script>
  </body>
</html>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

金融行业有哪些客户管理系统值得推荐?金融CRM系统选型

市场形式波诡云谲&#xff0c;金融行业也面临着资源体系分散、竞争力后继不足、未知风险无法规避等问题。金融企业该如何解决这些问题&#xff0c;或许可以了解一下Zoho CRM管理系统&#xff0c;和其提供的金融行业CRM解决方案。金融CRM系统可以智能化客户筛选、整合各个资源体…

text、icon、progress、rich-text等基础内容小部件(Widget)组件代码明细

属性说明和代码明细如下&#xff1a; text 文本。 属性说明 属性名类型默认值必填说明user-selectbooleanfalse否文本是否可选&#xff0c;该属性会使文本节点显示为 inline-block 示例代码 TYML <view class"text-page"><view class"page-body…

统计学-R语言-2.2

文章目录 前言导入.RData文件方式1方式2方式3 导入程序包方式一方式二 总结 前言 本篇文章是将上篇得软件安装完&#xff0c;对其部分功能进行介绍。 导入.RData文件 在我们日常练习时会有.RData文件导入&#xff0c;并对其进行分析&#xff0c;下面是两种方导入.RData文件。…

通义千问协助分析openHarmony内核编译故障记录

drivers/hdf/khdf/manager/../../../..//framework/utils/src/hdf_sbuf.c:271:6: 错误&#xff1a; ‘-mgeneral-regs-only’ is incompatible with floating-point argument 这个编译错误提示指出&#xff0c;在编译源文件 "hdf_sbuf.c"&#xff08;位于 "driv…

纯html写个个人简历!模版分享啦!!!

用纯html写个个人简历&#xff01;首先得先找个模板&#xff01; 一个优秀模板所应该具有的素质&#xff1f; 简单&#xff1f; 仅仅一个html页面&#xff0c;完全没有乱七八糟&#xff0c;保证学的明明白白。 简单整洁&#xff1f; 该有的内容一个不少&#xff01; 一个完…

快速上手Docker:构建、运行与管理你的容器

快速上手Docker&#xff1a;构建、运行与管理你的容器 引言Docker基础知识1. Docker简介2. 核心概念3. Docker与虚拟机的比较 安装与配置Docker1. 安装Docker2. 配置Docker 构建Docker镜像1. 创建Dockerfile2. 构建镜像3. 验证镜像 运行Docker容器1. 从镜像运行容器2. 查看运行…

Java重写ArrayList方法

前言&#xff1a;ArrayList中有很多方法&#xff0c;我们只有深知这些方法是怎么实现的才能更好的使用&#xff0c;不用死记硬背 我们来一一实现&#xff08;重写&#xff09; 前提准备&#xff1a;我们需要先创建一个类&#xff0c;类中写ArrayList的内部结构组成 public cl…

计算机毕业设计 | SpringBoot+vue校园问卷调查系统(附源码)

1&#xff0c;绪论 研究目的 在进入21世纪以后&#xff0c;互联网得到了蓬勃的发展&#xff0c;电子问卷调查也开始逐渐流行起来。传统纸质问卷和电子问卷相比较后&#xff0c;传统问卷还存在很多弊端&#xff1a; 问卷分发起来比较困难&#xff0c;并且分发试卷耗费大量的金…

使用官方构建工具来创建一个vue3的项目

当你使用 Vite 构建项目时&#xff0c;可能会发现在命令行界面无法选择是否包含 TypeScript 等其他基础配置。此外&#xff0c;使用 vue create 命令创建项目时&#xff0c;默认会使用 vue-cli&#xff0c;但项目启动等过程可能较慢。在这种情况下&#xff0c;你可以参考以下步…

Web3去中心化存储:重新定义云服务

随着Web3技术的崭露头角&#xff0c;去中心化存储正在成为数字时代云服务的全新范式。传统的云服务依赖于中心化的数据存储架构&#xff0c;而Web3的去中心化存储则为用户带来了更安全、更隐私、更可靠的数据管理方式&#xff0c;重新定义了云服务的未来。 1.摒弃中心化的弊端 …

报考人工智能证书都学哪些内容?好过吗?

由国家工信部权威认证的人工智能证书是跨入人工智能行业的敲门砖&#xff0c;随着人工智能技术的发展越来越成熟&#xff0c;相关的从业人员也会剧增&#xff0c;证书的考取难度也会变高。如果已经从事或者准备从事人工智能行业的人员&#xff0c;对于考证宜早不宜迟&#xff0…

升降式OLED透明屏,影响价格的因素有这6大方面

以下是一篇关于升降OLED透明屏的文章&#xff0c;包括其规格、实现原理、应用领域、特色优势和价格等方面&#xff1a; 升降OLED透明屏的规格升降OLED透明屏的尺寸可以根据不同的需求进行定制&#xff0c;尺寸范围从32英寸到200英寸不等。同时&#xff0c;它的厚度不到1厘米&am…

如何使用Lychee结合内网穿透搭建私人图床网站并发布至公网远程访问

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站&#xff0c;可以看做是云存储的一部分&#xff0c;既可…

多云架构下的点击流数据分析

在出海的大趋势下&#xff0c;需要对点击流数据进行分析&#xff0c;以便更快的确定客户。作为多家云厂商的合作伙伴&#xff0c;九河云将提供点击流数据分析的改良方案。 对于这个需求可以借助aws的受众细分和定位解决方案&#xff0c;您可以应用基于云的分析和机器学习来减少…

操作系统-操作系统的概念和功能

文章目录 大家熟悉的操作系统总览操作系统的概念&#xff08;定义&#xff09;操作系统的功能和目标-作为系统资源的管理者操作系统的功能和目标-向上层提供方便易用的服务图形化用户接口联机命令接口脱机命令接口程序接口小结 操作系统的功能和目标-作为最解决硬件的层次小结 …

muduo网络库剖析——套接字Socket类

muduo网络库剖析——套接字Socket类 前情从muduo到my_muduo 概要socket网络编程socket编程接口介绍头文件socketbindlistenacceptaccept4connect 框架与细节成员函数使用方法 源码结尾 前情 从muduo到my_muduo 作为一个宏大的、功能健全的muduo库&#xff0c;考虑的肯定是众多…

Java重修第七天—内部类

通过学习本篇文章可以掌握如下知识 成员内部类 静态内部类 局部内部类 匿名内部类(重点掌握) 内部类 是类中的五大成分之一(成员变量、方法、构造器、内部类、代码块)&#xff0c;其定义为&#xff1a;如果一个类定义在另一个类的内部&#xff0c;这个类就是内部类。 场景…

SqlAlchemy使用教程(四) MetaData 与 SQL Express Language 的使用

四、Database MetaData 与 SQL Express Language 的使用 MetaData对象用于描述表结构&#xff0c;SQL Express Language是DBAPI SQL的统一封装器。MetaData 与SQL Express 语句可以在Core层使用&#xff0c;ORM层基于MetaData, SQL Express基础上做了进一步抽象。本章将介绍在…

如何使用Docker本地搭建Traefik服务并实现公网访问管理界面

文章目录 前言1. Docker 部署 Trfɪk2. 本地访问traefik测试3. Linux 安装cpolar4. 配置Traefik公网访问地址5. 公网远程访问Traefik6. 固定Traefik公网地址 前言 Trfɪk 是一个云原生的新型的 HTTP 反向代理、负载均衡软件&#xff0c;能轻易的部署微服务。它支持多种后端 (D…

电动工具直流调速专用集成电路GS069,具有电源电压范围宽、功耗小、抗干扰能力强等特性

GS069电动工具直流调速电路是CMOS专用集成电路&#xff0c;具有电源电压范 围宽、功耗小、抗干扰能力强等特点。通过外接电阻网络&#xff0c;改变与之相接 的VMOS 管的输出&#xff0c;达到控制电动工具转速的作用。该电路输出幅值宽&#xff0c; 频率变化小&#xff0c;占空比…