gsap+svg实现播放按钮点击变换成收音机播放音乐效果代码

代码语言:html

所属分类:多媒体

代码描述:gsap+svg实现播放按钮点击变换成收音机播放音乐效果代码

代码标签: gsap svg 播放 按钮 点击 变换 收音机 播放 音乐

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="en" >

<head>
 
<meta charset="UTF-8">
 


 
 
<style>
*,
*:after,
*:before {
       
box-sizing: border-box;
       
transform-style: preserve-3d;
}

:root {
       
--handle-girth: 10;
       
--handle-multiplier: 0.5px;
       
--surface-1: hsl(210 10% 50%);
       
--surface-2: hsl(210 10% 40%);
       
--surface-3: hsl(210 10% 30%);
       
--surface-4: hsl(210 10% 20%);
       
--surface-5: hsl(210 10% 10%);
       
--speaker: hsl(0 0% 6%);
       
--trim: hsl(0 0% 90%);
       
--tweeter: hsl(0 0% 30%);
       
--handle: hsl(0 0% 8%);
/*      --handle: var(--trim);*/
       
--label: hsl(0 0% 98%);
       
--top: hsl(210 10% 65%);
       
--front: var(--surface-1);
       
--grill: hsl(0 0% 10%);
       
--back: var(--surface-3);
       
--cassette: hsl(0 0% 0%);
       
--control: hsl(210 80% 80%);
       
--play: hsl(10 80% 80%);
       
--accent: hsl(10 50% 50%);
       
--drawer: hsl(210 10% 6%);
}

body
{
       
background: hsl(210 34% 84%);
       
display: grid;
       
place-items: center;
       
min-height: 100vh;
       
font-family:  'Google Sans', sans-serif, system-ui;
}

span
{
       
display: block;
}

.play-btn {
       
position: relative;
       
border: 0;
       
padding: 0;
       
background: none;
}

.play-btn__text {
       
color: white;
       
padding: 1rem 2rem;
       
background: var(--front);
}

.txt {
       
display: flex;
       
align-items: center;
       
gap: 0.5rem;
}

.play-btn__text svg {
       
width: 24px;
}

.play-btn__box {
       
--depth: var(--boom-depth);
       
display: none;
       
position: absolute;
       
inset: 0;
       
color: var(--surface-3);
       
opacity: 1;
       
transform: translate3d(0, 0, -1px);
/*      transform: translate3d(0, 0, calc(var(--boom-depth) * -0.5px));*/
}

.play-btn__box > .cuboid > .cuboid__side:nth-of-type(2):after {
       
content: "";
       
height: 16%;
       
width: 60%;
       
position: absolute;
       
bottom: 6%;
       
right: 0;
       
background:
                repeating-linear-gradient
(0deg, var(--grill) 0 20%, transparent 20% 40%);
}

.speaker {
       
position: absolute;
       
height: 55%;
       
aspect-ratio: 1;
       
border-radius: 50%;
       
bottom: 0;
       
background: conic-gradient(from 190deg, hsl(0 0% 20%) 0 45deg, transparent 0deg), var(--speaker);
       
border: 4px solid var(--trim);
}

.tweeter {
       
position: absolute;
       
top: 50%;
       
left: 50%;
       
transform: translate(-50%, -50%);
       
height: 50%;
       
aspect-ratio: 1;
       
border-radius: 50%;
       
background: var(--tweeter);
}

.controls {
       
position: absolute;
       
bottom: 10%;
       
left: 10%;
       
height: 16%;
       
display: flex;
       
gap: 4px;
}

.bear {
       
position: absolute;
       
left: 5%;
       
top: 5%;
       
width: 20%;
       
rotate: -30deg;
}

.brand {
       
color: var(--trim);
       
text-shadow: 2px 2px red;
       
position: absolute;
       
right: 4%;
       
top: 8%;
       
font-size: 1rem;
       
font-family: monospace;
       
font-weight: bold;
}

.brand:after {
       
content: "";
       
position: absolute;
       
top: 110%;
       
width: 100%;
       
aspect-ratio: 2 / 1;
       
background: var(--label);
       
right: 0;
}

.control {
       
--depth: 20;
       
height: 100%;
       
aspect-ratio: 1;
       
color: var(--control);
}

.control:nth-of-type(1) {
       
color: hsl(130 80% 80%);
}

.cogs {
       
position: absolute;
       
top: 50%;
       
left: 50%;
       
translate: -50% -50%;
       
height: 40%;
       
width: 70%;
       
display: flex;
       
justify-content: space-between;
}

.cogs:after {
       
content: "";
       
font-family: cursive;
       
background: white;
       
height: 0.5rem;
       
position: absolute;
       
top: 110%;
       
width: 80%;
       
left: 50%;
       
overflow: hidden;
       
translate: -50% 0;
}

.cog {
       
fill: black;
       
stroke: var(--trim);
}

.control:nth-of-type(3) {
       
aspect-ratio: 2 / 1;
       
color: var(--play);
}

.speaker--left {
       
left: 0;
       
translate: 10% -10%;
}

.speaker--right {
       
right: 0;
       
translate: -10% -10%;
}

.cassette-hole {
       
--depth: 20;
       
color: var(--surface-4);
       
aspect-ratio: 4 / 2.5;
       
width: 25%;
       
position: absolute;
       
top: 50%;
       
left: 50%;
       
translate: -50% 0;
       
transform-origin: 50% 100%;
       
transform: translate3d(0, 0, -11px);
}

.cassette-hole .cuboid__side:nth-of-type(5) {
       
display: none;
}

.cassette {
       
--depth: 10;
       
color: var(--cassette);
       
width: 90%;
       
aspect-ratio: 4 / 2.5;
       
transform: translate3d(0, 0, -11px);
}

.cassette-deck {
       
aspect-ratio: 4 / 2.5;
       
background:
                linear-gradient
(90deg, var(--drawer) 10px, transparent 10px calc(100% - 10px), var(--drawer) calc(100% - 10px)),
                linear-gradient
(0deg, var(--drawer) 10px, transparent 10px calc(100% - 10px), var(--drawer) calc(100% - 10px)),
                linear-gradient
(-65deg, transparent 70%, hsl(0 0% 100% / 0.5) 70.5% 80%, transparent 80.5% 82%, hsl(0 0% 100% / 0.5) 82.5% 84%, transparent 84.5%),
                hsl
(0 0% 100% / 0.2);
       
display: grid;
       
place-items: center;
       
width: 25%;
       
position: absolute;
       
top: 50%;
       
left: 50%;
       
translate: -50% 0;
       
transform-origin: 50% 100%;
       
transform: rotateX(0deg);
}

.cassette .cuboid__side:nth-of-type(5) {
       
background: linear-gradient(90deg, transparent 60%, red 60.5% 70.5%, transparent 71%), var(--cassette);
}

.cassette-deck:after,
.cassette-deck:before {
       
content: "";
       
position: absolute;
       
bottom: 0;
       
height: 85%;
       
width: 10%;
       
background: var(--drawer);
}

.cassette-deck:after {
       
left: 100%;
       
transform-origin: 0 50%;
       
transform: rotateY(90deg);
       
-webkit-clip-path: polygon(0 0, 100% 25%, 100% 100%, 0 100%);
               
clip-path: polygon(0 0, 100% 25%, 100% 100%, 0 100%);
}

.cassette-deck:before {
       
right: 100%;
       
transform-origin: 100% 50%;
       
transform: rotateY(-90deg);
       
-webkit-clip-path: polygon(0 25%, 100% 0%, 100% 100%, 0 100%);
               
clip-path: polygon(0 25%, 100% 0%, 100% 100%, 0 100%);
}

.play-btn > .cuboid {
       
color: var(--back);    
}

.play-btn__box > .cuboid > .cuboid__side:nth-of-type(5) {
       
filter: none;
 
height: 100%;
 
width: 100%;
 
transform: translate3d(0, 0, calc(var(--depth, 20) * 0.5px));
 
top: 0;
 
left: 0;
 
background:
        linear-gradient
(180deg, var(--front) 50%, transparent 50% 77%, var(--front) 77%),
        linear-gradient
(90deg, var(--front) 38.5%, transparent 38.5% 62.5%, var(--front) 62.5%),
        hsl
(0 0% 50% / var(--fill, 0));
}

.eq-wrap {
       
width: 25%;
       
aspect-ratio: 16 / 6;
       
top: 20%;
       
position: absolute;
       
left: 50%;
       
translate: -50% 0;
}

.eq {
       
border: 4px solid black;
       
aspect-ratio: 16 / 6;
       
width: 100%;
       
background: black;
}

.eq-wrap:after {
       
content: "";
       
position: absolute;
       
inset: 0;
       
border: 4px solid black;
       
background:
                linear-gradient
(-65deg, transparent 50%, hsl(0 0% 100% / 0.5) 50.5% 60%, transparent 60.5% 62%, hsl(0 0% 100% / 0.5) 62.5% 64%, transparent 64.5%);
}

.top {
       
position: absolute;
       
bottom: 10%;
       
width: calc(90% - (2 * (var(--handle-girth) * 1px)));
       
height: 90%;
       
--depth: calc(var(--active) * 40);
       
left: 50%;
       
translate: -50% 0;
       
color: var(--top);
       
transform: translate3d(0, 0, -20px);
}

.top .cuboid__side:nth-of-type(2) {
       
background: var(--back);
}

.play-btn__backdrop {
       
background: var(--surface);
       
position: absolute;
       
inset: 0;
       
z-index: 0;
}

.play-btn__box > .cuboid > .cuboid__side:nth-of-type(6) {
       
background:
                linear-gradient
(0deg, var(--back) calc(100% - (var(--handle-girth) * 1px)), transparent calc(100% - (var(--handle-girth) * 1px))),
                linear-gradient
(90deg, var(--back) 5%, transparent 5% 95%, var(--back) 95%);
}

.top > .cuboid > .cuboid__side:nth-of-type(5):after {
       
content: "";
       
position: absolute;
       
right: 10%;
       
top: 0;
       
background: repeating-linear-gradient(90deg, var(--grill) 0 5%, transparent 5% 10%);
       
height: 30%;
       
width: 36%;
}

.play-btn__box > .cuboid > .cuboid__side:nth-of-type(1) {
       
background:
                linear-gradient
(0deg, var(--top) 10%, transparent 10%),
                linear-gradient
(90deg, var(--top) 5%, transparent 5% 95%, var(--top) 95%);
}

.handle {
       
color: var(--handle);
       
height: 80%;
       
position: absolute;
       
top: 0;
       
left: 50%;
       
translate: -50% 0;
       
width: 90%;
       
transform-origin: 50% 100%;
       
transform: translate3d(0, 0, calc(var(--handle-girth) * -0.5px)) rotateX(0deg);
}

.handle__segment {
       
--depth: calc(var(--active) * var(--handle-girth));
       
position: absolute;
}

.handle__left {
       
width: calc(var(--handle-girth) * var(--handle-multiplier));
       
height: 100%;
       
left: 0;
}
.handle__right {
       
width: calc(var(--handle-girth) * var(--handle-multiplier));
       
height: 100%;
       
right: 0;
}

.handle__top {
       
height: calc(var(--handle-girth) * var(--handle-multiplier));
       
width: 100%;
}

.btn-scene {
       
--active: 0;
       
position: relative;
}

.btn-shadow {
       
width: 100%;
       
aspect-ratio: 4 / 1;
       
background: hsl(0 0% 10%);
       
top: 100%;
       
position: absolute;
       
translate: 0 -50%;
       
transform: rotateX(90deg) translate(0, -1px);
}

/* Cuboid related stuff */
.cuboid {
 
--color-range-lower: 180;
 
--color-range-upper: 340;
 
--step: calc((var(--color-range-upper) - var(--color-range-lower)) / var(--count));
 
--alpha: calc(1 - ((0.85 / var(--count)) * var(--index)));
 
--color: hsl(calc(var(--color-range-lower) + (var(--step) * var(--index))) 80% 60% / var(--alpha));
 
--bg: currentColor;
}


/* Cuboid boilerplate code */
.cuboid {
 
width: 100%;
 
height: 100%;
 
position: relative;
}
.cuboid__side {
 
background: var(--bg);
 
filter: brightness(var(--b, 1));
 
border: calc(var(--size) * 0.0075vmin) solid var(--color);
 
position: absolute;
}
.cuboid__side:nth-of-type(1) {
 
--b: 1.1;
 
filter: none;
 
height: calc(var(--depth, 20) * 1px);
 
width: 100%;
 
top: 0;
/*  perspective: 100vmin;*/
 
transform: translate(0, -50%) rotateX(90deg);
}
.cuboid__side:nth-of-type(2) {
 
--b: 0.9;
 
height: 100%;
 
width: calc(var(--depth, 20) * 1px);
 
top: 50%;
 
right: 0;
 
transform: translate(50%, -50%) rotateY(90deg);
}
.cuboid__side:nth-of-type(3) {
 
--b: 0.5;
 
width: 100%;
 
height: calc(var(--depth, 20) * 1px);
 
bottom: 0;
 
transform: translate(0%, 50%) rotateX(90deg);
}
.cuboid__side:nth-of-type(4) {
 
--b: 1;
 
height: 100%;
 
width: calc(var(--depth, 20) * 1px);
 
left: 0;
 
top: 50%;
 
transform: translate(-50%, -50%) rotateY(90deg);
}
.cuboid__side:nth-of-type(5) {
       
filter: none;
 
height: 100%;
 
width: 100%;
 
transform: translate3d(0, 0, calc(var(--depth, 20) * 0.5px));
 
top: 0;
 
left: 0;
/*  perspective: 100vmin;*/
}
.cuboid__side:nth-of-type(6) {
 
--b: 1.2;
 
height: 100%;
 
width: 100%;
 
transform: translate3d(0, 0, calc(var(--depth, 20) * -0.5px)) rotateY(180deg);
 
top: 0;
 
left: 0;
}
</style>


</head>

<body >

<div class="btn-scene">
 
<div class="btn-jump">
   
<div class="btn-tip">
     
<button class="play-btn">
   .........完整代码请登录后点击上方下载按钮下载查看

网友评论0