// Record player inspiration by Kofe: https://dribbble.com/shots/2613678-Music-Player
// Playlist: https://soundcloud.com/ryanjohndee/sets/small-multiples
main
  .player
    .record
      .label
        h2 ryan johndee
        h3 small multiples
      .spindle
    .arm-container
      .knob.weight.bottom
      .arm
      .knob.weight.top
        button.play
          .tooltip click on this
    .speaker
      each hole in new Array(8)
        .hole
    .knob.volume.bottom 
      .down
      .up
    .knob.volume.top
footer
 a(href="https://dribbble.com/shots/2613678-Music-Player") Visual inspiration
 a(href="https://soundcloud.com/ryanjohndee/sets/small-multiples") See playlist
View Compiled
@import "compass";
@import url(https://fonts.googleapis.com/css?family=Dosis:400,700);

$color-arm: #ededed;
$color-bg: #f7f7f7;
$color-knob: $color-arm;
$color-player: #f4f3f2;
$color-player-border: #aeaeae;
$color-record: #363636;
$color-record-label: #ff4e5b;
$color-record-label-text: darken($color-record-label, 40%);
$color-speaker: #262626;
$color-spindle: #ededed;

@mixin pos($position: absolute) {
  position: $position;
  top: 0; right: 0; bottom: 0; left: 0;
  margin: auto;
}

@mixin circle {
  &:after {
    content: "";
    display: block;
    padding-bottom: 100%;
  }
}

@mixin bg-lines($c1: darken($color-record-label, 5%), $c2: $color-record-label, $px1: 1px, $px2: 3px, $deg: -45deg) {
  background: repeating-linear-gradient(
    $deg,
    $c1,
    $c1 $px1,
    $c2 $px1,
    $c2 $px2
  );
}

@mixin gradient-knob {
  background:
    linear-gradient(
      to right,
      rgba(242,242,242,1) 0%,
      rgba(254,254,254,1) 100%
    );
}

* {
  box-sizing: border-box;
}

body {
  overflow: hidden;
  background-color: $color-bg;
  padding: 0;
  margin: 0;
  font-family: "Dosis", sans-serif;
}

main {
  @include pos;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 100%;
  max-width: 950px;
}

.player {
  position: relative;
  width: 60%;
  background-color: $color-player;
  @include bg-lines(darken($color-player, 5%), $color-player, 1px, 10%, 90deg);
  border: 1px solid $color-player-border;
  border-radius: 25%;
  box-shadow: 
    inset rgba(white, 1) 0 0 2px 1px,
    inset rgba(black, 0.06) 0 0 48px,
    rgba(black, 0.2) 0 15px 30px -10px;
  @include circle;
  &:before {
    content: "";
    @include pos;
    width: 100%;
    height: 100%;
    @include bg-lines(darken($color-player, 2%), transparent, 1px, 4px, -45deg);
    border-radius: 25%;
  }
}

.record {
  @include pos;
  width: 70%;
  height: 70%;
  background-color: $color-record;
  background: 
      linear-gradient(
        to right,
        rgba(54,54,54,1) 0%,
        rgba(102,102,102,1) 40%,
        rgba(97,97,97,1) 60%,
        rgba(31,30,31,1) 100%
      );
  border-radius: 100%;
  box-shadow: 
    inset darken($color-record, 20%) 0 0 0 1px,
    inset rgba(white, 0.3) 0 0 0 2px;
  transform: rotate(0) translateZ(0);
  &:before, &:after {
    content: "";
    @include pos;
    background: 
      linear-gradient(
        to right,
        rgba(54,54,54,1) 0%,
        rgba(102,102,102,1) 41%,
        rgba(97,97,97,1) 61%,
        rgba(31,30,31,1) 100%
      );
    border-radius: 100%;
  }
  &:before {
    width: 88%;
    height: 88%;
    background-color: lighten($color-record, 10%);
    box-shadow: 
      inset darken($color-record, 10%) 0 0 0 1px,
      inset rgba(white, 0.4) 0 0 0 2px,
      inset darken($color-record, 5%) 0 0 0 3px;
  }
  &:after {
    width: 48%;
    height: 48%;
    background-color: $color-record;
    box-shadow: 
      inset rgba(black, 0.2) 0 0 0 1px,
      rgba(black, 0.1) 0 0 2px 3px;
    transform: rotate(5deg);
  }
}

.record .label {
  @include pos;
  width: 36%;
  height: 36%;
  padding: 4.5% 6%;
  background-color: $color-record-label;
  @include bg-lines;
  text-align: center;
  border-radius: 100%;
  z-index: 2;
  &:before, &:after {
    content: "";
    @include pos;
    border-radius: 100%;
    z-index: -1;
  }
  &:before {
    width: 35%;
    height: 35%;
    background-color: darken($color-record-label, 6%);
  }
  &:after {
    width: 30%;
    height: 30%;
    @include bg-lines;
  }
  h2 {
    font-weight: bold;
  }
  h2, h3 {
    color: $color-record-label-text;
    z-index: 4;
  }
  p {
    position: absolute;
    top: 50%; right: 10%; bottom: 0;
    margin: auto;
  }
}

.spindle {
  @include pos;
  width: 25%;
  height: 25%;
  background-color: black;
  border-radius: 100%;
  box-shadow: 
    rgba(black, 0.1) 0 0 12px 2px;
  transform: scale(0.2);
  z-index: 3;
  &:before {
    content: "";
    @include pos;
    width: 70%;
    height: 70%;
    background-color: $color-spindle;
    background: linear-gradient(
      left,
      rgba(226,226,226,1) 0%,
      rgba(209,209,209,1) 51%,
      rgba(219,219,219,1) 51%,
      rgba(254,254,254,1) 100%
    );
    border-radius: 100%;
    z-index: 4;
  }
}

.arm-container {
  position: absolute;
  width: 30%;
  height: 5%;
  top: 15%;
  right: 19%;
  transform-origin: 94.2%;
  transform: rotate(-120deg);
}

.arm {
  position: absolute;
  top: 0;
  right: -25%;
  width: 100%;
  height: 100%;
  background-color: $color-arm;
  @include gradient-knob;
  border: 1px solid darken($color-arm, 4%);
  border-radius: 12px;
  box-shadow:
    inset white 0 -1px 2px,
    inset rgba(black, 0.1) -2px -4px 12px,
    rgba(black, 0.06) -4px 4px 6px;
  z-index: 2;
}

.knob {
  position: absolute;
  background-color: $color-knob;
  border-radius: 100%;
  @include circle;
  transform: translateZ(0);
  z-index: 2;
  &.bottom {
    background-color: darken($color-knob, 6%);
    border: 1px solid darken($color-knob, 8%);
    border-radius: 100%;
  }
  &.top {
    @include gradient-knob;
    border: 1px solid darken($color-knob, 4%);
    box-shadow:
      inset white 0 -1px 2px,
      inset rgba(black, 0.06) -6px -6px 18px,
      rgba(black, 0.06) -4px 4px 6px,
      rgba(black, 0.15) 2px 2px 6px;
  }
}

.weight {
  &.bottom {
    top: -61%;
    right: -13.5%;
    width: 38%;
  }
  &.top {
    width: 30%;
    top: -40%;
    right: -9.5%;
    &:before {
      content: "";
      position: absolute;
      top: 35%;
      right: 245%;
      width: 25%;
      height: 25%;
      background-color: lighten($color-record-label, 5%);
      border: 1px solid darken($color-record-label, 2%);
      border-radius: 100%;
      box-shadow: inset rgba(white, 0.6) 2px 2px 4px;
      transform: translateZ(0);
      z-index: 4;
    }
  }
}

button.play {
  @include pos;
  width: 100%;
  height: 100%;
  background-color: transparent;
  border: none;
  border-radius: 100%;
  font-family: "Dosis", sans-serif;
  cursor: pointer;
  outline: none;
  transform: rotate(120deg);
}

.tooltip {
  position: absolute;
  bottom: 150%; left: 50%;
  margin-left: -60px;
  padding: 8px 20px;
  width: 120px;
  color: $color-player;
  background: $color-record;
  text-transform: uppercase;
  text-align: center;
  border-radius: 2px;
  opacity: 0;
  transform: translateY(-60%);
  z-index: 1;
  &:after {
    content: "";
    @include pos;
    top: 100%;
    width: 0;
    height: 0;
    border-style: solid;
    border-width: 10px 12px 0 12px;
    border-color: $color-record transparent transparent transparent;
  }
}

.volume {
  &.bottom {
    bottom: 13.5%;
    left: 14%;
    width: 11%;
    transform: translateZ(0);
    div {
      position: absolute;
      width: 20%;
      height: 5%;
      background-color: darken($color-knob, 10%);
      transform: translateZ(0);
      &:first-child {
        bottom: 110%;
        right: 80%;
      }
      &:last-child {
        top: 85%;
        left: 105%;
        &:after {
          content: "";
          @include pos;
          width: 100%;
          height: 100%;
          background-color: inherit;
          transform: rotate(90deg);
        }
      }
    }
  }
  &.top {
    bottom: 14.8%;
    left: 15.3%;
    width: 8.5%;
    &:before {
      content: "";
      @include pos;
      bottom: 55%;
      width: 5%;
      height: 25%;
      background-color: darken($color-knob, 10%);
      border-radius: 24px;
    }
  }
}

.speaker {
  position: absolute;
  right: 5%;
  bottom: 4%;
  width: 20%;
  @include circle;
  transform: scale(0.4);
  .hole {
    margin-right: 12%;
    margin-bottom: 12%;
    width: 13%;
    @include circle;
    float: left;
    background-color: $color-speaker;
    border-radius: 100%;
  }
}

footer {
  position: fixed;
  right: 0; bottom: 0;
  padding: 12px;
  font-size: 11px;
  a {
    display: inline-block;
    margin-right: 12px;
  }
}

// Animations
.tooltip {
  animation: tooltip .4s .5s ease-out forwards;
}

.record {
  .is-playing & {
    animation: spin-on 4s .51s linear infinite;
  }
  .is-stopped & {
    animation: spin-off 1s ease-out forwards; 
  }
}

.arm-container {
  .is-stopped & {
    animation: arm-off .51s ease-out forwards; 
  }
  .is-playing & {
    animation:
      arm-on .5s .01s ease-out forwards,
      arm-playing 3s .51s linear infinite;
  }
}

@keyframes tooltip {
  100% {
    opacity: 1;
    transform: translateY(0);
  }
}

@keyframes spin-on {
  to {
    transform: rotate(360deg) translateZ(0);
  }
}

@keyframes spin-off {
  to {
    transform: rotate(360deg) translateZ(0);
  }
}

@keyframes arm-playing {
  0% {
    transform: rotate(-45deg);
  }
  50% {
    transform: rotate(-47deg);
  }
  100% {
    transform: rotate(-45deg);
  }
}

@keyframes arm-off {
  0% {
    transform: rotate(-45deg);
  }
  100% {
    transform: rotate(-120deg);
  }
}

@keyframes arm-on {
  100% {
    transform: rotate(-45deg);
  }
}
View Compiled
var turntable = $('.player');
var tooltip = $('.tooltip');
var playBtn = $('button.play');

// Get hooked up
SC.initialize({
  client_id: 'c92343835f607734d719d94afcb679d7'
});

// Get SoundCloud playlist
SC.get('/playlists/200584993').then(function(playlist) {

  // Setup array of tracks
  var tracks = [];
  // Loop through playlist for track IDs and add to array
  playlist.tracks.forEach(function(track) {
    tracks.push(track.id);
  });

  // Randomly set a song to play on page load
  var track_id = tracks[Math.floor(Math.random()*tracks.length)];

  // Stream randomly selected song
  SC.stream('/tracks/' + track_id).then(function(player) {

    playBtn.on('click', function() {
      // Bye bye tooltip, we get it
      tooltip.remove();
      // Check classes and update
      // Play or pause track
      if(!turntable.hasClass('is-playing')) {
        turntable
          .removeClass('is-stopped')
          .addClass('is-playing');
        setTimeout(function() {
          player.play();
        }, 500);
      } else {
        turntable
          .removeClass('is-playing')
          .addClass('is-stopped');
        player.pause();
      }
      
    });

  });

});

// For flexible label text
$("h2, h3").fitText();

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. //cdnjs.cloudflare.com/ajax/libs/jquery/2.2.2/jquery.min.js
  2. //cdnjs.cloudflare.com/ajax/libs/FitText.js/1.2.0/jquery.fittext.js