Dribbble shot: https://dribbble.com/shots/4240318-Made-with-InVision-Studio-Music-Player
This is a minimal, clean audio/music/mp3 player with spinning cover images, built with jQuery, TweenMax.js and SVG images.
A Pen by Valery Alikin on CodePen.
| <div class="player"> | |
| <div class="player__bar"> | |
| <div class="player__album"> | |
| <div class="player__albumImg active-song" | |
| data-author="Khalid" | |
| data-song="Location" | |
| data data-src="http://ol5.mp3party.net/online/8418/8418598.mp3" style="background-image: url(https://alikinvv.github.io/minimal-player/build/img/album.jpg"> | |
| </div> | |
| <div class="player__albumImg" | |
| data-author="Khalid" | |
| data-song="Angels" | |
| data data-src="http://music.dawnfoxes.com/_fxs_/_upls_/_sngs_/USA/khalid-angels.mp3" style="background-image: url(https://alikinvv.github.io/minimal-player/build/img/album.jpg"> | |
| </div> | |
| </div> | |
| <div class="player__controls"> | |
| <div class="player__prev"> | |
| <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path d="M26.695 34.434v31.132L54.5 49.998z"/><path d="M24.07 34.434v31.132c0 2.018 2.222 3.234 3.95 2.267l27.804-15.568c1.706-.955 1.707-3.578 0-4.533L28.02 32.168c-2.957-1.655-5.604 2.88-2.649 4.533l27.805 15.564v-4.533L25.371 63.3l3.95 2.267V34.435c-.001-3.387-5.251-3.387-5.251-.001z"/><g><path d="M55.5 34.434v31.132l27.805-15.568z"/><path d="M52.875 34.434v31.132c0 2.018 2.222 3.234 3.949 2.267 9.27-5.189 18.537-10.379 27.805-15.568 1.705-.955 1.705-3.578 0-4.533L56.824 32.168c-2.957-1.655-5.604 2.88-2.648 4.533l27.803 15.564v-4.533L54.176 63.3l3.949 2.267V34.435c0-3.387-5.25-3.387-5.25-.001z"/></g></svg> | |
| </div> | |
| <div class="player__play"> | |
| <svg class="icon play" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path d="M51.109 30.335l-36-24A2 2 0 0 0 12 8v48a2.003 2.003 0 0 0 2 2c.388 0 .775-.113 1.109-.336l36-24a2 2 0 0 0 0-3.329z"/></svg> | |
| <svg class="icon pause" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path d="M22.537 8.046h17.791c1.104 0 2.003.898 2.003 1.993v79.912a2.005 2.005 0 0 1-2.003 2.003h-17.79a2.005 2.005 0 0 1-2.003-2.003V10.04c0-1.095.898-1.993 2.002-1.993zM59.672 8.046h17.8c1.095 0 1.993.898 1.993 1.993v79.912a2.003 2.003 0 0 1-1.993 2.003h-17.8a1.997 1.997 0 0 1-1.993-2.003V10.04c0-1.095.889-1.993 1.993-1.993z"/></svg> | |
| </div> | |
| <div class="player__next"> | |
| <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path d="M26.695 34.434v31.132L54.5 49.998z"/><path d="M24.07 34.434v31.132c0 2.018 2.222 3.234 3.95 2.267l27.804-15.568c1.706-.955 1.707-3.578 0-4.533L28.02 32.168c-2.957-1.655-5.604 2.88-2.649 4.533l27.805 15.564v-4.533L25.371 63.3l3.95 2.267V34.435c-.001-3.387-5.251-3.387-5.251-.001z"/><g><path d="M55.5 34.434v31.132l27.805-15.568z"/><path d="M52.875 34.434v31.132c0 2.018 2.222 3.234 3.949 2.267 9.27-5.189 18.537-10.379 27.805-15.568 1.705-.955 1.705-3.578 0-4.533L56.824 32.168c-2.957-1.655-5.604 2.88-2.648 4.533l27.803 15.564v-4.533L54.176 63.3l3.949 2.267V34.435c0-3.387-5.25-3.387-5.25-.001z"/></g></svg> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="player__timeline"> | |
| <p class="player__author"></p> | |
| <p class="player__song"></p> | |
| <div class="player__timelineBar"><div id="playhead"></div></div> | |
| </div> | |
| </div> | |
| <!-- github --> | |
| <a href="https://github.com/alikinvv/minimal-player" class="github-corner" aria-label="View source on GitHub"><svg width="80" height="80" viewBox="0 0 250 250" style="fill:#151513; color:#ffeff5; position: absolute; top: 0; border: 0; right: 0;" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg></a><style>.github-corner:hover .octo-arm{animation:octocat-wave 560ms ease-in-out}@keyframes octocat-wave{0%,100%{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@media (max-width:500px){.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:octocat-wave 560ms ease-in-out}}</style> |
Dribbble shot: https://dribbble.com/shots/4240318-Made-with-InVision-Studio-Music-Player
This is a minimal, clean audio/music/mp3 player with spinning cover images, built with jQuery, TweenMax.js and SVG images.
A Pen by Valery Alikin on CodePen.
| $(document).ready(function () { | |
| var audioElement = document.createElement('audio'); | |
| audioElement.setAttribute('src', $('.active-song').attr('data-src')); | |
| var tl = new TimelineMax(); | |
| tl.to('.player__albumImg', 3, { | |
| rotation: '360deg', | |
| repeat: -1, | |
| ease: Power0.easeNone | |
| }, '-=0.2'); | |
| tl.pause(); | |
| $('.player__play').click(function () { | |
| if ($('.player').hasClass('play')) { | |
| $('.player').removeClass('play'); | |
| audioElement.pause(); | |
| TweenMax.to('.player__albumImg', 0.2, { | |
| scale: 1, | |
| ease: Power0.easeNone | |
| }) | |
| tl.pause(); | |
| } else { | |
| $('.player').addClass('play'); | |
| audioElement.play(); | |
| TweenMax.to('.player__albumImg', 0.2, { | |
| scale: 1.1, | |
| ease: Power0.easeNone | |
| }) | |
| tl.resume(); | |
| } | |
| }); | |
| var playhead = document.getElementById("playhead"); | |
| audioElement.addEventListener("timeupdate", function () { | |
| var duration = this.duration; | |
| var currentTime = this.currentTime; | |
| var percentage = (currentTime / duration) * 100; | |
| playhead.style.width = percentage + '%'; | |
| }); | |
| function updateInfo() { | |
| $('.player__author').text($('.active-song').attr('data-author')); | |
| $('.player__song').text($('.active-song').attr('data-song')); | |
| } | |
| updateInfo(); | |
| $('.player__next').click(function () { | |
| if ($('.player .player__albumImg.active-song').is(':last-child')) { | |
| $('.player__albumImg.active-song').removeClass('active-song'); | |
| $('.player .player__albumImg:first-child').addClass('active-song'); | |
| audioElement.addEventListener("timeupdate", function () { | |
| var duration = this.duration; | |
| var currentTime = this.currentTime; | |
| var percentage = (currentTime / duration) * 100; | |
| playhead.style.width = percentage + '%'; | |
| }); | |
| } else { | |
| $('.player__albumImg.active-song').removeClass('active-song').next().addClass('active-song'); | |
| audioElement.addEventListener("timeupdate", function () { | |
| var duration = this.duration; | |
| var currentTime = this.currentTime; | |
| var percentage = (currentTime / duration) * 100; | |
| playhead.style.width = percentage + '%'; | |
| }); | |
| } | |
| updateInfo(); | |
| audioElement.setAttribute('src', $('.active-song').attr('data-src')); | |
| audioElement.play(); | |
| }); | |
| $('.player__prev').click(function () { | |
| if ($('.player .player__albumImg.active-song').is(':first-child')) { | |
| $('.player__albumImg.active-song').removeClass('active-song'); | |
| $('.player .player__albumImg:last-child').addClass('active-song'); | |
| audioElement.addEventListener("timeupdate", function () { | |
| var duration = this.duration; | |
| var currentTime = this.currentTime; | |
| var percentage = (currentTime / duration) * 100; | |
| playhead.style.width = percentage + '%'; | |
| }); | |
| } else { | |
| $('.player__albumImg.active-song').removeClass('active-song').prev().addClass('active-song'); | |
| audioElement.addEventListener("timeupdate", function () { | |
| var duration = this.duration; | |
| var currentTime = this.currentTime; | |
| var percentage = (currentTime / duration) * 100; | |
| playhead.style.width = percentage + '%'; | |
| }); | |
| } | |
| updateInfo(); | |
| audioElement.setAttribute('src', $('.active-song').attr('data-src')); | |
| audioElement.play(); | |
| }); | |
| }); |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.20.3/TweenMax.min.js"></script> |
| .icon { | |
| display: inline-block; | |
| width: 2em; | |
| height: 2em; | |
| font-size: 30px; | |
| fill: #D7DCE2; | |
| transition: all .2s ease-in-out; | |
| } | |
| html, body { | |
| height: 100%; | |
| } | |
| body { | |
| background: #ffeff5; | |
| position: relative; | |
| } | |
| .player { | |
| position: absolute; | |
| top: 50%; | |
| left: 50%; | |
| transform: translate(-50%, -50%); | |
| &.play { | |
| .player__timeline { | |
| transform: translateY(-90%); | |
| } | |
| .player__album:after { | |
| box-shadow: 0px 30px 28px -10px rgba(0,0,0,.2); | |
| } | |
| .player__album { | |
| top: -65px; | |
| } | |
| .pause { | |
| display: inline-block; | |
| } | |
| .play { | |
| display: none; | |
| } | |
| } | |
| &__album { | |
| width: 112px; | |
| height: 112px; | |
| border-radius: 50%; | |
| margin-right: 22px; | |
| position: relative; | |
| top: -50px; | |
| transition: all .4s ease-in-out; | |
| &:before { | |
| content: ''; | |
| width: 25px; | |
| height: 25px; | |
| position: absolute; | |
| z-index: 3; | |
| top: 50%; | |
| left: 50%; | |
| transform: translate(-50%, -50%); | |
| background: #fff; | |
| border-radius: 50%; | |
| } | |
| &:after { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| right: 0; | |
| bottom: 0; | |
| left: 0; | |
| border-radius: 50%; | |
| box-shadow: none; | |
| transition: all .3s ease-in-out; | |
| } | |
| } | |
| &__albumImg { | |
| background-size: cover; | |
| background-position: center; | |
| background-repeat: no-repeat; | |
| width: 100%; | |
| height: 100%; | |
| border-radius: 50%; | |
| position: relative; | |
| z-index: 2; | |
| display: none; | |
| &.active-song { | |
| display: block; | |
| } | |
| } | |
| &__bar { | |
| background: #fff; | |
| padding: 10px 25px; | |
| height: 100px; | |
| display: flex; | |
| justify-content: space-between; | |
| border-radius: 15px; | |
| box-shadow: 0 30px 56px 6px rgba(0,0,0,0.1); | |
| position: relative; | |
| z-index: 3; | |
| } | |
| &__controls { | |
| display: flex; | |
| align-items: center; | |
| } | |
| &__prev { | |
| transform: rotate(180deg); | |
| height: 80px; | |
| width: 80px; | |
| display: flex; | |
| justify-content: center; | |
| align-items: center; | |
| cursor: pointer; | |
| border-radius: 15px; | |
| transition: all .2s ease-in-out; | |
| margin-right: 3px; | |
| &:hover { | |
| background: #D7DCE2; | |
| svg { | |
| fill: #fff; | |
| } | |
| } | |
| } | |
| &__play { | |
| cursor: pointer; | |
| height: 80px; | |
| width: 80px; | |
| display: flex; | |
| justify-content: center; | |
| align-items: center; | |
| border-radius: 15px; | |
| transition: all .2s ease-in-out; | |
| margin-right: 3px; | |
| position: relative; | |
| &:hover { | |
| background: #D7DCE2; | |
| svg { | |
| fill: #fff; | |
| } | |
| } | |
| svg { | |
| font-size: 20px; | |
| position: absolute; | |
| top: 50%; | |
| left: 50%; | |
| transform: translate(-50%, -50%); | |
| &.pause { | |
| display: none; | |
| } | |
| } | |
| } | |
| &__next { | |
| cursor: pointer; | |
| height: 80px; | |
| width: 80px; | |
| display: flex; | |
| justify-content: center; | |
| align-items: center; | |
| border-radius: 15px; | |
| transition: all .2s ease-in-out; | |
| margin-left: -8px; | |
| &:hover { | |
| background: #D7DCE2; | |
| svg { | |
| fill: #fff; | |
| } | |
| } | |
| } | |
| &__timeline { | |
| background: #fff6fb;; | |
| height: 95px; | |
| border-radius: 15px; | |
| position: absolute; | |
| bottom: 0; | |
| left: 10px; | |
| right: 10px; | |
| transform: translateY(0); | |
| transition: all .3s ease-in-out; | |
| z-index: 1; | |
| padding-left: 160px; | |
| flex-direction: column; | |
| justify-content: center; | |
| } | |
| &__timelineBar { | |
| background: #E7E7E7; | |
| width: 95%; | |
| height: 4px; | |
| border-radius: 15px; | |
| margin-top: 13px; | |
| position: relative; | |
| } | |
| #playhead { | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| border-radius: 15px; | |
| width: 0; | |
| height: 100%; | |
| background: #fd6d94; | |
| } | |
| &__author { | |
| line-height: 1; | |
| font-weight: bold; | |
| margin-bottom: 6px; | |
| margin-top: 15px; | |
| } | |
| &__song { | |
| line-height: 1; | |
| margin: 0; | |
| font-size: 12px; | |
| color: #949494; | |
| } | |
| } |
| <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" /> |