Skip to content

Latest commit

 

History

History
241 lines (237 loc) · 6.32 KB

1.md

File metadata and controls

241 lines (237 loc) · 6.32 KB

播放器基础样式以歌曲数据应用

关于样式问题实在太费时间了

<template>
  <!--主要分为两大块内容:1. 全屏播放器 2, 迷你播放器-->
  <div class="player" v-show="playlist.length >0">
    <div class="normal-player" v-show="fullScreen">
      <!--背景图-->
      <div class="background">
        <img width="100%" height="100%">
      </div>
      <!--顶部信息-->
      <div class="top">
        <div class="back">
          <i class="icon-back"></i>
        </div>
        <h1 class="title">枫叶</h1>
        <h2 class="subtitle">周杰伦</h2>
      </div>
      <!--唱片转动效果-->
      <div class="middle">
        <div class="middle-l">
          <div class="cd-wrapper">
            <div class="cd">
              <img class="image">
            </div>
          </div>
        </div>
      </div>
      <!--底部操作区-->
      <div class="bottom">
        <div class="operators">
          <div class="icon i-left">
            <i class="icon-sequence"></i>
          </div>
          <div class="icon i-left">
            <i class="icon-prev"></i>
          </div>
          <div class="icon i-center">
            <i class="icon-play"></i>
          </div>
          <div class="icon i-right">
            <i class="icon-next"></i>
          </div>
          <div class="icon i-right">
            <i class="icon-not-favorite"></i>
          </div>
        </div>
      </div>
    </div>
    <div class="mini-player" v-show="!fullScreen">
      <div class="icon">
        <img width="40" height="40">
      </div>
      <div class="text">
        <h2 class="name">枫叶</h2>
        <p class="desc">周杰伦</p>
      </div>
      <div class="control"></div>
      <div class="control">
        <i class="icon-playlist"></i>
      </div>
    </div>
  </div>
</template>
<style scoped lang="stylus" rel="stylesheet/stylus">
  @import "~common/stylus/variable"
  @import "~common/stylus/mixin"

  .player {
    position: fixed;
    top: 0;
    right: 0;
    left: 0;
    bottom: 0;
    background $color-background
    .background {
      position absolute
      left 0
      top 0
      right 0
      bottom 0
      z-index: -1
      opacity: 0.6
      filter: blur(20px)
    }
    .top {
      position relative
      margin-bottom 25px
      .back {
        position absolute
        top 0
        left 6px
        .icon-back {
          display block
          padding 9px
          font-size $font-size-large-x
          color $color-theme
          transform rotate(-90deg)
        }
      }
      .title {
        width 70%
        margin 0 auto
        text-align center
        line-height 40px
        no-wrap()
        font-size $font-size-large
        color $color-text
      }
      .subtitle {
        text-align center
        line-height 20px
        font-size $font-size-medium
        color $color-text
      }
    }
    .middle {
      position absolute
      top 80px
      bottom 170px
      width 100%
      font-size 0
      white-space nowrap
      .middle-l {
        display: inline-block
        vertical-align: top
        position: relative
        width: 100%
      // padding 的百分比始终参考的是 宽度值,而这里宽度是100%
      // 而 内部的cd-wrapper 的宽度是百分之 80%,高为100%
      // 所以 middle-l 的高是 宽度的 80%,而 cd-wrapper的高为100%也就是和 middle-l的高一致
      //cd-wrapper de 宽为80%,那么就和middle-l的高度一致,正方形
        padding-top: 80%
        .cd-wrapper {
          position: absolute
          left: 10% // 左右10% + 宽80% 刚好让这个容器居中
          top: 0
          width: 80%
          height: 100%
          .cd {
            width 100%
            height 100%
            border 10px solid rgba(255, 255, 255, 0.1)
            border-radius: 50%
            box-sizing border-box // 任何内边距和边框都将在已设定的宽度和高度内进行绘制。让绘制的圆形始终在限制的高度内
            &.play {
              animation: rotate 20s linear infinite
            }
            &.pause {
              animation-play-state: paused // css3属性 动画是否暂停 或则运行
            }
            .image {
              position absolute
              left 0
              top 0
              width 100%
              height 100%
              border-radius 50%
            }
          }
        }
      }
    }
    .bottom {
      position absolute
      bottom 50px
      width 100%
      .operators {
        display flex
        align-items center // 当高度不一致的时候,能让他们垂直居中
        .icon {
          flex 1
          color $color-theme
          &.disable {
            color $color-theme-d
          }
          i {
            font-size 30px
          }
        }
        .i-left {
          text-align right
        }
        .i-center {
          text-align center
          padding 0 20px
          i {
            font-size 40px
          }
        }
        .i-right {
          text-align left
        }
        .icon-favorite {
          color: $color-sub-theme
        }
      }
    }
    .mini-player {
      position absolute
      bottom 0
      right 0
      left 0
      height 60px
      background $color-highlight-background
    }
    @keyframes rotate {
      0% {
        transform: rotate(0)
      }
      100% {
        transform: rotate(360deg)
      }
    }
  }
</style>

这里主要说下 唱片转动效果 的实现思路

<div class="middle">
        <div class="middle-l">
          <div class="cd-wrapper">
            <div class="cd">
              <img class="image">
            </div>
          </div>
        </div>
      </div>

middle: 定位容器,把这个唱片固定在什么位置显示 middle-l : 使用 padding-top: 80% (百分比总是以宽度作为参照物)制定一个高 cd-wrapper :使用 width: 80% 制定一个宽度,这里的参照物都是宽度,所以这里得到了一个宽高1:1的矩形 cd :用来做唱片的边框透明部分和唱片容器 image : 用来承载歌曲图片