tone实现可视化多节奏声音输出效果代码

代码语言:html

所属分类:多媒体

代码描述:tone实现可视化多节奏声音输出效果代码,点击左侧音乐图标开始演奏,右侧色板可调颜色。

代码标签: tone 可视化 节奏 声音 输出

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

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

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


 
 
<style>
@charset "UTF-8";
body
,
.scene, .container::after, .container::before,
.element::after,
.element::before, .container,
.element, .sound {
 
position: absolute;
 
transform-style: preserve-3d;
}

.container::after, .container::before,
.element::after,
.element::before, .container,
.element, .sound {
 
display: flex;
 
align-items: center;
 
justify-content: center;
}

body
,
.scene {
 
display: grid;
 
place-self: center;
}
body
> *,
.scene > * {
 
place-self: center;
}

:root {
 
--perspective: 400vmin;
}

*,
*::after,
*::before {
 
margin: 0;
 
border: 0;
 
padding: 0;
 
box-sizing: border-box;
}

body
{
 
height: 100vh;
 
width: 100vw;
 
overflow: hidden;
 
perspective: var(--perspective);
 
background: var(--background, #000);
}

@media screen and (orientation: portrait) {
 
.themes {
   
--test: portrait;
 
}
}
@media screen and (orientation: landscape) {
 
.themes {
   
--test: landscape;
 
}
}
.themes.horizontal {
 
width: 100vw;
}
.themes.vertical {
 
height: 100vh;
}
.themes-trigger, .themes-menu {
 
position: absolute;
}
.themes-trigger, .themes-select {
 
height: 48px;
 
width: 48px;
 
-webkit-appearance: none;
     
-moz-appearance: none;
         
appearance: none;
 
border-radius: 50%;
 
cursor: pointer;
}
.themes-menu {
 
display: flex;
 
overflow: hidden;
 
will-change: transform;
 
transition: transform 0.5s ease-in-out;
 
/* width */
 
/* Track */
 
/* Handle */
 
/* Handle on hover */
}
.themes-menu::-webkit-scrollbar-track {
 
background: transparent;
}
.themes-menu::-webkit-scrollbar-thumb {
 
background: var(--stroke, gray);
 
border-radius: 10px;
}
.themes-menu::-webkit-scrollbar-thumb:hover {
 
background: var(--hover, darkgray);
}
.themes.horizontal .themes-menu {
 
flex-wrap: nowrap;
 
overflow-x: scroll;
 
height: 78px;
 
width: calc(100% - 48px - 20px);
 
bottom: -78px;
 
/* width */
}
.themes.horizontal .themes-menu::-webkit-scrollbar {
 
height: 10px;
}
.themes.vertical .themes-menu {
 
flex-wrap: wrap;
 
overflow-y: scroll;
 
height: calc(100% - 48px - 20px);
 
width: 78px;
 
right: -78px;
 
/* width */
}
.themes.vertical .themes-menu::-webkit-scrollbar {
 
width: 10px;
}
.themes-select {
 
flex: 0 0 48px;
 
border: 2.5px solid var(--stroke);
 
background: linear-gradient(var(--background) 0% 25%, var(--stroke) 25% 50%, var(--fill) 50% 75%, var(--hover) 75% 100%);
}
.themes.horizontal .themes-select {
 
margin: 10px 5px;
}
.themes.vertical .themes-select {
 
margin: 5px 10px;
}
.themes-trigger {
 
right: 20px;
 
bottom: 10px;
 
background: conic-gradient(red, orange, yellow, green, blue, indigo, violet, red);
}
.themes-trigger, .themes-trigger::after {
 
display: flex;
 
justify-content: center;
 
align-items: center;
}
.themes-trigger::after {
 
content: "X";
 
opacity: 0;
 
border-radius: 50%;
 
height: 48px;
 
width: 48px;
 
font-size: 32px;
 
font-weight: bold;
 
color: #000;
 
transition: 0.35s ease-in-out;
 
transition-property: opacity, color;
}
.themes-trigger:hover::after {
 
color: #fff;
}
.themes-trigger:checked::after {
 
opacity: 1;
}
.themes.horizontal .themes-trigger {
 
right: 10px;
 
bottom: 20px;
}
.themes.horizontal .themes-trigger:checked + .themes-menu {
 
transform: translatey(-78px);
}
.themes.vertical .themes-trigger {
 
right: 20px;
 
bottom: 10px;
}
.themes.vertical .themes-trigger:checked + .themes-menu {
 
transform: translatex(-78px);
}

:root {
 
--time: 1s;
 
--delay: 0.0204081633s;
 
--elements: 7;
 
--animation: paused;
}

.sound {
 
-webkit-appearance: none;
     
-moz-appearance: none;
         
appearance: none;
 
bottom: 10px;
 
left: 10px;
 
background: none;
 
cursor: pointer;
 
font-size: 2.5em;
}
.sound::after {
 
content: "🎵";
 
color: transparent;
 
text-shadow: 0 0 0 var(--fill);
}

.container::after, .container::before,
.element::after,
.element::before {
 
content: "";
}

.element::after {
 
background: var(--fill);
 
left: var(--position-element);
 
border-radius: 50%;
 
border: 0.25vmin solid var(--stroke);
 
height: 2vmin;
 
width: 2vmin;
 
-webkit-animation: rotate var(--time, 1s) var(--delay, 0s) linear infinite;
         
animation: rotate var(--time, 1s) var(--delay, 0s) linear infinite;
 
-webkit-animation-play-state: var(--animation);
         
animation-play-state: var(--animation);
 
transform-origin: calc(-1 * var(--position-element)) center;
}
.element::before {
 
border-radius: 50%;
 
border: 0.25vmin solid var(--hover);
 
height: var(--diameter-circle);
 
width: var(--diameter-circle);
 
opacity: 0.5;
}
.element:nth-child(1) {
 
--position-element: 3.875vmin;
 
--diameter-circle: 10vmin;
 
--time: 1s;
}
.element:nth-child(2) {
 
--position-element: 6.125vmin;
 
--diameter-circle: 14.5vmin;
 
--time: 1.0204081633s;
}
.element:nth-child(3) {
 
--position-element: 8.375vmin;
 
--diameter-circle: 19vmin;
 
--time: 1.0408163265s;
}
.element:nth-child(4) {
 
--position-element: 10.625vmin;
 
--diameter-circle: 23.5vmin;
 
--time: 1.0612244898s;
}
.element:nth-child(5) {
 
--position-element: 12.875vmin;
 
--diameter-circle: 28vmin;
 
--time: 1.0816326531s;
}
.element:nth-child(6) {
 
--position-element: 15.125vmin;
 
--diameter-circle: 32.5vmin;
 
--time: 1.1020408163s;
}
.element:nth-child(7) {
 
--position-element: 17.375vmin;
 
--diameter-circle: 37vmin;
 
--time: 1.1224489796s;
}

@-webkit-keyframes rotate {
 
100% {
   
transform: rotate3d(0, 0, -1, 1turn);
 
}
}

@keyframes rotate {
 
100% {
   
transform: rotate3d(0, 0, -1, 1turn);
 
}
}
</style>


 
 
</head>

<body translate="no">
 
 
<script >
      function getVariableCSS(name, source = document.documentElement) {
        return getComputedStyle(source).getPropertyValue(`--${name}`);
}

function setVariableCSS(name, value, source = document.documentElement) {
        return source.style.setProperty(`--${name}`, value);
}

function appendChildren(children, parent = document.body) {
        if (Array.isArray(children)) parent.append(...children);
        else parent.append(children);

        return parent;
}

function createElements(
        length,
        clone = document.createElement("div"),
        deep = true
) {
        return Array.from({ length }, () => clone.cloneNode(deep));
}

function createElement(className, tag = "div") {
        const element = do.........完整代码请登录后点击上方下载按钮下载查看

网友评论0