環境の準備
①ターミナルでreactアプリケーションを作成する。
$ npx create-react-app <プロジェクト名>
% cd <プロジェクト名>
% npm start
コンポーネント・ファイル構成
src
├── components
├── LoginRegister.css
└── LoginRegister.js
├── App.js
├── App.css
├── index.js
App.js
import LoginRegister from "./components/LoginRegister";
function App() {
return (
<>
<LoginRegister />
</>
);
}
export default App;
LoginRegister.js
import React, { useState } from "react";
import "./LoginRegister.css";
function LoginRegister() {
const [addclass, setaddclass] = useState("");
const [click, setClick] = useState(false);
const handleClick = () => {
setClick(!click);
};
return (
<div className={`container ${addclass}`} id="container">
<div className="form-container sign-up-container">
<form>
<h1>Create Account</h1>
<input type="text" placeholder="Name" />
<input type="email" placeholder="Email" />
<input type="password" placeholder="Password" />
<button type="submit">REGISTER</button>
</form>
</div>
<div className="form-container sign-in-container">
<form>
<h1>Login</h1>
<input type="email" placeholder="Email" />
<input type="password" placeholder="Password" />
<button type="submit">LOGIN</button>
</form>
</div>
<div className="overlay-container">
<div className="overlay">
<div className="overlay-panel overlay-left">
<button
className="ghost"
id="signIn"
onClick={() => setClick(!click)}
>
GO TO LOGIN
</button>
</div>
<div className="overlay-panel overlay-right">
<button
className="ghost"
id="signUp"
onClick={() => setClick(!click)}
>
GO TO REGISTER
</button>
</div>
</div>
</div>
</div>
);
}
export default LoginRegister;
LoginRegister.css
* {
box-sizing: border-box;
}
body {
background-color: black;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
height: 100vh;
margin: -20px 0 50px;
}
h1 {
font-weight: bold;
margin: 0;
}
button {
border-radius: 15px;
border: 2px solid white;
background-color: green;
color: #ffffff;
font-size: 14px;
font-weight: bold;
padding: 14px 45px;
letter-spacing: 1px;
text-transform: uppercase;
transition: transform 80ms ease-in;
}
button:active {
transform: scale(0.95);
}
button:focus {
outline-color: #ffffff;
}
button.ghost {
background-color: transparent;
border-color: #ffffff;
}
form {
background-color: #ffffff;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
padding: 0 50px;
height: 100%;
text-align: center;
}
input {
background-color: #ffffff;
border: 2px solid #0a0;
padding: 12px 15px;
margin: 10px 0;
width: 100%;
}
.container {
background-color: #ffffff;
border-radius: 10px;
box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22);
position: relative;
overflow: hidden;
width: 768px;
max-width: 100%;
min-height: 480px;
}
.form-container {
position: absolute;
top: 0;
height: 100%;
transition: all 0.6s ease-in-out;
}
.sign-in-container {
left: 0;
width: 50%;
z-index: 2;
}
.container.right-panel-active .sign-in-container {
transform: translateX(100%);
}
.sign-up-container {
left: 0;
width: 50%;
opacity: 1;
z-index: 5;
}
.container.right-panel-active .sign-up-container {
transform: translateX(100%);
opacity: 1;
z-index: 5;
animation: show 0.6s;
}
@keyframes show {
0%,
49.99% {
opacity: 0;
z-index: 1;
}
50%,
100% {
opacity: 1;
z-index: 5;
}
}
.overlay-container {
position: absolute;
top: 0;
left: 50%;
width: 50%;
height: 100%;
overflow: hidden;
transition: transform 0.6s ease-in-out;
z-index: 100;
}
.container.right-panel-active.overlay-container {
transform: translateX(-100%);
}
.overlay {
background: yellowgreen;
background-repeat: no-repeat;
background-size: cover;
background-position: 0 0;
color: #ffffff;
position: relative;
left: -100%;
height: 100%;
width: 200%;
transform: translateX(0);
transition: transform 0.6s ease-in-out;
}
.container.right-panel-active.overlay {
transform: translateX(50%);
}
.overlay-panel {
position: absolute;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
padding: 0 40px;
text-align: center;
top: 0;
height: 100%;
width: 50%;
transform: translateX(0);
transition: transform 0.6s ease-in-out;
}
.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%);
}
##参考サイト
[React Sliding Login & Register Form]
(https://www.youtube.com/watch?v=1HqLemkphI4&t=934s)