Tab Card动画切换
效果图

代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
:root {
font-size: 16px;
--nav-item-width: 9rem;
--nav-item-height: 2rem;
--nav-item-padding: 1rem;
--transition-speed: .5s;
}
body {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 100vh;
padding: 0;
margin: 0;
background-color: #e2e8f0;
font-family: Helvetica;
}
input[type="radio"] {
display: none;
}
nav {
background-color: #fff;
padding: var(--nav-item-padding) 0;
border-radius: var(--nav-item-height);
position: relative;
box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.1);
overflow: hidden;
}
nav::after {
content: "";
width: calc(var(--nav-item-width) - var(--nav-item-padding));
height: calc(var(--nav-item-height) + var(--nav-item-padding));
background-color: #e2e8f0;
position: absolute;
top: 0;
left: 0;
margin: calc(var(--nav-item-padding) / 2);
border-radius: 9999px;
transition: var(--transition-speed) all cubic-bezier(0.42, 0, 0.32, 1.6);
}
nav ul {
position: relative;
list-style: none;
margin: 0;
padding: 0;
display: flex;
align-items: center;
height: var(--nav-item-height);
z-index: 10;
}
nav ul li {
width: var(--nav-item-width);
font-size: 1.3rem;
text-align: center;
user-select: none;
}
nav ul li label {
display: block;
width: 100%;
height: 100%;
cursor: pointer;
}
#nav-home:checked~nav::after {
transform: translateX(0);
}
#nav-products:checked~nav::after {
transform: translateX(var(--nav-item-width));
}
#nav-about:checked~nav::after {
transform: translateX(calc(var(--nav-item-width) * 2));
}
#nav-contact:checked~nav::after {
transform: translateX(calc(var(--nav-item-width) * 3));
}
.content {
width: calc(var(--nav-item-width) * 4);
height: 400px;
background-color: #fff;
margin-top: var(--nav-item-height);
border-radius: var(--nav-item-padding);
display: flex;
overflow: hidden;
box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.1);
}
.content div {
width: calc(var(--nav-item-width) * 4);
background-color: #000;
flex-shrink: 0;
transition: var(--transition-speed) all cubic-bezier(0.42, 0, 0.32, 1.6);
}
.content div:nth-of-type(1) {
background-color: #22d3ee;
}
.content div:nth-of-type(2) {
background-color: #4ade80;
}
.content div:nth-of-type(3) {
background-color: #f472b6;
}
.content div:nth-of-type(4) {
background-color: #facc15;
}
#nav-home:checked~.content div {
transform: translateX(0);
}
#nav-products:checked~.content div {
transform: translateX(calc(var(--nav-item-width) * 4 * -1));
}
#nav-about:checked~.content div {
transform: translateX(calc(var(--nav-item-width) * 4 * -2));
}
#nav-contact:checked~.content div {
transform: translateX(calc(var(--nav-item-width) * 4 * -3));
}
</style>
</head>
<body>
<input type="radio" name="nav" id="nav-home"></input>
<input type="radio" name="nav" id="nav-products"></input>
<input type="radio" name="nav" id="nav-about"></input>
<input type="radio" name="nav" id="nav-contact"></input>
<nav>
<ul>
<li>
<label for="nav-home">
Home
</label>
</li>
<li>
<label for="nav-products">
Products
</label>
</li>
<li>
<label for="nav-about">
About
</label>
</li>
<li>
<label for="nav-contact">
Contact
</label>
</li>
</ul>
</nav>
<div class="content">
<div></div>
<div></div>
<div></div>
<div></div>
</div>
</body>
</html>