├── .babelrc
├── .editorconfig
├── .gitignore
├── .postcssrc.js
├── LICENSE
├── README.md
├── build
├── build.js
├── check-versions.js
├── dev-client.js
├── dev-server.js
├── utils.js
├── vue-loader.conf.js
├── webpack.base.conf.js
├── webpack.dev.conf.js
└── webpack.prod.conf.js
├── commend-list.json
├── config
├── dev.env.js
├── index.js
└── prod.env.js
├── day.json
├── docs
├── index.html
└── static
│ ├── css
│ ├── app.9845ceab1e76983c8b6682a3131b7a46.css
│ └── app.9845ceab1e76983c8b6682a3131b7a46.css.map
│ └── js
│ ├── app.a0298a7db9857a8bd6b6.js
│ ├── app.a0298a7db9857a8bd6b6.js.map
│ ├── manifest.0d2ea0e1a8f5116b2922.js
│ ├── manifest.0d2ea0e1a8f5116b2922.js.map
│ ├── vendor.58ba86bb684e776a5554.js
│ └── vendor.58ba86bb684e776a5554.js.map
├── index.html
├── music-data.json
├── package.json
├── src
├── App.vue
├── assets
│ └── logo.png
├── components
│ ├── about.vue
│ ├── album.vue
│ ├── day.vue
│ ├── findMusic
│ │ ├── banner.vue
│ │ ├── findMusic.vue
│ │ ├── hotSinger.vue
│ │ ├── newSong.vue
│ │ ├── playList.vue
│ │ └── rank.vue
│ ├── login.vue
│ ├── musicList.vue
│ ├── play
│ │ ├── lyrics.vue
│ │ ├── play.vue
│ │ └── rotate.vue
│ ├── public
│ │ ├── footer.vue
│ │ ├── head.vue
│ │ └── sidebar.vue
│ ├── search.vue
│ ├── searchType
│ │ ├── searchAlbum.vue
│ │ ├── searchSinger.vue
│ │ ├── searchSong.vue
│ │ └── searchSongList.vue
│ ├── singer.vue
│ ├── slider.vue
│ └── songList.vue
├── main.js
├── router
│ └── index.js
├── storage.js
└── style
│ ├── album.scss
│ ├── app.scss
│ ├── banner.scss
│ ├── day.scss
│ ├── footer.scss
│ ├── head.scss
│ ├── hotSinger.scss
│ ├── index.scss
│ ├── login.scss
│ ├── lyrics.scss
│ ├── musicList.scss
│ ├── newSong.scss
│ ├── play.scss
│ ├── playList.scss
│ ├── rank.scss
│ ├── rotate.scss
│ ├── search.scss
│ ├── searchAlbum.scss
│ ├── searchSinger.scss
│ ├── searchSong.scss
│ ├── searchSongList.scss
│ ├── sidebar.scss
│ ├── singer.scss
│ ├── slider.scss
│ └── songList.scss
└── static
└── .gitkeep
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | ["env", { "modules": false }],
4 | "stage-2"
5 | ],
6 | "plugins": ["transform-runtime"],
7 | "comments": false,
8 | "env": {
9 | "test": {
10 | "presets": ["env", "stage-2"],
11 | "plugins": [ "istanbul" ]
12 | }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset = utf-8
5 | indent_style = space
6 | indent_size = 2
7 | end_of_line = lf
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules/
3 | dist/
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | NeteaseCloudMusicApi/
--------------------------------------------------------------------------------
/.postcssrc.js:
--------------------------------------------------------------------------------
1 | // https://github.com/michael-ciniawsky/postcss-load-config
2 |
3 | module.exports = {
4 | "plugins": {
5 | // to edit target browsers: use "browserlist" field in package.json
6 | "autoprefixer": {}
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 oyh
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/build/build.js:
--------------------------------------------------------------------------------
1 | require('./check-versions')()
2 |
3 | process.env.NODE_ENV = 'production'
4 |
5 | var ora = require('ora')
6 | var rm = require('rimraf')
7 | var path = require('path')
8 | var chalk = require('chalk')
9 | var webpack = require('webpack')
10 | var config = require('../config')
11 | var webpackConfig = require('./webpack.prod.conf')
12 |
13 | var spinner = ora('building for production...')
14 | spinner.start()
15 |
16 | rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
17 | if (err) throw err
18 | webpack(webpackConfig, function (err, stats) {
19 | spinner.stop()
20 | if (err) throw err
21 | process.stdout.write(stats.toString({
22 | colors: true,
23 | modules: false,
24 | children: false,
25 | chunks: false,
26 | chunkModules: false
27 | }) + '\n\n')
28 |
29 | console.log(chalk.cyan(' Build complete.\n'))
30 | console.log(chalk.yellow(
31 | ' Tip: built files are meant to be served over an HTTP server.\n' +
32 | ' Opening index.html over file:// won\'t work.\n'
33 | ))
34 | })
35 | })
36 |
--------------------------------------------------------------------------------
/build/check-versions.js:
--------------------------------------------------------------------------------
1 | var chalk = require('chalk')
2 | var semver = require('semver')
3 | var packageConfig = require('../package.json')
4 | var shell = require('shelljs')
5 | function exec (cmd) {
6 | return require('child_process').execSync(cmd).toString().trim()
7 | }
8 |
9 | var versionRequirements = [
10 | {
11 | name: 'node',
12 | currentVersion: semver.clean(process.version),
13 | versionRequirement: packageConfig.engines.node
14 | },
15 | ]
16 |
17 | if (shell.which('npm')) {
18 | versionRequirements.push({
19 | name: 'npm',
20 | currentVersion: exec('npm --version'),
21 | versionRequirement: packageConfig.engines.npm
22 | })
23 | }
24 |
25 | module.exports = function () {
26 | var warnings = []
27 | for (var i = 0; i < versionRequirements.length; i++) {
28 | var mod = versionRequirements[i]
29 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
30 | warnings.push(mod.name + ': ' +
31 | chalk.red(mod.currentVersion) + ' should be ' +
32 | chalk.green(mod.versionRequirement)
33 | )
34 | }
35 | }
36 |
37 | if (warnings.length) {
38 | console.log('')
39 | console.log(chalk.yellow('To use this template, you must update following to modules:'))
40 | console.log()
41 | for (var i = 0; i < warnings.length; i++) {
42 | var warning = warnings[i]
43 | console.log(' ' + warning)
44 | }
45 | console.log()
46 | process.exit(1)
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/build/dev-client.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | require('eventsource-polyfill')
3 | var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true')
4 |
5 | hotClient.subscribe(function (event) {
6 | if (event.action === 'reload') {
7 | window.location.reload()
8 | }
9 | })
10 |
--------------------------------------------------------------------------------
/build/dev-server.js:
--------------------------------------------------------------------------------
1 | require('./check-versions')()
2 |
3 | var config = require('../config')
4 | if (!process.env.NODE_ENV) {
5 | process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV)
6 | }
7 |
8 | var opn = require('opn')
9 | var path = require('path')
10 | var express = require('express')
11 | var webpack = require('webpack')
12 | var proxyMiddleware = require('http-proxy-middleware')
13 | var webpackConfig = require('./webpack.dev.conf')
14 | var musicData = require('../music-data.json')
15 | var commendList = require('../commend-list.json')
16 |
17 | // default port where dev server listens for incoming traffic
18 | var port = process.env.PORT || config.dev.port
19 | // automatically open browser, if not set will be false
20 | var autoOpenBrowser = !!config.dev.autoOpenBrowser
21 | // Define HTTP proxies to your custom API backend
22 | // https://github.com/chimurai/http-proxy-middleware
23 | var proxyTable = config.dev.proxyTable
24 |
25 | var app = express()
26 | var compiler = webpack(webpackConfig)
27 | var router = express.Router()
28 |
29 | app.use('', router)
30 | router.get('/music-data', (req, res) => {
31 | res.json({musicData: musicData})
32 | })
33 | router.get('/commend-list', (req, res) => {
34 | res.json({commendList: commendList})
35 | })
36 |
37 | var devMiddleware = require('webpack-dev-middleware')(compiler, {
38 | publicPath: webpackConfig.output.publicPath,
39 | quiet: true
40 | })
41 |
42 | var hotMiddleware = require('webpack-hot-middleware')(compiler, {
43 | log: () => {}
44 | })
45 | // force page reload when html-webpack-plugin template changes
46 | compiler.plugin('compilation', function (compilation) {
47 | compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
48 | hotMiddleware.publish({ action: 'reload' })
49 | cb()
50 | })
51 | })
52 |
53 | // proxy api requests
54 | Object.keys(proxyTable).forEach(function (context) {
55 | var options = proxyTable[context]
56 | if (typeof options === 'string') {
57 | options = { target: options }
58 | }
59 | app.use(proxyMiddleware(options.filter || context, options))
60 | })
61 |
62 | // handle fallback for HTML5 history API
63 | app.use(require('connect-history-api-fallback')())
64 |
65 | // serve webpack bundle output
66 | app.use(devMiddleware)
67 |
68 | // enable hot-reload and state-preserving
69 | // compilation error display
70 | app.use(hotMiddleware)
71 |
72 | // serve pure static assets
73 | var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
74 | app.use(staticPath, express.static('./static'))
75 |
76 | var uri = 'http://localhost:' + port
77 |
78 | var _resolve
79 | var readyPromise = new Promise(resolve => {
80 | _resolve = resolve
81 | })
82 |
83 | console.log('> Starting dev server...')
84 | devMiddleware.waitUntilValid(() => {
85 | console.log('> Listening at ' + uri + '\n')
86 | // when env is testing, don't need open it
87 | if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') {
88 | opn(uri)
89 | }
90 | _resolve()
91 | })
92 |
93 | var server = app.listen(port)
94 |
95 | module.exports = {
96 | ready: readyPromise,
97 | close: () => {
98 | server.close()
99 | }
100 | }
101 |
--------------------------------------------------------------------------------
/build/utils.js:
--------------------------------------------------------------------------------
1 | var path = require('path')
2 | var config = require('../config')
3 | var ExtractTextPlugin = require('extract-text-webpack-plugin')
4 |
5 | exports.assetsPath = function (_path) {
6 | var assetsSubDirectory = process.env.NODE_ENV === 'production'
7 | ? config.build.assetsSubDirectory
8 | : config.dev.assetsSubDirectory
9 | return path.posix.join(assetsSubDirectory, _path)
10 | }
11 |
12 | exports.cssLoaders = function (options) {
13 | options = options || {}
14 |
15 | var cssLoader = {
16 | loader: 'css-loader',
17 | options: {
18 | minimize: process.env.NODE_ENV === 'production',
19 | sourceMap: options.sourceMap
20 | }
21 | }
22 |
23 | // generate loader string to be used with extract text plugin
24 | function generateLoaders (loader, loaderOptions) {
25 | var loaders = [cssLoader]
26 | if (loader) {
27 | loaders.push({
28 | loader: loader + '-loader',
29 | options: Object.assign({}, loaderOptions, {
30 | sourceMap: options.sourceMap
31 | })
32 | })
33 | }
34 |
35 | // Extract CSS when that option is specified
36 | // (which is the case during production build)
37 | if (options.extract) {
38 | return ExtractTextPlugin.extract({
39 | use: loaders,
40 | fallback: 'vue-style-loader'
41 | })
42 | } else {
43 | return ['vue-style-loader'].concat(loaders)
44 | }
45 | }
46 |
47 | // https://vue-loader.vuejs.org/en/configurations/extract-css.html
48 | return {
49 | css: generateLoaders(),
50 | postcss: generateLoaders(),
51 | less: generateLoaders('less'),
52 | sass: generateLoaders('sass', { indentedSyntax: true }),
53 | scss: generateLoaders('sass'),
54 | stylus: generateLoaders('stylus'),
55 | styl: generateLoaders('stylus')
56 | }
57 | }
58 |
59 | // Generate loaders for standalone style files (outside of .vue)
60 | exports.styleLoaders = function (options) {
61 | var output = []
62 | var loaders = exports.cssLoaders(options)
63 | for (var extension in loaders) {
64 | var loader = loaders[extension]
65 | output.push({
66 | test: new RegExp('\\.' + extension + '$'),
67 | use: loader
68 | })
69 | }
70 | return output
71 | }
72 |
--------------------------------------------------------------------------------
/build/vue-loader.conf.js:
--------------------------------------------------------------------------------
1 | var utils = require('./utils')
2 | var config = require('../config')
3 | var isProduction = process.env.NODE_ENV === 'production'
4 |
5 | module.exports = {
6 | loaders: utils.cssLoaders({
7 | sourceMap: isProduction
8 | ? config.build.productionSourceMap
9 | : config.dev.cssSourceMap,
10 | extract: isProduction
11 | })
12 | }
13 |
--------------------------------------------------------------------------------
/build/webpack.base.conf.js:
--------------------------------------------------------------------------------
1 | var path = require('path')
2 | var utils = require('./utils')
3 | var config = require('../config')
4 | var vueLoaderConfig = require('./vue-loader.conf')
5 |
6 | function resolve (dir) {
7 | return path.join(__dirname, '..', dir)
8 | }
9 |
10 | module.exports = {
11 | entry: {
12 | app: './src/main.js'
13 | },
14 | output: {
15 | path: config.build.assetsRoot,
16 | filename: '[name].js',
17 | publicPath: process.env.NODE_ENV === 'production'
18 | ? config.build.assetsPublicPath
19 | : config.dev.assetsPublicPath
20 | },
21 | resolve: {
22 | extensions: ['.js', '.vue', '.json'],
23 | alias: {
24 | 'vue$': 'vue/dist/vue.esm.js',
25 | '@': resolve('src')
26 | }
27 | },
28 | module: {
29 | rules: [
30 | {
31 | test: /\.vue$/,
32 | loader: 'vue-loader',
33 | options: vueLoaderConfig
34 | },
35 | {
36 | test: /\.js$/,
37 | loader: 'babel-loader',
38 | include: [resolve('src'), resolve('test')]
39 | },
40 | {
41 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
42 | loader: 'url-loader',
43 | options: {
44 | limit: 10000,
45 | name: utils.assetsPath('img/[name].[hash:7].[ext]')
46 | }
47 | },
48 | {
49 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
50 | loader: 'url-loader',
51 | options: {
52 | limit: 10000,
53 | name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
54 | }
55 | }
56 | ]
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/build/webpack.dev.conf.js:
--------------------------------------------------------------------------------
1 | var utils = require('./utils')
2 | var webpack = require('webpack')
3 | var config = require('../config')
4 | var merge = require('webpack-merge')
5 | var baseWebpackConfig = require('./webpack.base.conf')
6 | var HtmlWebpackPlugin = require('html-webpack-plugin')
7 | var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
8 |
9 | // add hot-reload related code to entry chunks
10 | Object.keys(baseWebpackConfig.entry).forEach(function (name) {
11 | baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name])
12 | })
13 |
14 | module.exports = merge(baseWebpackConfig, {
15 | module: {
16 | rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })
17 | },
18 | // cheap-module-eval-source-map is faster for development
19 | devtool: '#cheap-module-eval-source-map',
20 | plugins: [
21 | new webpack.DefinePlugin({
22 | 'process.env': config.dev.env
23 | }),
24 | // https://github.com/glenjamin/webpack-hot-middleware#installation--usage
25 | new webpack.HotModuleReplacementPlugin(),
26 | new webpack.NoEmitOnErrorsPlugin(),
27 | // https://github.com/ampedandwired/html-webpack-plugin
28 | new HtmlWebpackPlugin({
29 | filename: 'index.html',
30 | template: 'index.html',
31 | inject: true
32 | }),
33 | new FriendlyErrorsPlugin()
34 | ]
35 | })
36 |
--------------------------------------------------------------------------------
/build/webpack.prod.conf.js:
--------------------------------------------------------------------------------
1 | var path = require('path')
2 | var utils = require('./utils')
3 | var webpack = require('webpack')
4 | var config = require('../config')
5 | var merge = require('webpack-merge')
6 | var baseWebpackConfig = require('./webpack.base.conf')
7 | var CopyWebpackPlugin = require('copy-webpack-plugin')
8 | var HtmlWebpackPlugin = require('html-webpack-plugin')
9 | var ExtractTextPlugin = require('extract-text-webpack-plugin')
10 | var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
11 |
12 | var env = config.build.env
13 |
14 | var webpackConfig = merge(baseWebpackConfig, {
15 | module: {
16 | rules: utils.styleLoaders({
17 | sourceMap: config.build.productionSourceMap,
18 | extract: true
19 | })
20 | },
21 | devtool: config.build.productionSourceMap ? '#source-map' : false,
22 | output: {
23 | path: config.build.assetsRoot,
24 | filename: utils.assetsPath('js/[name].[chunkhash].js'),
25 | chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
26 | },
27 | plugins: [
28 | // http://vuejs.github.io/vue-loader/en/workflow/production.html
29 | new webpack.DefinePlugin({
30 | 'process.env': env
31 | }),
32 | new webpack.optimize.UglifyJsPlugin({
33 | compress: {
34 | warnings: false
35 | },
36 | sourceMap: true
37 | }),
38 | // extract css into its own file
39 | new ExtractTextPlugin({
40 | filename: utils.assetsPath('css/[name].[contenthash].css')
41 | }),
42 | // Compress extracted CSS. We are using this plugin so that possible
43 | // duplicated CSS from different components can be deduped.
44 | new OptimizeCSSPlugin({
45 | cssProcessorOptions: {
46 | safe: true
47 | }
48 | }),
49 | // generate dist index.html with correct asset hash for caching.
50 | // you can customize output by editing /index.html
51 | // see https://github.com/ampedandwired/html-webpack-plugin
52 | new HtmlWebpackPlugin({
53 | filename: config.build.index,
54 | template: 'index.html',
55 | inject: true,
56 | minify: {
57 | removeComments: true,
58 | collapseWhitespace: true,
59 | removeAttributeQuotes: true
60 | // more options:
61 | // https://github.com/kangax/html-minifier#options-quick-reference
62 | },
63 | // necessary to consistently work with multiple chunks via CommonsChunkPlugin
64 | chunksSortMode: 'dependency'
65 | }),
66 | // split vendor js into its own file
67 | new webpack.optimize.CommonsChunkPlugin({
68 | name: 'vendor',
69 | minChunks: function (module, count) {
70 | // any required modules inside node_modules are extracted to vendor
71 | return (
72 | module.resource &&
73 | /\.js$/.test(module.resource) &&
74 | module.resource.indexOf(
75 | path.join(__dirname, '../node_modules')
76 | ) === 0
77 | )
78 | }
79 | }),
80 | // extract webpack runtime and module manifest to its own file in order to
81 | // prevent vendor hash from being updated whenever app bundle is updated
82 | new webpack.optimize.CommonsChunkPlugin({
83 | name: 'manifest',
84 | chunks: ['vendor']
85 | }),
86 | // copy custom static assets
87 | new CopyWebpackPlugin([
88 | {
89 | from: path.resolve(__dirname, '../static'),
90 | to: config.build.assetsSubDirectory,
91 | ignore: ['.*']
92 | }
93 | ])
94 | ]
95 | })
96 |
97 | if (config.build.productionGzip) {
98 | var CompressionWebpackPlugin = require('compression-webpack-plugin')
99 |
100 | webpackConfig.plugins.push(
101 | new CompressionWebpackPlugin({
102 | asset: '[path].gz[query]',
103 | algorithm: 'gzip',
104 | test: new RegExp(
105 | '\\.(' +
106 | config.build.productionGzipExtensions.join('|') +
107 | ')$'
108 | ),
109 | threshold: 10240,
110 | minRatio: 0.8
111 | })
112 | )
113 | }
114 |
115 | if (config.build.bundleAnalyzerReport) {
116 | var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
117 | webpackConfig.plugins.push(new BundleAnalyzerPlugin())
118 | }
119 |
120 | module.exports = webpackConfig
121 |
--------------------------------------------------------------------------------
/commend-list.json:
--------------------------------------------------------------------------------
1 | {
2 | "commendList": [
3 | {
4 | "id": "396560343",
5 | "name": "「钢琴史诗」这美妙与震撼足以让你彻底沦陷",
6 | "copywrite": "根据你收藏的歌单《前奏直接秒杀的纯音乐》推荐",
7 | "playcount": "4027609",
8 | "backgroundUrl": "http://p4.music.126.net/Z3fUkt-wQJkgKMIjLL-4Cg==/528865119747098.jpg"
9 | },
10 | {
11 | "id": "482653439",
12 | "name": "成长吧,双笙!",
13 | "copywrite": "根据你喜欢的单曲《故梦》推荐",
14 | "playcount": "216336",
15 | "backgroundUrl": "http://p4.music.126.net/RpF1WePchMgAcBn-WiaA3g==/18631224534329560.jpg"
16 | },
17 | {
18 | "id": "41564652",
19 | "name": "孤独症的自愈歌",
20 | "copywrite": "根据你喜欢的单曲《高尚》推荐",
21 | "playcount": "50978",
22 | "backgroundUrl": "http://p4.music.126.net/XYX1GfDeeqB6pWZinUEi2w==/109951162865187513.jpg"
23 | },
24 | {
25 | "id": "642847603",
26 | "name": "『电音』℃ 泳池派对 夏日里的极致清凉",
27 | "copywrite": "根据你喜欢的单曲《Nevada (Original Mix)》推荐",
28 | "playcount": "1065804",
29 | "backgroundUrl": "http://p4.music.126.net/hfERTD70EViOyEa0J-rgHQ==/18673005976966035.jpg"
30 | },
31 | {
32 | "id": "703464130",
33 | "name": "我们一起离开吧,远离尘埃。",
34 | "copywrite": "编辑推荐:我不想拯救世界,我也拯救不了世界",
35 | "playcount": "539929",
36 | "backgroundUrl": "http://p3.music.126.net/NDs0aPsYLreaJUqNdqXdGA==/109951162910093162.jpg?param=200y200"
37 | },
38 | {
39 | "id": "711845605",
40 | "name": "华语丨同名异曲,耳目一新的听觉之旅",
41 | "copywrite": "编辑推荐:异曲同名,别有一番滋味",
42 | "playcount": "535826",
43 | "backgroundUrl": "http://p1.music.126.net/gdHyecgFUV27nJ-_gxvfrg==/19097417462968474.jpg"
44 | },
45 | {
46 | "id": "460217828",
47 | "name": "「中国女说唱」暗香里袭人的刺",
48 | "copywrite": "根据你喜欢的单曲《模棱两可》推荐",
49 | "playcount": "802081",
50 | "backgroundUrl": "http://p1.music.126.net/V0BH4wkKQdIvVNVxhBitdw==/109951162792729779.jpg"
51 | },
52 | {
53 | "id": "450285333",
54 | "name": "【十二月 花之物语】一花一世界 一曲一离殇",
55 | "copywrite": "根据你喜欢的单曲《方圆寸地儿》推荐",
56 | "playcount": "600220",
57 | "backgroundUrl": "http://p1.music.126.net/cnuXyZD8wuYo2-2vfR1Kzg==/18670806951436203.jpg"
58 | },
59 | {
60 | "id": "563656963",
61 | "name": "中国风丨昆山玉碎凤凰叫(流行乐)",
62 | "copywrite": "根据你喜欢的单曲《等》推荐",
63 | "playcount": "1019893",
64 | "backgroundUrl": "http://p1.music.126.net/foHgEcnNVGgqgVYZGwDAKw==/18686200115755007.jpg"
65 | }
66 | ]
67 | }
--------------------------------------------------------------------------------
/config/dev.env.js:
--------------------------------------------------------------------------------
1 | var merge = require('webpack-merge')
2 | var prodEnv = require('./prod.env')
3 |
4 | module.exports = merge(prodEnv, {
5 | NODE_ENV: '"development"'
6 | })
7 |
--------------------------------------------------------------------------------
/config/index.js:
--------------------------------------------------------------------------------
1 | // see http://vuejs-templates.github.io/webpack for documentation.
2 | var path = require('path')
3 |
4 | module.exports = {
5 | build: {
6 | env: require('./prod.env'),
7 | index: path.resolve(__dirname, '../dist/index.html'),
8 | assetsRoot: path.resolve(__dirname, '../dist'),
9 | assetsSubDirectory: 'static',
10 | assetsPublicPath: './',
11 | productionSourceMap: true,
12 | // Gzip off by default as many popular static hosts such as
13 | // Surge or Netlify already gzip all static assets for you.
14 | // Before setting to `true`, make sure to:
15 | // npm install --save-dev compression-webpack-plugin
16 | productionGzip: false,
17 | productionGzipExtensions: ['js', 'css'],
18 | // Run the build command with an extra argument to
19 | // View the bundle analyzer report after build finishes:
20 | // `npm run build --report`
21 | // Set to `true` or `false` to always turn it on or off
22 | bundleAnalyzerReport: process.env.npm_config_report
23 | },
24 | dev: {
25 | env: require('./dev.env'),
26 | port: 8080,
27 | autoOpenBrowser: true,
28 | assetsSubDirectory: 'static',
29 | assetsPublicPath: '/',
30 | proxyTable: {},
31 | // CSS Sourcemaps off by default because relative paths are "buggy"
32 | // with this option, according to the CSS-Loader README
33 | // (https://github.com/webpack/css-loader#sourcemaps)
34 | // In our experience, they generally work as expected,
35 | // just be aware of this issue when enabling this option.
36 | cssSourceMap: false
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/config/prod.env.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | NODE_ENV: '"production"'
3 | }
4 |
--------------------------------------------------------------------------------
/day.json:
--------------------------------------------------------------------------------
1 | {
2 | "musicData": [
3 | {
4 | "name": "庆祝",
5 | "id": "468513150",
6 | "singer": "陈粒",
7 | "singerId": "1007170",
8 | "duration": "199178",
9 | "albumName": "庆祝",
10 | "albumId": "35313290"
11 | },
12 | {
13 | "name": "明天何其多",
14 | "id": "471411214",
15 | "singer": "陈奕迅",
16 | "singerId": "2116",
17 | "duration": "255608",
18 | "albumName": "欣赏",
19 | "albumId": "35357294"
20 | },
21 | {
22 | "name": "红昭愿",
23 | "id": "460581493",
24 | "singer": "流芒菌",
25 | "singerId": "12293313",
26 | "duration": "173217",
27 | "albumName": "红昭愿",
28 | "albumId": "35189170"
29 | },
30 | {
31 | "name": "脑海浮游的你(原曲:大爱)",
32 | "id": "437311664",
33 | "singer": "以冬",
34 | "singerId": "12065133",
35 | "duration": "250515",
36 | "albumName": "脑海浮游的你",
37 | "albumId": "34937865"
38 | },
39 | {
40 | "name": "圆",
41 | "id": "406475388",
42 | "singer": "AGA",
43 | "singerId": "768208",
44 | "duration": "249051",
45 | "albumName": "Ginadoll",
46 | "albumId": "34561161"
47 | },
48 | {
49 | "name": "烟霞",
50 | "id": "287744",
51 | "singer": "容祖儿",
52 | "singerId": "9269",
53 | "duration": "237891",
54 | "albumName": "Give Love A Break",
55 | "albumId": "28561"
56 | },
57 | {
58 | "name": "相依为命",
59 | "id": "94639",
60 | "singer": "陈小春",
61 | "singerId": "2112",
62 | "duration": "237087",
63 | "albumName": "十年选",
64 | "albumId": "9259"
65 | },
66 | {
67 | "name": "剧本",
68 | "id": "35678880",
69 | "singer": "Fine乐团",
70 | "singerId": "1160085",
71 | "duration": "340422",
72 | "albumName": "I'm Sorry",
73 | "albumId": "3314573"
74 | },
75 | {
76 | "name": "Light It Up (Original Mix)",
77 | "id": "421423251",
78 | "singer": "Calvo",
79 | "singerId": "1146039",
80 | "duration": "173740",
81 | "albumName": "Light It Up",
82 | "albumId": "34780371"
83 | },
84 | {
85 | "name": "刚刚好",
86 | "id": "415792881",
87 | "singer": "薛之谦",
88 | "singerId": "5781",
89 | "duration": "250482",
90 | "albumName": "初学者",
91 | "albumId": "34780271"
92 | },
93 | {
94 | "name": "I Am You",
95 | "id": "2919622",
96 | "singer": "Kim Taylor",
97 | "singerId": "63943",
98 | "duration": "274495",
99 | "albumName": "I Am You",
100 | "albumId": "294835"
101 | },
102 | {
103 | "name": "身骑白马",
104 | "id": "306664",
105 | "singer": "徐佳莹",
106 | "singerId": "9940",
107 | "duration": "313417",
108 | "albumName": "LaLa首张创作专辑",
109 | "albumId": "30452"
110 | },
111 | {
112 | "name": "迷宫",
113 | "id": "4873594",
114 | "singer": "王若琳",
115 | "singerId": "9604",
116 | "duration": "218018",
117 | "albumName": "美味关系 电视原声带",
118 | "albumId": "489824"
119 | },
120 | {
121 | "name": "思念是一种病(Live) - live",
122 | "id": "394485",
123 | "singer": "张震岳",
124 | "singerId": "6453",
125 | "duration": "295000",
126 | "albumName": "Live in Taipei 出发/终点站",
127 | "albumId": "39066"
128 | },
129 | {
130 | "name": "苦瓜",
131 | "id": "64293",
132 | "singer": "陈奕迅",
133 | "singerId": "2116",
134 | "duration": "278000",
135 | "albumName": "Stranger Under My Skin",
136 | "albumId": "6355"
137 | },
138 | {
139 | "name": "没关系",
140 | "id": "426027536",
141 | "singer": "曹轩宾",
142 | "singerId": "2159",
143 | "duration": "282950",
144 | "albumName": "亲爱的,公主病 电视原声带",
145 | "albumId": "34839993"
146 | },
147 | {
148 | "name": "蓝莲花",
149 | "id": "168091",
150 | "singer": "许巍",
151 | "singerId": "5770",
152 | "duration": "270000",
153 | "albumName": "时光.漫步",
154 | "albumId": "16975"
155 | },
156 | {
157 | "name": "秀才胡同",
158 | "id": "254445",
159 | "singer": "李宇春",
160 | "singerId": "8327",
161 | "duration": "292598",
162 | "albumName": "少年中国",
163 | "albumId": "25425"
164 | },
165 | {
166 | "name": "月出",
167 | "id": "36117196",
168 | "singer": "双笙",
169 | "singerId": "12025552",
170 | "duration": "239086",
171 | "albumName": "月圆,笙起",
172 | "albumId": "3313711"
173 | },
174 | {
175 | "name": "独角戏",
176 | "id": "307525",
177 | "singer": "许茹芸",
178 | "singerId": "9943",
179 | "duration": "277293",
180 | "albumName": "如果云知道",
181 | "albumId": "30534"
182 | }
183 | ]
184 | }
--------------------------------------------------------------------------------
/docs/index.html:
--------------------------------------------------------------------------------
1 |
Vue仿写网易云音乐
--------------------------------------------------------------------------------
/docs/static/js/manifest.0d2ea0e1a8f5116b2922.js:
--------------------------------------------------------------------------------
1 | !function(e){function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var n=window.webpackJsonp;window.webpackJsonp=function(t,a,c){for(var i,u,s,f=0,l=[];f
2 |
3 |
4 |
5 | Vue仿写网易云音乐
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/music-data.json:
--------------------------------------------------------------------------------
1 | {
2 | "musicData": [
3 | {
4 | "name": "你就不要想起我(cover田馥甄)",
5 | "id": "449577226",
6 | "singer": "简弘亦",
7 | "singerId": "5001",
8 | "duration": "280971"
9 | },
10 | {
11 | "name": "故梦",
12 | "id": "409654891",
13 | "singer": "双笙",
14 | "singerId": "12025552",
15 | "duration": "284110"
16 | },
17 | {
18 | "name": "我的一个道姑朋友",
19 | "id": "437250607",
20 | "singer": "以冬",
21 | "singerId": "12065133",
22 | "duration": "313748"
23 | },
24 | {
25 | "name": "夏天的风",
26 | "id": "26494530",
27 | "singer": "刘瑞琦",
28 | "singerId": "840134",
29 | "duration": "197960"
30 | },
31 | {
32 | "name": "水星记",
33 | "id": "441491828",
34 | "singer": "郭顶",
35 | "singerId": "2843",
36 | "duration": "325266"
37 | },
38 | {
39 | "name": "推开世界的门",
40 | "id": "441120217",
41 | "singer": "杨乃文",
42 | "singerId": "10198",
43 | "duration": "282015"
44 | },
45 | {
46 | "name": "回到过去",
47 | "id": "186055",
48 | "singer": "周杰伦",
49 | "singerId": "6452",
50 | "duration": "233000"
51 | },
52 | {
53 | "name": "梦伴",
54 | "id": "26584453",
55 | "singer": "李悦君",
56 | "singerId": "8678",
57 | "duration": "247413"
58 | },
59 | {
60 | "name": "画双",
61 | "id": "410181460",
62 | "singer": "双笙",
63 | "singerId": "12025552",
64 | "duration": "287051"
65 | },
66 | {
67 | "name": "远辰落身旁",
68 | "id": "464674509",
69 | "singer": "谢春花",
70 | "singerId": "1039895",
71 | "duration": "213369"
72 | },
73 | {
74 | "name": "River Flows In You (Original Mix) - remix",
75 | "id": "5086081",
76 | "singer": "Mark Pride",
77 | "singerId": "211838",
78 | "duration": "298866"
79 | },
80 | {
81 | "name": "Something Just Like This",
82 | "id": "461347998",
83 | "singer": "The Chainsmokers",
84 | "singerId": "893484",
85 | "duration": "247626"
86 | }
87 | ]
88 | }
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vuemusic-pc",
3 | "version": "1.0.0",
4 | "description": "A vue.js music player",
5 | "author": "oyh <919917215@qq.com>",
6 | "private": true,
7 | "scripts": {
8 | "dev": "node build/dev-server.js",
9 | "start": "node build/dev-server.js",
10 | "build": "node build/build.js"
11 | },
12 | "dependencies": {
13 | "axios": "^0.16.1",
14 | "vue": "^2.2.2",
15 | "vue-axios": "^2.0.1",
16 | "vue-router": "^2.3.0",
17 | "vuex": "^2.2.1"
18 | },
19 | "devDependencies": {
20 | "autoprefixer": "^6.7.2",
21 | "babel-core": "^6.22.1",
22 | "babel-loader": "^6.2.10",
23 | "babel-plugin-transform-runtime": "^6.22.0",
24 | "babel-preset-env": "^1.2.1",
25 | "babel-preset-stage-2": "^6.22.0",
26 | "babel-register": "^6.22.0",
27 | "chalk": "^1.1.3",
28 | "connect-history-api-fallback": "^1.3.0",
29 | "copy-webpack-plugin": "^4.0.1",
30 | "css-loader": "^0.26.1",
31 | "eventsource-polyfill": "^0.9.6",
32 | "express": "^4.14.1",
33 | "extract-text-webpack-plugin": "^2.0.0",
34 | "file-loader": "^0.10.0",
35 | "friendly-errors-webpack-plugin": "^1.1.3",
36 | "html-webpack-plugin": "^2.28.0",
37 | "http-proxy-middleware": "^0.17.3",
38 | "node-sass": "^4.5.2",
39 | "opn": "^4.0.2",
40 | "optimize-css-assets-webpack-plugin": "^1.3.0",
41 | "ora": "^1.1.0",
42 | "rimraf": "^2.6.0",
43 | "sass-loader": "^6.0.3",
44 | "semver": "^5.3.0",
45 | "shelljs": "^0.7.6",
46 | "url-loader": "^0.5.8",
47 | "vue-loader": "^11.1.4",
48 | "vue-style-loader": "^2.0.0",
49 | "vue-template-compiler": "^2.2.4",
50 | "webpack": "^2.2.1",
51 | "webpack-bundle-analyzer": "^2.2.1",
52 | "webpack-dev-middleware": "^1.10.0",
53 | "webpack-hot-middleware": "^2.16.1",
54 | "webpack-merge": "^2.6.1"
55 | },
56 | "engines": {
57 | "node": ">= 4.0.0",
58 | "npm": ">= 3.0.0"
59 | },
60 | "browserslist": [
61 | "> 1%",
62 | "last 2 versions",
63 | "not ie <= 8"
64 | ]
65 | }
66 |
--------------------------------------------------------------------------------
/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
42 |
43 |
46 |
--------------------------------------------------------------------------------
/src/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reusser/VueMusic-PC/bdad1226829f042270383b86d289ac864bc9644f/src/assets/logo.png
--------------------------------------------------------------------------------
/src/components/album.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
![]()
6 |
7 |
8 |
专辑{{albumName}}
9 |
歌手:{{singer}}
10 |
时间:{{time && formatDate(time)}}
11 |
12 |
13 |
14 | 歌曲列表
15 |
16 |
17 |
18 |
19 |
20 |
91 |
92 |
--------------------------------------------------------------------------------
/src/components/day.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | {{week}}
7 | {{days}}
8 |
9 |
10 |
11 |
12 | 每日歌曲推荐
13 |
14 |
根据你的音乐口味生成,每天6:00更新
15 |
16 |
17 |
18 |
19 | -
20 |
21 | 操作
22 | 音乐标题
23 | 歌手
24 | 专辑
25 | 时长
26 |
27 | -
28 | {{index + 1 > 9 ? index + 1 : `0${index + 1}`}}
29 |
30 | {{item.name}}
31 | {{item.singer}}
32 | {{item.albumName}}
33 | {{formatTime(~~ item.duration)}}
34 |
35 |
36 |
37 |
38 |
42 |
43 |
44 |
45 |
46 |
90 |
91 |
--------------------------------------------------------------------------------
/src/components/findMusic/banner.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 | -
16 |
17 |
18 | -
25 |
26 |
27 | -
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
52 |
53 |
54 |
55 |
216 |
217 |
220 |
221 |
--------------------------------------------------------------------------------
/src/components/findMusic/findMusic.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | - 个性推荐
5 | - 歌单
6 | - 排行榜
7 | - 歌手
8 | - 最新音乐
9 |
10 |
22 |
23 |
推荐歌单
24 |
25 | -
26 |
30 | 根据您的音乐口味生成每日更新
31 |
32 |
33 |
34 | {{week}}
35 | {{day}}
36 |
37 |
38 | 每日歌曲推荐
39 |
40 |
41 | -
42 |
46 |
{{item.copywrite}}
47 |
48 |
49 | {{~~ commendList[index].playcount >= 100000 ? `${Math.floor(~~ commendList[index].playcount / 10000)}万` : commendList[index].playcount}}
50 |
51 |
64 |
65 | {{item.name}}
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
114 |
115 |
--------------------------------------------------------------------------------
/src/components/findMusic/hotSinger.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | - 个性推荐
5 | - 歌单
6 | - 排行榜
7 | - 歌手
8 | - 最新音乐
9 |
10 |
11 | -
12 |
13 | {{item.name}}
14 |
15 |
16 |
17 |
18 |
19 |
53 |
54 |
--------------------------------------------------------------------------------
/src/components/findMusic/newSong.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | - 个性推荐
5 | - 歌单
6 | - 排行榜
7 | - 歌手
8 | - 最新音乐
9 |
10 |
11 | -
12 | {{index + 1 > 9 ? index + 1 : `0${index + 1}`}}
13 |
14 | {{item.name}}({{item.alias}})
15 | {{item.singer}}
16 | {{item.albumName}}({{item.albumAlias}})
17 | {{formatTime(item.duration)}}
18 |
19 |
20 |
21 |
22 |
23 |
86 |
87 |
--------------------------------------------------------------------------------
/src/components/findMusic/playList.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | - 个性推荐
5 | - 歌单
6 | - 排行榜
7 | - 歌手
8 | - 最新音乐
9 |
10 |
11 |
12 | -
13 |
14 | {{formatCount(item.playCount)}}
15 |
16 |
17 |
![]()
18 |
{{item.creator}}
19 |
20 |
21 | {{item.name}}
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
70 |
71 |
--------------------------------------------------------------------------------
/src/components/findMusic/rank.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | - 个性推荐
5 | - 歌单
6 | - 排行榜
7 | - 歌手
8 | - 最新音乐
9 |
10 |
11 |
官方榜
12 |
13 | -
14 |
15 |
![]()
16 |
{{formatTime(item.updateTime)}}
17 |
18 |
19 | -
20 | {{index + 1}}
21 | -
22 | {{item.name}}({{item.alias}})
23 | {{item.singer}}
24 |
25 | - 查看全部
26 |
27 |
28 |
29 |
全球榜
30 |
39 |
40 |
41 |
45 |
46 |
47 |
48 |
49 |
157 |
158 |
--------------------------------------------------------------------------------
/src/components/login.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
8 |
9 |
10 |
手机号登录
11 |
邮箱登录
12 |
13 |
14 |
15 |
21 |
22 |
23 |
24 |
25 |
53 |
54 |
--------------------------------------------------------------------------------
/src/components/musicList.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | -
5 |
6 | 操作
7 | 音乐标题
8 | 歌手
9 | 专辑
10 | 时长
11 |
12 | -
13 | {{index + 1 > 9 ? index + 1 : `0${index + 1}`}}
14 |
15 | {{item.name}}
16 | {{item.singer}}
17 | {{albumName}}
18 | {{formatTime(~~ item.duration)}}
19 |
20 |
21 |
22 |
23 |
24 |
54 |
55 |
--------------------------------------------------------------------------------
/src/components/play/lyrics.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | {{item.txt}}
6 |
7 |
8 |
9 | 纯音乐,请您欣赏
10 |
11 |
12 |
13 |
14 |
151 |
152 |
155 |
156 |
--------------------------------------------------------------------------------
/src/components/play/rotate.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |

4 |
5 |
6 |
7 |
![]()
8 |
9 |
10 |
11 |
12 |
13 |
14 |
56 |
57 |
--------------------------------------------------------------------------------
/src/components/public/head.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |

4 |
12 |
关于我
13 |
14 |
15 |
![]()
16 |
{{user.nickname && usernameHandler(10)}}
17 |
18 |
19 |
20 |
21 |
27 |
28 |
32 |
34 |
35 |
![]()
36 |
{{user.nickname && usernameHandler(8)}}
37 |
签到
38 |
39 |
40 | -
41 |
0
42 | 动态
43 |
44 | -
45 |
0
46 | 关注
47 |
48 | -
49 |
999
50 | 粉丝
51 |
52 |
53 |
54 | - 会员中心
55 | 未订购>
56 |
57 | - 等级
58 | LV10>
59 |
60 | - 积分商城
61 | 999积分>
62 |
63 | - 个人信息设置
64 | >
65 |
66 | - 绑定社交账号
67 |
68 | >
69 |
70 | - 导入歌单
71 | >
72 |
73 |
76 | - 关于我
77 | >
78 |
79 |
80 |
81 |
83 |
84 | 主题
85 |
86 |
87 | - 酷炫黑
88 | - 官方红
89 | - 可爱粉
90 |
91 |
92 | - 天际蓝
93 | - 清新绿
94 | - 土豪金
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
199 |
200 |
--------------------------------------------------------------------------------
/src/components/public/sidebar.vue:
--------------------------------------------------------------------------------
1 |
2 |
57 |
58 |
59 |
108 |
109 |
--------------------------------------------------------------------------------
/src/components/searchType/searchAlbum.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | -
5 |
6 | {{item.albumName}} ({{item.alias}})
7 | {{item.singer}} ({{item.singerAlias}})
8 |
9 |
10 |
11 |
12 |
13 | - 1
14 | - ...
15 | - {{item}}
16 | - ...
17 | - {{Math.ceil(albumTotal / 30)}}
18 |
19 |
20 |
21 |
22 |
23 |
24 |
64 |
65 |
--------------------------------------------------------------------------------
/src/components/searchType/searchSinger.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | -
5 |
6 | {{item.singerName}}
7 | ({{item.alias}})
8 |
9 |
10 |
11 |
12 |
13 | - 1
14 | - ...
15 | - {{item}}
16 | - ...
17 | - {{Math.ceil(singerTotal / 30)}}
18 |
19 |
20 |
21 |
22 |
23 |
24 |
64 |
65 |
--------------------------------------------------------------------------------
/src/components/searchType/searchSong.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 操作
6 | 音乐标题
7 | 歌手
8 | 专辑
9 | 时长
10 |
11 |
12 | -
13 | {{(index + 1 + (nowPageIndex - 1)* 30) > 9 ? index + 1 + (nowPageIndex - 1) * 30 : `0${index + 1}`}}
14 |
15 | {{item.name}}
16 |
{{item.name}}
{{item.alias}}
17 | {{item.singer}}
18 | {{item.albumName}}
19 | {{formatTime(~~ item.duration)}}
20 |
21 |
22 |
23 |
24 |
25 | - 1
26 | - ...
27 | - {{item}}
28 | - ...
29 | - {{Math.ceil(songTotal / 30)}}
30 |
31 |
32 |
33 |
34 |
35 |
36 |
86 |
87 |
--------------------------------------------------------------------------------
/src/components/searchType/searchSongList.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | -
5 |
6 | {{item.name}}
7 | {{item.trackCount}}首
8 | by {{item.creator}}
9 |
10 |
11 |
12 |
13 |
14 | - 1
15 | - ...
16 | - {{item}}
17 | - ...
18 | - {{Math.ceil(playListTotal / 30)}}
19 |
20 |
21 |
22 |
23 |
24 |
25 |
68 |
69 |
--------------------------------------------------------------------------------
/src/components/singer.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
![]()
6 |
7 |
8 |
9 | 歌手
10 | {{singer}}
11 |
12 |
{{alias}}
13 |
单曲数: {{musicSize}}
14 |
专辑数: {{albumSize}}
15 |
MV数: {{mvSize}}
16 |
17 |
18 |
19 | 专辑
20 |
21 |
22 |
23 |
24 |

25 |
26 |
27 |
热门50首
28 |
29 | -
35 |
36 | {{index + 1 > 9 ? index + 1 : `0${index + 1}`}}
37 |
38 |
39 | {{item.name}}
40 | {{formatTime(~~ item.duration)}}
41 |
42 |
43 |
查看全部50首
44 |
45 |
46 |
47 |
48 |
![]()
49 |
{{formatDate(item.time)}}
50 |
51 |
52 |
{{item.name}}
53 |
54 | -
59 |
60 | {{index + 1 > 9 ? index + 1 : `0${index + 1}`}}
61 |
62 |
63 | {{songs.name}}
64 | {{formatTime(~~ songs.duration)}}
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
181 |
182 |
--------------------------------------------------------------------------------
/src/components/slider.vue:
--------------------------------------------------------------------------------
1 |
2 |
6 |
8 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
105 |
106 |
--------------------------------------------------------------------------------
/src/components/songList.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
![]()
6 |
7 |
8 |
9 | 歌单
10 | {{listName}}
11 |
12 |
13 |
14 | {{creator}}
15 | {{formatDate(time)}}
16 |
17 |
标签: {{tag}} /
18 |
{{item}}
19 |
20 |
21 | {{songCount}}
22 | {{formatCount(playCount)}}
23 |
24 |
25 |
26 |
27 | 歌曲列表
28 |
29 |
30 |
31 | -
32 |
33 | 操作
34 | 音乐标题
35 | 歌手
36 | 专辑
37 | 时长
38 |
39 | -
40 | {{index + 1 > 9 ? index + 1 : `0${index + 1}`}}
41 |
42 | {{item.name}}{{item.alias}}
43 | {{item.singer}}{{item.singerAlias}}
44 | {{item.albumName}}
45 | {{formatTime(~~ item.duration)}}
46 |
47 |
48 |
49 |
50 |
54 |
55 |
56 |
57 |
58 |
183 |
184 |
--------------------------------------------------------------------------------
/src/main.js:
--------------------------------------------------------------------------------
1 | // The Vue build version to load with the `import` command
2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias.
3 | import Vue from 'vue'
4 | import App from './App'
5 | import router from './router'
6 | import axios from 'axios'
7 | import VueAxios from 'vue-axios'
8 | import Vuex from 'vuex'
9 | import storage from './storage.js'
10 |
11 | Vue.config.productionTip = false
12 |
13 | Vue.use(VueAxios, axios)
14 |
15 | Vue.use(Vuex)
16 |
17 |
18 | const store = new Vuex.Store({
19 | state: {
20 | musicList: {'musicData': []},
21 | theme: 'red',
22 | isPlaying: false,
23 | nowPlayIndex: 0,
24 | showMiniAudio: true,
25 | commendList: {'commendList': []},
26 | curTimeNum: 0,
27 | showPlay: false,
28 | showAbout: false,
29 | showLogin: false,
30 | day: {'musicData': []},
31 | theme: ''
32 | },
33 | mutations: {
34 | setMusicList: (state, playload) => {
35 | state.musicList = playload
36 | storage.saveMusic(playload)
37 | },
38 | play: state => {
39 | state.isPlaying = true
40 |
41 | },
42 | pause: state => {
43 | state.isPlaying = false
44 | },
45 | clear: state => {
46 | state.musicList = {'musicData':[]}
47 | storage.saveMusic({'musicData':[]})
48 | },
49 | setPlayIndex: (state, playload) => {
50 | state.nowPlayIndex = playload
51 | },
52 | setShowMiniAudio: (state, playload) => {
53 | state.showMiniAudio = playload
54 | },
55 | setCommendList: (state, playload) => {
56 | state.commendList = playload
57 | },
58 | setCurTimeNum: (state, playload) => {
59 | state.curTimeNum = playload
60 | },
61 | setShowPlay: (state, playload) => {
62 | state.showPlay = playload
63 | },
64 | modifyMusicList: (state, playload) => {
65 | for (let i = 0, length = state.musicList.musicData.length; i < length; i++) {
66 | if (state.musicList.musicData[i].id == playload.id) {
67 | return
68 | }
69 | }
70 | state.musicList.musicData.splice(state.nowPlayIndex + 1, 0, playload)
71 | state.nowPlayIndex = state.nowPlayIndex + 1
72 | storage.saveMusic(playload)
73 | },
74 | setShowAbout: (state, playload) => {
75 | state.showAbout = playload
76 | },
77 | setShowLogin: (state, playload) => {
78 | state.showLogin = playload
79 | },
80 | setDay: (state, playload) => {
81 | state.day = playload
82 | },
83 | setTheme: (state, playload) => {
84 | state.theme = playload
85 | }
86 | },
87 | actions: {
88 | getInitData() {
89 | return new Promise((resolve, reject) => {
90 | Vue.axios.get('http://oyhfe.com:666/music-data')
91 | .then(res => {
92 | resolve(res.data.musicData)
93 | })
94 | })
95 | },
96 | getInitCommend() {
97 | return new Promise((resolve, reject) => {
98 | Vue.axios.get('http://oyhfe.com:666/commend-list')
99 | .then(res => {
100 | resolve(res.data.commendList)
101 | })
102 | })
103 | },
104 | getInitDay() {
105 | return new Promise((resolve, reject) => {
106 | Vue.axios.get('http://oyhfe.com:666/day')
107 | .then(res => {
108 | resolve(res.data.day)
109 | })
110 | })
111 | }
112 | }
113 | })
114 | /* eslint-disable no-new */
115 | new Vue({
116 | el: '#app',
117 | router,
118 | store,
119 | template: '',
120 | components: { App }
121 | })
122 | console.log("%c18届萌新求前端实习 熟悉css ES5 ES6 前端自动化构建 vue.js","background-image:-webkit-gradient( linear, left top,right top, color-stop(0, #4096EE), color-stop(0.15, #FF1A00), color-stop(0.3, #4096EE), color-stop(0.45, #FF1A00),color-stop(0.6, #4096EE), color-stop(0.75, #FF1A00),color-stop(0.9, #4096EE), color-stop(1, #FF1A00));color:transparent;-webkit-background-clip:text;font-size:10px;");
123 | console.log("%c联系方式(QQ): 919917215","background-image:-webkit-gradient( linear, left top,right top, color-stop(0, #4096EE), color-stop(0.15, #FF1A00), color-stop(0.3, #4096EE), color-stop(0.45, #FF1A00),color-stop(0.6, #4096EE), color-stop(0.75, #FF1A00),color-stop(0.9, #4096EE), color-stop(1, #FF1A00));color:transparent;-webkit-background-clip:text;font-size:10px;");
124 |
125 |
--------------------------------------------------------------------------------
/src/router/index.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import Router from 'vue-router'
3 | import findMusic from '../components/findMusic/findMusic.vue'
4 | import singer from '../components/singer.vue'
5 | import album from '../components/album.vue'
6 | import search from '../components/search.vue'
7 | import songList from '../components/songList.vue'
8 | import playList from '../components/findMusic/playList.vue'
9 | import rank from '../components/findMusic/rank.vue'
10 | import hotSinger from '../components/findMusic/hotSinger.vue'
11 | import newSong from '../components/findMusic/newSong.vue'
12 | import day from '../components/day.vue'
13 |
14 | Vue.use(Router)
15 |
16 | export default new Router({
17 | routes: [
18 | {
19 | path: '/',
20 | name: 'findMusic',
21 | component: findMusic
22 | },
23 | {
24 | path: '/singer/:id',
25 | name: 'singer',
26 | component: singer
27 | },
28 | {
29 | path: '/album/:id',
30 | name: 'album',
31 | component: album
32 | },
33 | {
34 | path: '/search/:keywords',
35 | name: 'search',
36 | component: search
37 | },
38 | {
39 | path: '/songList/:id',
40 | name: 'songList',
41 | component: songList
42 | },
43 | {
44 | path: '/playList',
45 | name: 'playList',
46 | component: playList
47 | },
48 | {
49 | path: '/rank',
50 | name: 'rank',
51 | component: rank
52 | },
53 | {
54 | path: '/hotSinger',
55 | name: 'hotSinger',
56 | component: hotSinger
57 | },
58 | {
59 | path: '/newSong',
60 | name: 'newSong',
61 | component: newSong
62 | },
63 | {
64 | path: '/day',
65 | name: 'day',
66 | component: day
67 | }
68 | ]
69 | })
70 |
--------------------------------------------------------------------------------
/src/storage.js:
--------------------------------------------------------------------------------
1 | const STORAGE_MUSIC_KEY = 'music';
2 | const STORAGE_USER_KEY = 'user'
3 |
4 | export default {
5 | getMusic(key = STORAGE_MUSIC_KEY) {
6 | return JSON.parse(window.localStorage.getItem(key));
7 | },
8 | saveMusic(items, key = STORAGE_MUSIC_KEY) {
9 | window.localStorage.setItem(key, JSON.stringify(items));
10 | },
11 | getUser(key = STORAGE_USER_KEY) {
12 | return JSON.parse(window.localStorage.getItem(key));
13 | },
14 | saveUser(items, key = STORAGE_USER_KEY) {
15 | window.localStorage.setItem(key, JSON.stringify(items));
16 | }
17 | }
--------------------------------------------------------------------------------
/src/style/album.scss:
--------------------------------------------------------------------------------
1 | .album-container {
2 | .album-container-head {
3 | display: flex;
4 | box-sizing: border-box;
5 | width: 100%;
6 | padding: 2rem 3rem;
7 | flex-flow: row nowrap;
8 | .album-logo {
9 | width: 20rem;
10 | height: 20rem;
11 | margin-right: 2rem;
12 | border: 2px solid #ced6d7;
13 | img {
14 | width: 100%;
15 | height: 100%;
16 | }
17 | }
18 | .detail {
19 | margin-left: 2rem;
20 | .tag {
21 | display: inline-block;
22 | width: 4rem;
23 | height: 2.4rem;
24 | line-height: 2.4rem;
25 | text-align: center;
26 | color: #fdf8f8;
27 | vertical-align: middle;
28 | background-color: #c62f2f;
29 | border-radius: 3px;
30 | }
31 | p {
32 | font-size: 14px;
33 | margin-bottom: 1rem;
34 | }
35 | p:first-child {
36 | margin-bottom: 4rem;
37 | }
38 | .album-name {
39 | margin-left: 1rem;
40 | font-size: 24px;
41 | font-family: "SimSun";
42 | color: #666;
43 | vertical-align: middle;
44 | }
45 | .singer,
46 | .publishtime {
47 | margin-left: 1rem;
48 | font-size: 13px;
49 | color: #6b696b;
50 | }
51 | }
52 | }
53 | .nav {
54 | box-sizing: border-box;
55 | height: 3.2rem;
56 | width: 100%;
57 | margin-top: 5rem;
58 | padding-left: 3rem;
59 | border-bottom: 2px solid #c62f2f;
60 | span {
61 | display: inline-block;
62 | width: 8rem;
63 | height: 3.2rem;
64 | line-height: 3.2rem;
65 | text-align: center;
66 | font-size: 13px;
67 | color: #fdf8f8;
68 | background-color: #c62f2f;
69 | }
70 | }
71 | }
72 | #black {
73 | .album-name {
74 | color: #c2c3c9;
75 | }
76 | .detail {
77 | p {
78 | color: #c2c3c9;
79 | }
80 | }
81 | }
--------------------------------------------------------------------------------
/src/style/app.scss:
--------------------------------------------------------------------------------
1 | html, body, div, span, h1, h2, h3, p, img, i, ul, li, label,
2 | footer, header, time, mark, audio, video {
3 | margin: 0;
4 | padding: 0;
5 | }
6 | html {
7 | height: 100%;
8 | font-size: 62.5%;
9 | }
10 | body {
11 | height: 100%;
12 | font-size: 1.4rem;
13 | overflow: hidden;
14 | }
15 | #app {
16 | height: 100%;
17 | overflow: auto;
18 | font-family: 'Avenir', Helvetica, Arial, sans-serif;
19 | .router-view {
20 | position: absolute;
21 | top: 5rem;
22 | right: 0;
23 | bottom: 4.6rem;
24 | left: 20rem;
25 | overflow-x: hidden;
26 | overflow-y: auto;
27 | background-color: #fafafa;
28 | &::-webkit-scrollbar {
29 | width: 8px;
30 | }
31 | &::-webkit-scrollbar-thumb {
32 | border-radius: 4px;
33 | background-color: #e1e1e2;
34 | &:hover {
35 | background-color: #cfcfd1;
36 | }
37 | }
38 | }
39 | }
40 | #app {
41 | #black {
42 | background-color: #16181c;
43 | }
44 | }
--------------------------------------------------------------------------------
/src/style/banner.scss:
--------------------------------------------------------------------------------
1 | .banner-container {
2 | position: relative;
3 | width: 100rem;
4 | height: 25rem;
5 | margin: 2rem auto;
6 | .img-container {
7 | position: relative;
8 | height: 90%;
9 | cursor: pointer;
10 | &:hover {
11 | .prev-btn,
12 | .post-btn {
13 | display: block;
14 | }
15 | }
16 | ul {
17 | list-style: none;
18 | img {
19 | width: 100%;
20 | height: 100%;
21 | }
22 | }
23 | li {
24 | position: absolute;
25 | left: 50%;
26 | bottom: 0;
27 | width: 50rem;
28 | height: 100%;
29 | transform: translateX(-50%);
30 | transition: all .5s;
31 | }
32 | .left {
33 | transform: translateX(-110%) scale(.9, .9) translateY(5%);
34 | z-index: 2;
35 | &:before {
36 | position: absolute;
37 | left: 0;
38 | top: 0;
39 | content: '';
40 | width: 100%;
41 | height: 100%;
42 | background: rgba(0, 0, 0, .5);
43 | }
44 | }
45 | .center {
46 | position: absolute;
47 | left: 50%;
48 | width: 50rem;
49 | height: 100%;
50 | transform: translateX(-50%) scale(1, 1);
51 | z-index: 3;
52 | }
53 | .right {
54 | transform: translateX(10%) scale(.9, .9) translateY(5%);
55 | z-index: 1;
56 | &:before {
57 | position: absolute;
58 | left: 0;
59 | top: 0;
60 | content: '';
61 | width: 100%;
62 | height: 100%;
63 | background: rgba(0, 0, 0, .5);
64 | }
65 | }
66 | .right.is-prev {
67 | z-index: 2
68 | }
69 | .left.is-prev {
70 | z-index: 1
71 | }
72 | .skip-left,
73 | .skip-center,
74 | .skip-right {
75 | transition: none;
76 | }
77 | .skip-left {
78 | transform: translateX(-80%) scale(.7, .7) translateY(5%);
79 | }
80 | .skip-center {
81 | transform: translateX(-50%) scale(.8, .8);
82 | }
83 | .skip-right {
84 | transform: translateX(-20%) scale(.7, .7) translateY(5%);
85 | }
86 | }
87 | .prev-btn,
88 | .post-btn {
89 | display: none;
90 | position: absolute;
91 | top: 50%;
92 | z-index: 999;
93 | font-size: 1.8rem;
94 | color: #7d7e80;
95 | &:hover {
96 | color: #e0e0e1;
97 | }
98 | }
99 | .prev-btn {
100 | left: 0;
101 | }
102 | .post-btn {
103 | right: 0;
104 | }
105 | .dot-list {
106 | position: absolute;
107 | bottom: 0;
108 | left: 0;
109 | width: 100%;
110 | height: 8%;
111 | display: flex;
112 | align-items: center;
113 | justify-content: center;
114 | list-style: none;
115 | .dot {
116 | width: 1.8rem;
117 | height: 3px;
118 | background-color: #c4c4c4;
119 | margin-left: .25rem;
120 | margin-right: .25rem;
121 | cursor: pointer;
122 | }
123 | .active {
124 | background-color: #c62f2f;
125 | }
126 | }
127 | }
128 | @media screen and (max-width: 1450px) {
129 | .banner-container {
130 | width: 80rem;
131 | .img-container {
132 | li {
133 | width: 40rem;
134 | height: 20rem;
135 | }
136 | .center {
137 | width: 40rem;
138 | height: 20rem;
139 | }
140 | }
141 | }
142 | }
143 | #black {
144 | .dot {
145 | background-color: #27292c;
146 | }
147 | .active {
148 | background-color: #7f8082;
149 | }
150 | }
--------------------------------------------------------------------------------
/src/style/day.scss:
--------------------------------------------------------------------------------
1 | .container-head {
2 | position: relative;
3 | display: flex;
4 | box-sizing: border-box;
5 | width: 100%;
6 | padding: 2rem 3rem;
7 | flex-flow: row nowrap;
8 | .list-logo {
9 | position: relative;
10 | width: 20rem;
11 | height: 20rem;
12 | margin-right: 2rem;
13 | text-align: center;
14 | background-color: #fff;
15 | border: 2px solid #ced6d7;
16 | div {
17 | position: absolute;
18 | top: 50%;
19 | left: 50%;
20 | transform: translateY(-50%) translateX(-50%);
21 | .week {
22 | font-size: 2rem;
23 | color: #6c6c6c;
24 | }
25 | .day {
26 | font-size: 8rem;
27 | color: #c62f2f;
28 | }
29 | }
30 | }
31 | .detail {
32 | flex-grow: 1;
33 | margin-left: 2rem;
34 | p {
35 | margin-bottom: 2rem;
36 | }
37 | .list-name {
38 | margin-left: 1rem;
39 | font-size: 24px;
40 | color: #666;
41 | vertical-align: middle;
42 | }
43 | .description {
44 | color: #666;
45 | font-size: 13px;
46 | }
47 | }
48 | }
49 | .music-list {
50 | width: 100%;
51 | margin-bottom: 5rem;
52 | li {
53 | height: 3rem;
54 | line-height: 3rem;
55 | cursor: default;
56 | &:hover {
57 | background-color: #ecedee;
58 | }
59 | }
60 | span {
61 | display: inline-block;
62 | margin-left: 1rem;
63 | font-size: 13px;
64 | }
65 | .music-list-head {
66 | box-sizing: border-box;
67 | color: #555;
68 | font-size: 13px;
69 | border-bottom: 1px solid #ced6d7;
70 | span {
71 | border-right: 1px solid #ced6d7;
72 | vertical-align: middle;
73 | }
74 | .space,
75 | .option {
76 | width: 5rem;
77 | }
78 | .space {
79 | height: 100%;
80 | }
81 | .music-title {
82 | width: 40rem;
83 | }
84 | .singer {
85 | width: 30rem;
86 | }
87 | .album-name {
88 | width: 35rem;
89 | }
90 | .duration {
91 | width: 5rem;
92 | border-right: 0;
93 | }
94 | }
95 | ul {
96 | .index,
97 | .option {
98 | width: 5rem;
99 | color: #777;
100 | vertical-align: top;
101 | }
102 | .index {
103 | text-align: right;
104 | }
105 | .music-title {
106 | width: 40rem;
107 | }
108 | .singer {
109 | width: 30rem;
110 | color: #777;
111 | cursor: pointer;
112 | }
113 | .album-name {
114 | width: 35rem;
115 | color: #777;
116 | cursor: pointer;
117 | }
118 | .duration {
119 | width: 5rem;
120 | color: #777;
121 | vertical-align: top;
122 | }
123 | .music-title,
124 | .album-name,
125 | .singer {
126 | overflow: hidden;
127 | text-overflow: ellipsis;
128 | white-space: nowrap;
129 | }
130 | .alias {
131 | color: #888;
132 | }
133 | li:nth-child(odd) {
134 | background-color: #f5f5f7;
135 | &:hover {
136 | background-color: #ecedee;
137 | }
138 | }
139 | }
140 | }
141 | .loading {
142 | position: absolute;
143 | top: 0;
144 | left: 50%;
145 | transform: translateX(-50%);
146 | margin-top: 5rem;
147 | text-align: center;
148 | > p {
149 | margin-top: 3rem;
150 | }
151 | .fa {
152 | color: #c62f2f;
153 | font-size: 30px;
154 | }
155 | }
156 | .fade-enter-active, .fade-leave-active {
157 | transition: opacity .5s
158 | }
159 | .fade-enter, .fade-leave-active {
160 | opacity: 0
161 | }
162 | @media screen and (max-width: 1450px) {
163 | .music-list {
164 | .music-list-head {
165 | .music-title {
166 | width: 30rem;
167 | }
168 | .singer {
169 | width: 20rem;
170 | }
171 | .album-name {
172 | width: 25rem;
173 | }
174 | }
175 | ul {
176 | .music-title {
177 | width: 30rem;
178 | }
179 | .singer {
180 | width: 20rem;
181 | }
182 | .album-name {
183 | width: 25rem;
184 | }
185 | .duration {
186 | width: 5rem;
187 | }
188 | }
189 | }
190 | }
191 | #black {
192 | .list-name {
193 | color: #dbdde3;
194 | }
195 | .istag {
196 | color: #dbdde3;
197 | }
198 | .toggle-btn:hover {
199 | color: #dbdde3;
200 | }
201 | li {
202 | .music-title {
203 | color: #d6d7de;
204 | }
205 | &:hover {
206 | background-color: #242629;
207 | color: #d6d7de;
208 | }
209 | }
210 | .music-list-head {
211 | .music-title {
212 | color: #777;
213 | }
214 | color: #d6d7de;
215 | background: #16181c;
216 | border-bottom: 1px solid #22252a;
217 | span {
218 | border-right: 1px solid #22252a;
219 | }
220 | }
221 | ul {
222 | .index,
223 | .option {
224 | color: #777;
225 | }
226 | .singer {
227 | color: #777;
228 | }
229 | .album-name {
230 | color: #777;
231 | }
232 | .duration {
233 | color: #777;
234 | }
235 | li:nth-child(odd) {
236 | background-color: #1b1c20;
237 | &:hover {
238 | background-color: #242629;
239 | }
240 | }
241 | }
242 | .loading {
243 | p {
244 | color: #a4a4a4;
245 | }
246 | }
247 | }
--------------------------------------------------------------------------------
/src/style/footer.scss:
--------------------------------------------------------------------------------
1 | .music-footer {
2 | position: absolute;
3 | bottom: 0;
4 | left: 0;
5 | box-sizing: border-box;
6 | width: 100%;
7 | height: 4.6rem;
8 | line-height: 4.6rem;
9 | background-color: #f6f6f8;
10 | border-top: 1px solid #e4e4e4;
11 | .footer-left {
12 | display: inline-block;
13 | > span {
14 | display: inline-block;
15 | border-radius: 50%;
16 | background-color: #e83c3c;
17 | cursor: pointer;
18 | &:hover {
19 | background-color: #d33030;
20 | }
21 | i {
22 | color: #fff;
23 | }
24 | }
25 | .back,
26 | .next {
27 | height: 3rem;
28 | width: 3rem;
29 | margin: {
30 | left: 2rem;
31 | right: 2rem;
32 | }
33 | line-height: 3rem;
34 | text-align: center;
35 | }
36 | .back {
37 | margin-left: 3rem;
38 | }
39 | .next {
40 | margin-right: 3rem;
41 | }
42 | .play-pause {
43 | height: 3.5rem;
44 | width: 3.5rem;
45 | line-height: 3.5rem;
46 | text-align: center;
47 | .fa-play {
48 | margin-left: 2px;
49 | font-size: 1.8rem;
50 | vertical-align: middle;
51 | }
52 | }
53 | }
54 | .time {
55 | font-size: 1.2rem;
56 | color: #555;
57 | }
58 | .value {
59 | margin-left: 1.8rem;
60 | color: #666;
61 | font-size: 18px;
62 | text-align: center;
63 | vertical-align: middle;
64 | cursor: pointer;
65 | &:hover {
66 | color: #444;
67 | }
68 | }
69 | .play-state {
70 | .fa {
71 | font-size: 1.8rem;
72 | color: #666;
73 | vertical-align: middle;
74 | cursor: pointer;
75 | &:hover {
76 | color: #444;
77 | }
78 | }
79 | }
80 | .list-icon {
81 | position: absolute;
82 | left: -1.7rem;
83 | top: 0;
84 | vertical-align: middle;
85 | }
86 | .fa-file-text-o {
87 | font-size: 1.8rem;
88 | vertical-align: middle;
89 | color: #686868;
90 | }
91 | .list-num {
92 | position: absolute;
93 | right: 2rem;
94 | top: 50%;
95 | transform: translateY(-50%);
96 | display: inline-block;
97 | width: 4rem;
98 | height: 2rem;
99 | margin-left: 2rem;
100 | line-height: 2rem;
101 | text-align: center;
102 | font-size: 1.2rem;
103 | color: #686868;
104 | border-top-right-radius: 10px;
105 | border-bottom-right-radius: 10px;
106 | background-color: #e1e1e2;
107 | cursor: pointer;
108 | &:hover .fa-file-text-o {
109 | color: #4f4f4f;
110 | }
111 | }
112 | .list-dialog {
113 | position: absolute;
114 | right: 0;
115 | top: 0;
116 | transform: translateY(-100%);
117 | width: 55rem;
118 | height: 60rem;
119 | background-color: #fff;
120 | border: 2px solid #cac8ca;
121 | box-shadow: 0 0 5px #aaa;
122 | overflow-y: auto;
123 | z-index: 5;
124 | &::-webkit-scrollbar {
125 | width: 8px;
126 | }
127 | &::-webkit-scrollbar-thumb {
128 | border-radius: 4px;
129 | background-color: #e1e1e2;
130 | &:hover {
131 | background-color: #cfcfd1;
132 | }
133 | }
134 | .list-head {
135 | position: relative;
136 | height: 4rem;
137 | text-align: center;
138 | line-height: 4rem;
139 | background-color: #f5f5f7;
140 | > span:first-child {
141 | display: inline-block;
142 | height: 2.5rem;
143 | width: 10rem;
144 | font-family: "SimSun";
145 | text-align: center;
146 | line-height: 2.5rem;
147 | vertical-align: middle;
148 | color: #fff;
149 | border-radius: 4px;
150 | background-color: #7c7d85;
151 | }
152 | > span:last-child {
153 | position: absolute;
154 | right: 2rem;
155 | color: #6d6d6d;
156 | cursor: pointer;
157 | }
158 | }
159 | .info {
160 | height: 2.8rem;
161 | font-size: 1.3rem;
162 | color: #7c7c7c;
163 | line-height: 2.8rem;
164 | background-color: #f9f9f9;
165 | .fa {
166 | font-size: 1.6rem;
167 | }
168 | > span:first-child {
169 | display: inline-block;
170 | box-sizing: border-box;
171 | width: 47rem;
172 | padding-left: 5rem;
173 | text-align: left;
174 | }
175 | > span:last-child {
176 | display: inline-block;
177 | width: 5rem;
178 | text-align: left;
179 | }
180 | > span:last-child:hover {
181 | cursor: pointer;
182 | color: #565656;
183 | }
184 | }
185 | ul {
186 | li {
187 | height: 2.8rem;
188 | font-size: 1.3rem;
189 | line-height: 2.8rem;
190 | background-color: #fafafa;
191 | cursor: pointer;
192 | &:hover {
193 | background-color: #ecedee;
194 | }
195 | .name,
196 | .singer {
197 | display: inline-block;
198 | width: 10rem;
199 | overflow-x: hidden;
200 | text-overflow: ellipsis;
201 | white-space: nowrap;
202 | vertical-align: top;
203 | }
204 | .name {
205 | display: inline-block;
206 | box-sizing: border-box;
207 | width: 35rem;
208 | padding-left: 5rem;
209 | text-align: left;
210 | }
211 | .singer {
212 | display: inline-block;
213 | width: 12rem;
214 | text-align: left;
215 | }
216 | .singer,
217 | .duration {
218 | color: #888;
219 | }
220 | }
221 | li:nth-child(even) {
222 | background-color: #f5f5f7;
223 | &:hover {
224 | background-color: #ecedee;
225 | }
226 | }
227 | }
228 | .no-song {
229 | margin-top: 20rem;
230 | text-align: center;
231 | line-height: normal;
232 | color: #b0b0b0;
233 | span {
234 | cursor: pointer;
235 | color: #000;
236 | text-decoration: underline;
237 | }
238 | }
239 | }
240 | }
241 | #black {
242 | background-color: #222225;
243 | border-top: 1px solid #232327;
244 | .footer-left {
245 | >span {
246 | background-color: #3c3c3f;
247 | }
248 | }
249 | .value,
250 | .fa {
251 | &:hover {
252 | color: #fff;
253 | }
254 | }
255 | .list-num {
256 | color: #cacbd2;
257 | background-color: #2c2c2f;
258 | }
259 | .list-dialog {
260 | background-color: #282a2f;
261 | border: 2px solid #282a2f;
262 | }
263 | .list-head {
264 | background-color: #282a2f;
265 | }
266 | .info {
267 | color: #7a7a7d;
268 | background-color: #2d2f33;
269 | > span:last-child:hover {
270 | color: #fff;
271 | }
272 | }
273 | li {
274 | .name{
275 | color: #d7d8df;
276 | }
277 | background-color: #2d2f33;
278 | &:hover {
279 | .name,
280 | .singer,
281 | .duration {
282 | color: #d7d8df;
283 | }
284 | background-color: #333539;
285 | }
286 | }
287 | li:nth-child(even) {
288 | background-color: #313337;
289 | &:hover{
290 | color: #d7d8df;
291 | background-color: #333539;
292 | }
293 | }
294 | .no-song {
295 | span {
296 | color: #cccdd4;
297 | }
298 | }
299 | }
--------------------------------------------------------------------------------
/src/style/hotSinger.scss:
--------------------------------------------------------------------------------
1 | .hot-singer-container {
2 | padding: {
3 | left: 3rem;
4 | right: 3rem;
5 | }
6 | .hot-singer-nav {
7 | height: 4rem;
8 | margin-bottom: 4rem;
9 | text-align: center;
10 | line-height: 4rem;
11 | border-bottom: 1px solid #e4e4e4;
12 | li {
13 | display: inline-block;
14 | height: 95%;
15 | width: 8rem;
16 | margin-left: 1rem;
17 | margin-right: 1rem;
18 | vertical-align: middle;
19 | cursor: pointer;
20 | &:hover {
21 | color: #c62f2f;
22 | }
23 | }
24 | .active {
25 | color: #c62f2f;
26 | border-bottom: 3px solid #c62f2f;
27 | }
28 | }
29 | .singers {
30 | display: flex;
31 | flex-flow: row wrap;
32 | width: 100rem;
33 | margin: 0 auto;
34 | list-style: none;
35 | li {
36 | position: relative;
37 | height: 20rem;
38 | margin: 2rem .7rem 0 .7rem;
39 | }
40 | img {
41 | display: block;
42 | width: 15rem;
43 | height: 15rem;
44 | border: 1px solid #e4e4e4;
45 | cursor: pointer;
46 | }
47 | p {
48 | height: 3rem;
49 | line-height: 3rem;
50 | font-size: 13px;
51 | color: #555;
52 | span {
53 | cursor: pointer;
54 | &:hover {
55 | color: #000;
56 | }
57 | }
58 | }
59 | }
60 | }
61 | @media screen and (max-width: 1450px) {
62 | .hot-singer-container {
63 | .singers {
64 | width: 70rem;
65 | img {
66 | width: 10rem;
67 | height: 10rem;
68 | }
69 | }
70 | }
71 | }
72 | #black {
73 | .hot-singer-nav {
74 | border-bottom: 1px solid #202226;
75 | li {
76 | color: #818284;
77 | &:hover {
78 | color: #c8c9d0;
79 | }
80 | }
81 | .active {
82 | color: #c8c9d0;
83 | border-bottom: 3px solid #5c5e61;
84 | }
85 | }
86 | img {
87 | border: 1px solid #16181c;
88 | }
89 | span {
90 | &:hover {
91 | color:#fff;
92 | }
93 | }
94 | }
--------------------------------------------------------------------------------
/src/style/index.scss:
--------------------------------------------------------------------------------
1 | .index-container {
2 | padding: {
3 | left: 3rem;
4 | right: 3rem;
5 | }
6 | &::-webkit-scrollbar {
7 | width: 8px;
8 | }
9 | &::-webkit-scrollbar-thumb {
10 | border-radius: 4px;
11 | background-color: #e1e1e2;
12 | &:hover {
13 | background-color: #cfcfd1;
14 | }
15 | }
16 | .find-music-nav {
17 | height: 4rem;
18 | text-align: center;
19 | line-height: 4rem;
20 | border-bottom: 1px solid #e4e4e4;
21 | li {
22 | display: inline-block;
23 | height: 95%;
24 | width: 8rem;
25 | margin-left: 1rem;
26 | margin-right: 1rem;
27 | vertical-align: middle;
28 | cursor: pointer;
29 | &:hover {
30 | color: #c62f2f;
31 | }
32 | }
33 | .active {
34 | color: #c62f2f;
35 | border-bottom: 3px solid #c62f2f;
36 | }
37 | }
38 | .recommend-list {
39 | > p {
40 | width: 105rem;
41 | margin: 1rem auto;
42 | padding-top: 1px;
43 | padding-bottom: 10px;
44 | font-size: 2rem;
45 | color: #474747;
46 | border-bottom: 2px solid #e4e4e4;
47 | }
48 | ul {
49 | display: flex;
50 | flex-flow: row wrap;
51 | justify-content: space-between;
52 | width: 105rem;
53 | margin: 0 auto;
54 | list-style: none;
55 | .day-commend {
56 | .content {
57 | position: relative;
58 | height: 19rem;
59 | margin-bottom: .5rem;
60 | text-align: center;
61 | background-color: #fff;
62 | border: 2px solid #e4e4e4;
63 | cursor: pointer;
64 | > div {
65 | position: absolute;
66 | top: 50%;
67 | left: 50%;
68 | transform: translateY(-50%) translateX(-50%);
69 | }
70 | }
71 | .week {
72 | font-size: 2rem;
73 | color: #6c6c6c;
74 | }
75 | .day {
76 | font-size: 8rem;
77 | color: #c62f2f;
78 | }
79 | .show-copywrite {
80 | transform: translateY(0);
81 | }
82 | }
83 | li {
84 | position: relative;
85 | width: 19rem;
86 | height: 24rem;
87 | margin-bottom: 2rem;
88 | overflow: hidden;
89 | .item-img {
90 | position: relative;
91 | height: 19rem;
92 | margin-bottom: .5rem;
93 | border: 2px solid #e4e4e4;
94 | cursor: pointer;
95 | }
96 | .copywrite {
97 | position: absolute;
98 | width: 17rem;
99 | height: 3.2rem;
100 | padding: .5rem 1rem;
101 | transform: translateY(-110%);
102 | transition: transform .2s;
103 | color: #eee;
104 | font-size: 1.2rem;
105 | background: rgba(0, 0, 0, .4);
106 | z-index: 2;
107 | cursor: pointer;
108 | > div {
109 | position: absolute;
110 | top: 50%;
111 | left: 50%;
112 | width: 17rem;
113 | transform: translateY(-50%) translateX(-50%);
114 | overflow:hidden;
115 | text-overflow:ellipsis;
116 | display:-webkit-box;
117 | -webkit-box-orient:vertical;
118 | -webkit-line-clamp:2;
119 | }
120 | }
121 | .show-copywrite {
122 | transform: translateY(0);
123 | }
124 | }
125 | .play-btn {
126 | position: absolute;
127 | right: 1rem;
128 | bottom: 1rem;
129 | width: 2.5rem;
130 | height: 2.5rem;
131 | border: 1px solid #ccc;
132 | border-radius: 50%;
133 | transform: rotateZ(-90deg);
134 | background: rgba(80, 80, 80, .5);
135 | display: none;
136 | &:hover {
137 | background: rgba(0, 0, 0, .6);
138 | }
139 | &:before {
140 | position: absolute;
141 | left: 50%;
142 | top: 50%;
143 | transform: translateY(-20%) translateX(-50%);
144 | content: '';
145 | width: 0;
146 | height: 0;
147 | border: 6px solid transparent;
148 | border-top: 6px solid #fff;
149 | }
150 | }
151 | .show-play {
152 | display: block;
153 | }
154 | .dec {
155 | font-size: 1.3rem;
156 | color: #555;
157 | span {
158 | &:hover {
159 | cursor: pointer;
160 | color: #000;
161 | }
162 | }
163 | }
164 | .listen-num {
165 | position: absolute;
166 | right: .1rem;
167 | top: 0;
168 | width: 8rem;
169 | padding: .2rem 1rem;
170 | color: #eee;
171 | font-size: 13px;
172 | text-align: right;
173 | z-index: 3;
174 | background-image: -webkit-linear-gradient(
175 | to right,
176 | rgba(255, 255, 255, .5),
177 | rgba(80, 80, 80, .5)
178 | );
179 | background-image: linear-gradient(to right,
180 | rgba(255, 255, 255, 0),
181 | rgba(100, 100, 100, .5));
182 | .fa {
183 | margin-right: .5rem;
184 | font-size: 14px;
185 | }
186 | }
187 | .hide-listen-num {
188 | display: none;
189 | }
190 | }
191 | }
192 | }
193 | @media screen and (max-width: 1450px) {
194 | .index-container {
195 | .recommend-list {
196 | >p {
197 | width: 85rem;
198 | }
199 | ul {
200 | width: 85rem;
201 | li {
202 | width: 15rem;
203 | .item-img {
204 | height: 15rem;
205 | }
206 | .copywrite {
207 | width: 13rem;
208 | >div {
209 | width: 13rem;
210 | }
211 | }
212 | }
213 | .day-commend {
214 | .content {
215 | height: 15rem;
216 | }
217 | }
218 | }
219 | }
220 | }
221 | }
222 | #black {
223 | .find-music-nav {
224 | border-bottom: 1px solid #202226;
225 | li {
226 | color: #818284;
227 | &:hover {
228 | color: #c8c9d0;
229 | }
230 | }
231 | .active {
232 | color: #c8c9d0;
233 | border-bottom: 3px solid #5c5e61;
234 | }
235 | }
236 | .recommend-list {
237 | >p {
238 | color: #cbccd3;
239 | border-bottom: 2px solid #22252a;
240 | }
241 | .item-img {
242 | border: 2px solid #161830;
243 | }
244 | }
245 | .dec {
246 | color: #dcdde4;
247 | span {
248 | &:hover {
249 | color: #dcdde4;
250 | }
251 | }
252 | }
253 | }
--------------------------------------------------------------------------------
/src/style/login.scss:
--------------------------------------------------------------------------------
1 | .login-container {
2 | position: absolute;
3 | top: 50%;
4 | left: 50%;
5 | transform: translateX(-50%) translateY(-50%);
6 | z-index: 999;
7 | .choose {
8 | width: 27rem;
9 | height: 30rem;
10 | background-color: #fff;
11 | border-radius: 3px;
12 | box-shadow: 0 0 5px #aaa;
13 | header {
14 | position: relative;
15 | height: 4rem;
16 | background-color: #c62f2f;
17 | border-top-left-radius: 3px;
18 | border-top-right-radius: 3px;
19 | span {
20 | position: absolute;
21 | right: 1rem;
22 | top: 50%;
23 | transform: translateY(-50%);
24 | color: #f1f1f1;
25 | cursor: pointer;
26 | &:hover {
27 | color: #fff;
28 | }
29 | }
30 | }
31 | .btn-box {
32 | position: relative;
33 | height: 26rem;
34 | >div {
35 | position: absolute;
36 | top: 50%;
37 | left: 50%;
38 | transform: translateX(-50%) translateY(-50%);
39 | >p {
40 | margin-top: 2rem;
41 | }
42 | }
43 | .login-btn {
44 | display: inline-block;
45 | width: 20rem;
46 | height: 3rem;
47 | text-align: center;
48 | line-height: 3rem;
49 | color: #c62f2f;
50 | border: 1px solid #c62f2f;
51 | border-radius: 20px;
52 | cursor: pointer;
53 | &:hover {
54 | background-color: #c62f2f;
55 | color: #fff;
56 | }
57 | }
58 | }
59 | }
60 | }
61 | .fade-enter-active, .fade-leave-active {
62 | transition: opacity .5s
63 | }
64 | .fade-enter, .fade-leave-active {
65 | opacity: 0
66 | }
--------------------------------------------------------------------------------
/src/style/lyrics.scss:
--------------------------------------------------------------------------------
1 | .lyrics-container {
2 | position: relative;
3 | height: 73%;
4 | margin-top: 3rem;
5 | overflow: hidden;
6 | font-size: 13px;
7 | .lyrics {
8 | transition: transform .5s;
9 | }
10 | p {
11 | margin: {
12 | top: 1.5rem;
13 | bottom: 1.5rem;
14 | }
15 | }
16 | .now {
17 | color: #ededee;
18 | }
19 | .no-lyric {
20 | position: absolute;
21 | left: 50%;
22 | top: 50%;
23 | transform: translateX(-50%) translateY(-50%);
24 | font-size: 14px;
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/style/musicList.scss:
--------------------------------------------------------------------------------
1 | .music-list {
2 | width: 100%;
3 | margin-bottom: 5rem;
4 | li {
5 | height: 3rem;
6 | line-height: 3rem;
7 | &:hover {
8 | background-color: #ecedee;
9 | }
10 | }
11 | span {
12 | display: inline-block;
13 | margin-left: 1rem;
14 | font-size: 13px;
15 | }
16 | .music-list-head {
17 | box-sizing: border-box;
18 | color: #555;
19 | font-size: 13px;
20 | border-bottom: 1px solid #ced6d7;
21 | span {
22 | border-right: 1px solid #ced6d7;
23 | vertical-align: middle;
24 | }
25 | .space,
26 | .option {
27 | width: 5rem;
28 | }
29 | .space {
30 | height: 100%;
31 | }
32 | .music-title {
33 | width: 40rem;
34 | }
35 | .singer {
36 | width: 30rem;
37 | }
38 | .album-name {
39 | width: 35rem;
40 | }
41 | .duration {
42 | width: 5rem;
43 | border-right: 0;
44 | }
45 | }
46 | ul {
47 | .index,
48 | .option {
49 | width: 5rem;
50 | color: #777;
51 | }
52 | .index {
53 | text-align: right;
54 | }
55 | .music-title {
56 | width: 40rem;
57 | }
58 | .singer {
59 | width: 30rem;
60 | color: #777;
61 | cursor: pointer;
62 | }
63 | .album-name {
64 | width: 35rem;
65 | color: #777;
66 | }
67 | .duration {
68 | width: 5rem;
69 | color: #777;
70 | }
71 | li:nth-child(odd) {
72 | background-color: #f5f5f7;
73 | &:hover {
74 | background-color: #ecedee;
75 | }
76 | }
77 | }
78 | }
79 | @media screen and (max-width: 1450px) {
80 | .music-list {
81 | .music-list-head {
82 | .music-title {
83 | width: 30rem;
84 | }
85 | .singer {
86 | width: 20rem;
87 | }
88 | .album-name {
89 | width: 25rem;
90 | }
91 | }
92 | ul {
93 | .music-title {
94 | width: 30rem;
95 | }
96 | .singer {
97 | width: 20rem;
98 | }
99 | .album-name {
100 | width: 25rem;
101 | }
102 | .duration {
103 | width: 5rem;
104 | }
105 | }
106 | }
107 | }
108 | #black {
109 | li {
110 | .music-title {
111 | color: #d6d7de;
112 | }
113 | &:hover {
114 | background-color: #242629;
115 | color: #d6d7de;
116 | }
117 | }
118 | .music-list-head {
119 | .music-title {
120 | color: #777;
121 | }
122 | color: #d6d7de;
123 | background: #16181c;
124 | border-bottom: 1px solid #22252a;
125 | span {
126 | border-right: 1px solid #22252a;
127 | }
128 | }
129 | ul {
130 | .index,
131 | .option {
132 | color: #777;
133 | }
134 | .singer {
135 | color: #777;
136 | }
137 | .album-name {
138 | color: #777;
139 | }
140 | .duration {
141 | color: #777;
142 | }
143 | li:nth-child(odd) {
144 | background-color: #1b1c20;
145 | &:hover {
146 | background-color: #242629;
147 | }
148 | }
149 | }
150 | }
--------------------------------------------------------------------------------
/src/style/newSong.scss:
--------------------------------------------------------------------------------
1 | .new-song-container {
2 | padding: {
3 | left: 3rem;
4 | right: 3rem;
5 | }
6 | .new-song-nav {
7 | height: 4rem;
8 | margin-bottom: 4rem;
9 | text-align: center;
10 | line-height: 4rem;
11 | border-bottom: 1px solid #e4e4e4;
12 | li {
13 | display: inline-block;
14 | height: 95%;
15 | width: 8rem;
16 | margin-left: 1rem;
17 | margin-right: 1rem;
18 | vertical-align: middle;
19 | cursor: pointer;
20 | &:hover {
21 | color: #c62f2f;
22 | }
23 | }
24 | .active {
25 | color: #c62f2f;
26 | border-bottom: 3px solid #c62f2f;
27 | }
28 | }
29 | .new-song {
30 | width: 100rem;
31 | margin: 4rem auto;
32 | list-style: none;
33 | border: 1px solid #e4e4e4;
34 | li {
35 | font-size: 13px;
36 | height: 6rem;
37 | line-height: 6rem;
38 | cursor: default;
39 | &:hover {
40 | background-color: #ecedee;
41 | }
42 | img {
43 | width: 4rem;
44 | height: 4rem;
45 | margin-right: .5rem;
46 | vertical-align: middle;
47 | border: 2px solid #e4e4e4;
48 | }
49 | >span {
50 | display: inline-block;
51 | overflow: hidden;
52 | text-overflow: ellipsis;
53 | white-space: nowrap;
54 | vertical-align: middle;
55 | }
56 | .alias {
57 | margin-left: .5rem;
58 | color: #888;
59 | }
60 | .index {
61 | width: 4rem;
62 | margin-left: 1rem;
63 | color: #999;
64 | }
65 | .song-name {
66 | width: 40rem;
67 | }
68 | .singer {
69 | width: 10rem;
70 | color: #555;
71 | cursor: pointer;
72 | &:hover {
73 | color: #000;
74 | }
75 | }
76 | .album {
77 | width: 30rem;
78 | color: #555;
79 | cursor: pointer;
80 | &:hover {
81 | color: #000;
82 | }
83 | }
84 | }
85 | li:nth-child(even) {
86 | background-color: #f5f5f7;
87 | &:hover {
88 | background-color: #ecedee;
89 | }
90 | }
91 | }
92 | }
93 | @media screen and (max-width: 1450px) {
94 | .new-song-container {
95 | .new-song {
96 | width: 90rem;
97 | li {
98 | .song-name {
99 | width: 30rem;
100 | }
101 | }
102 | }
103 | }
104 | }
105 | #black {
106 | .new-song-nav {
107 | border-bottom: 1px solid #202226;
108 | li {
109 | color: #818284;
110 | &:hover {
111 | color: #c8c9d0;
112 | }
113 | }
114 | .active {
115 | color: #c8c9d0;
116 | border-bottom: 3px solid #5c5e61;
117 | }
118 | }
119 | .new-song {
120 | border: 1px solid #202226;
121 | .song-name {
122 | color: #c8c9d0;
123 | }
124 | img {
125 | border-color: transparent;
126 | }
127 | li {
128 | background-color: #1b1d20;
129 | .duration {
130 | color: #555;
131 | }
132 | }
133 | li:hover {
134 | background-color: #242629;
135 | .singer,
136 | .album {
137 | color: #fff;
138 | }
139 | }
140 | li:nth-child(even) {
141 | background-color: #16181c;
142 | }
143 | }
144 | }
--------------------------------------------------------------------------------
/src/style/play.scss:
--------------------------------------------------------------------------------
1 | .play-container {
2 | position: absolute;
3 | top: 5rem;
4 | bottom: 4.6rem;
5 | width: 100%;
6 | background: #fff;
7 | z-index: 4;
8 | transform-origin: left bottom;
9 | transition: all .5s;
10 | overflow-y:auto;
11 | overflow-x: hidden;
12 | background-color: #fafafa;
13 | &::-webkit-scrollbar {
14 | width: 8px;
15 | }
16 | &::-webkit-scrollbar-thumb {
17 | border-radius: 4px;
18 | background-color: #cecece;
19 | &:hover {
20 | background-color: #aeaeae;
21 | }
22 | }
23 | }
24 | .hide {
25 | transform: scale(0, 0);
26 | }
27 | .show {
28 | transform: scale(1, 1);
29 | }
30 | .play-box{
31 | position: absolute;
32 | top: 0;
33 | left: 50%;
34 | transform: translateX(-50%);
35 | width: 80rem;
36 | padding: 0 2rem;
37 | margin: 0 auto;
38 | }
39 | .shadow {
40 | width: 120rem;
41 | height: 35rem;
42 | margin: 0 auto;
43 | transform: translateX(-5%);
44 | filter: blur(130px);
45 | }
46 | .btn-box {
47 | width: 34rem;
48 | text-align: center;
49 | button {
50 | width: 7rem;
51 | height: 3rem;
52 | margin: .5rem;
53 | color: #737374;
54 | border: 1px solid #b2b8b7;
55 | background-color: #eee;
56 | border-radius: 4px;
57 | cursor: pointer;
58 | &:hover {
59 | background-color: #f3f4f5;
60 | .fa {
61 | color: #333;
62 | }
63 | .fa-heart {
64 | color: #c62f2f;
65 | }
66 | }
67 | .fa {
68 | margin-right: 3px;
69 | }
70 | .fa-heart {
71 | color: #c62f2f;
72 | }
73 | }
74 | }
75 | .detail {
76 | position: absolute;
77 | top: 0;
78 | bottom: 0;
79 | left: 44rem;
80 | right: 0;
81 | .song-name {
82 | position: relative;
83 | padding: {
84 | top: 3rem;
85 | bottom: 1rem;
86 | }
87 | font-size: 22px;
88 | color: #292a28;
89 | span {
90 | position: absolute;
91 | right: 0;
92 | bottom: 0;
93 | width: 4rem;
94 | height: 3rem;
95 | line-height: 3rem;
96 | text-align: center;
97 | color: #555;
98 | border-radius: 3px;
99 | background: rgba(250, 250, 250, .3);
100 | cursor: pointer;
101 | &:hover {
102 | background: rgba(250, 250, 250, .6);
103 | }
104 | }
105 | }
106 | .song-detail {
107 | font-size: 12px;
108 | .album-name,
109 | .singer {
110 | color: #3f6bad;
111 | cursor: pointer;
112 | &:hover {
113 | color: #0a4aab;
114 | }
115 | }
116 | .album-name,
117 | .singer {
118 | display: inline-block;
119 | width: 10rem;
120 | overflow-x: hidden;
121 | text-overflow: ellipsis;
122 | white-space: nowrap;
123 | vertical-align: top;
124 | }
125 | }
126 | }
127 | .comment-container {
128 | position: absolute;
129 | top: 50rem;
130 | left: 50%;
131 | width: 80rem;
132 | transform: translateX(-50%);
133 | .comment-head {
134 | padding: 1rem 0;
135 | font-size: 18px;
136 | color: #444;
137 | border-bottom: 1px solid #e4e4e4;
138 | .comment-num {
139 | margin-left: 2rem;
140 | font-size: 13px;
141 | color: #ababab;
142 | }
143 | }
144 | .hot-comment-head,
145 | .new-comment-head {
146 | margin-top: 5rem;
147 | padding-bottom: 1rem;
148 | font-size: 16px;
149 | color: #949494;
150 | font-family: "SimSun";
151 | border-bottom: 1px solid #e4e4e4;
152 | }
153 | .comment-box {
154 | display: flex;
155 | flex-flow: row nowrap;
156 | padding: {
157 | top: 2rem;
158 | bottom: 2rem;
159 | }
160 | border-bottom: 1px solid #e1e1e1;
161 | .avatar {
162 | width: 4rem;
163 | height: 4rem;
164 | border-radius: 50%;
165 | > img {
166 | width: 4rem;
167 | height: 4rem;
168 | border-radius: 50%;
169 | }
170 | }
171 | .content {
172 | width: 95%;
173 | margin-left: 2rem;
174 | font-size: 12px;
175 | .user-name {
176 | color: #2481c8;
177 | }
178 | .replied {
179 | margin-top: 1rem;
180 | padding: 1rem;
181 | background-color: #f1f1f4;
182 | }
183 | .content-footer {
184 | display: flex;
185 | flex-flow: row nowrap;
186 | justify-content: space-between;
187 | margin-top: 1rem;
188 | color: #9e9e9e;
189 | div:nth-of-type(2) {
190 | span {
191 | padding: {
192 | left: 1rem;
193 | right: 1rem;
194 | }
195 | }
196 | span:nth-of-type(2) {
197 | border-left: 2px solid #d9d9d9;
198 | border-right: 2px solid #d9d9d9;
199 | }
200 | }
201 | }
202 | }
203 | }
204 | .page {
205 | margin-top: 3rem;
206 | margin-bottom: 4rem;
207 | text-align: center;
208 | ul {
209 | list-style: none;
210 | .fa {
211 | color: #646464;
212 | font-size: 14px;
213 | vertical-align: middle;
214 | }
215 | li {
216 | display: inline-block;
217 | height: 2.4rem;
218 | padding: 0 .9rem;
219 | color: #a4a4a4;
220 | line-height: 2.4rem;
221 | text-align: center;
222 | font-size: 12px;
223 | border: 1px solid transparent;
224 | cursor: pointer;
225 | &:hover {
226 | color: #646464;
227 | border: 1px solid #c3c4c7;
228 | background-color: #ecedf1;
229 | }
230 | }
231 | .pre-btn,
232 | .next-btn {
233 | border: 2px solid #e9e9e9;
234 | &:hover {
235 | border: 2px solid #e9e9e9;
236 | }
237 | }
238 | .apostrophe {
239 | cursor: default;
240 | &:hover {
241 | border: 1px solid transparent;
242 | background-color: transparent;
243 | }
244 | }
245 | .active {
246 | color: #c62f2f;
247 | text-decoration: underline;
248 | border: none;
249 | cursor: default;
250 | &:hover {
251 | color: #c62f2f;
252 | background-color: transparent;
253 | border: none;
254 | }
255 | }
256 | }
257 | }
258 | .loading {
259 | position: absolute;
260 | top: 0;
261 | left: 50%;
262 | transform: translateX(-50%);
263 | margin-top: 5rem;
264 | text-align: center;
265 | > p {
266 | margin-top: 3rem;
267 | }
268 | .fa {
269 | color: #c62f2f;
270 | font-size: 30px;
271 | }
272 | }
273 |
274 | }
275 | .fade-enter-active, .fade-leave-active {
276 | transition: opacity .5s
277 | }
278 | .fade-enter, .fade-leave-active {
279 | opacity: 0
280 | }
281 | #black {
282 | .btn-box {
283 | button {
284 | color: #616267;
285 | border: 1px solid #2c2c31;
286 | background-color: #2c2c31;
287 | .fa {
288 | color: #48494c;
289 | }
290 | &:hover {
291 | background-color: #323338;
292 | .fa {
293 | color: #aaabaf;
294 | }
295 | .fa-heart {
296 | color: #c62f2f;
297 | }
298 | }
299 | .fa-heart {
300 | color: #c62f2f;
301 | }
302 | }
303 | }
304 | .song-name {
305 | color: #cfcfd0;
306 | }
307 | .song-detail {
308 | color: #cfcfd0;
309 | }
310 | .comment-head {
311 | color: #c5c6cc;
312 | border-bottom: 1px solid #1f2227;
313 | }
314 | .hot-comment-head,
315 | .new-comment-head {
316 | border-bottom: 1px solid #1f2227;
317 | }
318 | .comment-box {
319 | color: #b2b4ba;
320 | border-bottom: 1px solid #1f2227;
321 | }
322 | .replied {
323 | background-color: #1c1e23;
324 | }
325 | .content-footer {
326 | color: #48494d;
327 | div:nth-of-type(2) {
328 | span:nth-of-type(2) {
329 | border-left: 2px solid #1f2227;
330 | border-right: 2px solid #1f2227;
331 | }
332 | }
333 | }
334 | .page {
335 | ul {
336 | .fa {
337 | color: #7a7b7d;
338 | }
339 | li {
340 | color: #a4a4a4;
341 | &:hover {
342 | color: #fff;
343 | border: 1px solid #1f2227;
344 | background-color: #282b32;
345 | }
346 | }
347 | .pre-btn,
348 | .next-btn {
349 | border: 2px solid #1f2227;
350 | &:hover {
351 | border: 2px solid #1f2227;
352 | }
353 | }
354 | .active {
355 | color: #c62f2f;
356 | &:hover {
357 | color: #c62f2f;
358 | }
359 | }
360 | }
361 | }
362 | .loading {
363 | p {
364 | color: #a4a4a4;
365 | }
366 | }
367 | }
368 |
--------------------------------------------------------------------------------
/src/style/playList.scss:
--------------------------------------------------------------------------------
1 | .playlist-container {
2 | padding: {
3 | left: 3rem;
4 | right: 3rem;
5 | }
6 | &::-webkit-scrollbar {
7 | width: 8px;
8 | }
9 | &::-webkit-scrollbar-thumb {
10 | border-radius: 4px;
11 | background-color: #e1e1e2;
12 | &:hover {
13 | background-color: #cfcfd1;
14 | }
15 | }
16 | .playlist-nav {
17 | height: 4rem;
18 | margin-bottom: 4rem;
19 | text-align: center;
20 | line-height: 4rem;
21 | border-bottom: 1px solid #e4e4e4;
22 | li {
23 | display: inline-block;
24 | height: 95%;
25 | width: 8rem;
26 | margin-left: 1rem;
27 | margin-right: 1rem;
28 | vertical-align: middle;
29 | cursor: pointer;
30 | &:hover {
31 | color: #c62f2f;
32 | }
33 | }
34 | .active {
35 | color: #c62f2f;
36 | border-bottom: 3px solid #c62f2f;
37 | }
38 | }
39 | .playlists {
40 | display: flex;
41 | flex-flow: row wrap;
42 | justify-content: space-between;
43 | width: 105rem;
44 | margin: 0 auto;
45 | list-style: none;
46 | li {
47 | position: relative;
48 | width: 19rem;
49 | height: 24rem;
50 | margin-bottom: 2rem;
51 | overflow: hidden;
52 | .detail {
53 | position: relative;
54 | }
55 | .item-img {
56 | position: relative;
57 | height: 19rem;
58 | margin-bottom: .5rem;
59 | border: 2px solid #e4e4e4;
60 | cursor: pointer;
61 | }
62 | .creator {
63 | position: absolute;
64 | bottom: 2rem;
65 | left: 1rem;
66 | width: 10rem;
67 | overflow: hidden;
68 | text-overflow: ellipsis;
69 | white-space: nowrap;
70 | color: #efefef;
71 | font-family: "SimSun";
72 | font-size: 12px;
73 | .fa {
74 | margin-right: .5rem;
75 | }
76 | }
77 | }
78 | .dec {
79 | font-size: 1.3rem;
80 | color: #555;
81 | span {
82 | &:hover {
83 | cursor: pointer;
84 | color: #000;
85 | }
86 | }
87 | }
88 | .listen-num {
89 | position: absolute;
90 | right: .1rem;
91 | top: 0;
92 | width: 8rem;
93 | padding: .2rem 1rem;
94 | color: #eee;
95 | font-size: 13px;
96 | text-align: right;
97 | z-index: 3;
98 | background-image: -webkit-linear-gradient(
99 | to right,
100 | rgba(255, 255, 255, .5),
101 | rgba(80, 80, 80, .5)
102 | );
103 | background-image: linear-gradient(to right,
104 | rgba(255, 255, 255, 0),
105 | rgba(100, 100, 100, .5));
106 | .fa {
107 | margin-right: .5rem;
108 | font-size: 14px;
109 | }
110 | }
111 | }
112 | }
113 | @media screen and (max-width: 1450px) {
114 | .playlist-container {
115 | .playlists {
116 | width: 90rem;
117 | li {
118 | width: 16rem;
119 | .item-img {
120 | height: 16rem;
121 | }
122 | }
123 | }
124 | }
125 | }
126 | #black {
127 | .playlist-nav {
128 | border-bottom: 1px solid #202226;
129 | li {
130 | color: #818284;
131 | &:hover {
132 | color: #c8c9d0;
133 | }
134 | }
135 | .active {
136 | color: #c8c9d0;
137 | border-bottom: 3px solid #5c5e61;
138 | }
139 | }
140 | .playlists {
141 | .item-img {
142 | border: 2px solid #161830;
143 | }
144 | }
145 | .dec {
146 | color: #dcdde4;
147 | span {
148 | &:hover {
149 | color: #dcdde4;
150 | }
151 | }
152 | }
153 | }
--------------------------------------------------------------------------------
/src/style/rank.scss:
--------------------------------------------------------------------------------
1 | .rank-container {
2 | padding: {
3 | left: 3rem;
4 | right: 3rem;
5 | }
6 | &::-webkit-scrollbar {
7 | width: 8px;
8 | }
9 | &::-webkit-scrollbar-thumb {
10 | border-radius: 4px;
11 | background-color: #e1e1e2;
12 | &:hover {
13 | background-color: #cfcfd1;
14 | }
15 | }
16 | .rank-nav {
17 | height: 4rem;
18 | margin-bottom: 4rem;
19 | text-align: center;
20 | line-height: 4rem;
21 | border-bottom: 1px solid #e4e4e4;
22 | li {
23 | display: inline-block;
24 | height: 95%;
25 | width: 8rem;
26 | margin-left: 1rem;
27 | margin-right: 1rem;
28 | vertical-align: middle;
29 | cursor: pointer;
30 | &:hover {
31 | color: #c62f2f;
32 | }
33 | }
34 | .active {
35 | color: #c62f2f;
36 | border-bottom: 3px solid #c62f2f;
37 | }
38 | }
39 | .content {
40 | width: 100rem;
41 | margin: 0 auto;
42 | .title {
43 | font-size: 18px;
44 | padding-bottom: 1rem;
45 | border-bottom: 2px solid #e4e4e4;
46 | }
47 | .rank {
48 | display: flex;
49 | flex-flow: row wrap;
50 | justify-content: space-between;
51 | width: 100rem;
52 | list-style: none;
53 | >li {
54 | width: 32rem;
55 | margin-top: 2rem;
56 | margin-bottom: 2rem;
57 | .item-head {
58 | position: relative;
59 | cursor: pointer;
60 | img {
61 | display: block;
62 | width: 32rem;
63 | height: 15rem;
64 | }
65 | .update-time {
66 | position: absolute;
67 | bottom: 2rem;
68 | left: 50%;
69 | transform: translateX(-50%);
70 | color: #f5f5f5;
71 | font-size: 13px;
72 | }
73 | }
74 | }
75 | ul {
76 | list-style: none;
77 | border: 1px solid #efefef;
78 | border-top: none;
79 | li {
80 | height: 3rem;
81 | line-height: 3rem;
82 | cursor: default;
83 | &:hover {
84 | background-color: #ecedee;
85 | }
86 | .index {
87 | display: inline-block;
88 | width: 6%;
89 | text-align: right;
90 | font-size: 16px;
91 | color: #555;
92 | vertical-align: middle;
93 | }
94 | .top {
95 | color: #db6868;
96 | }
97 | .signal {
98 | margin: 0 1rem;
99 | color: #888;
100 | }
101 | .song-name {
102 | display: inline-block;
103 | width: 60%;
104 | font-size: 13px;
105 | overflow: hidden;
106 | text-overflow: ellipsis;
107 | white-space: nowrap;
108 | vertical-align: middle;
109 | .alias {
110 | margin-left: .3rem;
111 | color: #888;
112 | }
113 | }
114 | .singer {
115 | display: inline-block;
116 | width: 20%;
117 | font-size: 13px;
118 | overflow: hidden;
119 | text-overflow: ellipsis;
120 | white-space: nowrap;
121 | vertical-align: middle;
122 | color: #888;
123 | cursor: pointer;
124 | &:hover {
125 | color: #333;
126 | }
127 | }
128 | }
129 | #all {
130 | height: 5rem;
131 | text-align: right;
132 | line-height: 5rem;
133 | font-size: 13px;
134 | color: #888;
135 | &:hover {
136 | background-color: #f5f5f7;
137 | }
138 | span {
139 | margin-right: 1rem;
140 | cursor: pointer;
141 | &:hover {
142 | color: #222;
143 | }
144 | }
145 | }
146 | li:nth-child(odd) {
147 | background-color: #f5f5f7;
148 | &:hover {
149 | background-color: #ecedee;
150 | }
151 | }
152 | }
153 | }
154 | .other-rank {
155 | display: flex;
156 | flex-flow: row wrap;
157 | justify-content: space-between;
158 | width: 100rem;
159 | list-style: none;
160 | li {
161 | position: relative;
162 | height: 20rem;
163 | margin-top: 2rem;
164 | }
165 | img {
166 | display: block;
167 | width: 15rem;
168 | height: 15rem;
169 | border: 1px solid #e4e4e4;
170 | cursor: pointer;
171 | }
172 | p {
173 | height: 3rem;
174 | line-height: 3rem;
175 | font-size: 13px;
176 | color: #555;
177 | span {
178 | cursor: pointer;
179 | &:hover {
180 | color: #000;
181 | }
182 | }
183 | }
184 | .listen-num {
185 | position: absolute;
186 | right: .1rem;
187 | top: 0;
188 | width: 8rem;
189 | padding: .2rem 1rem;
190 | color: #eee;
191 | font-size: 12px;
192 | text-align: right;
193 | z-index: 3;
194 | background-image: -webkit-linear-gradient(
195 | to right,
196 | rgba(255, 255, 255, .5),
197 | rgba(80, 80, 80, .5)
198 | );
199 | background-image: linear-gradient(to right,
200 | rgba(255, 255, 255, 0),
201 | rgba(100, 100, 100, .5));
202 | .fa {
203 | margin-right: .5rem;
204 | font-size: 14px;
205 | vertical-align: middle;
206 | }
207 | }
208 | }
209 | }
210 | }
211 | .loading {
212 | position: absolute;
213 | top: 0;
214 | left: 50%;
215 | transform: translateX(-50%);
216 | margin-top: 8rem;
217 | text-align: center;
218 | > p {
219 | margin-top: 3rem;
220 | }
221 | .fa {
222 | color: #c62f2f;
223 | font-size: 30px;
224 | }
225 | }
226 | .fade-enter-active, .fade-leave-active {
227 | transition: opacity .5s
228 | }
229 | .fade-enter, .fade-leave-active {
230 | opacity: 0
231 | }
232 | #black {
233 | .rank-nav {
234 | border-bottom: 1px solid #202226;
235 | li {
236 | color: #818284;
237 | &:hover {
238 | color: #c8c9d0;
239 | }
240 | }
241 | .active {
242 | color: #c8c9d0;
243 | border-bottom: 3px solid #5c5e61;
244 | }
245 | }
246 | .title {
247 | color: #c3c4ca;
248 | border-bottom: 2px solid #22252a;
249 | }
250 | .other-rank {
251 | img {
252 | border: 1px solid #22252a;
253 | }
254 | }
255 | .rank {
256 | ul {
257 | border: 1px solid #22252a;
258 | li {
259 | background-color: #16181c;
260 | &:hover {
261 | .singer {
262 | color: #fff;
263 | }
264 | background-color: #1c1e22;
265 | }
266 | }
267 | li:nth-child(odd) {
268 | background-color: #1b1d20;
269 | }
270 | .song-name {
271 | color: #c8c9d0;
272 | }
273 | #all {
274 | &:hover {
275 | background-color: #1b1d20;
276 | span {
277 | &:hover {
278 | color: #fff;
279 | }
280 | }
281 | }
282 | }
283 | }
284 | }
285 | .other-rank {
286 | .other-rank-name {
287 | span:hover {
288 | color: #fff;
289 | }
290 | }
291 | }
292 | .loading {
293 | p {
294 | color: #a4a4a4;
295 | }
296 | }
297 | }
--------------------------------------------------------------------------------
/src/style/rotate.scss:
--------------------------------------------------------------------------------
1 | .rotate-container {
2 | position: relative;
3 | width: 33rem;
4 | height: 36rem;
5 | .needle {
6 | position: absolute;
7 | top: -6rem;
8 | left: 50%;
9 | width: 10rem;
10 | transform: translateX(-30%) rotateZ(-10deg);
11 | transform-origin: left top;
12 | transition: transform .5s;
13 | z-index: 2;
14 | }
15 | .needle.pause {
16 | transform: translateX(-30%) rotateZ(-32deg);
17 | }
18 | .disk {
19 | position: relative;
20 | width: 33rem;
21 | height: 33rem;
22 | margin: 4rem auto;
23 | background: url(http://on99ebnkk.bkt.clouddn.com/disc-ip6.png);
24 | background-repeat: no-repeat;
25 | background-position: center center;
26 | background-size: cover;
27 | > div {
28 | position: absolute;
29 | left: 50%;
30 | top: 50%;
31 | transform: translateX(-50%) translateY(-50%);
32 | width: 21rem;
33 | height: 21rem;
34 | border-radius: 50%;
35 | background-color: #1f1f1f;
36 | }
37 | .song-img {
38 | position: absolute;
39 | left: 50%;
40 | top: 50%;
41 | transform: translateX(-50%) translateY(-50%);
42 | width: 20rem;
43 | height: 20rem;
44 | border-radius: 50%;
45 | }
46 | }
47 | .disk.playing {
48 | animation: rotate 40s infinite linear;
49 | animation-play-state: running;
50 | }
51 | .disk.pause {
52 | animation: rotate 40s infinite linear;
53 | animation-play-state: paused;
54 | }
55 | }
56 | @keyframes rotate {
57 | 0% {
58 | transform: rotateZ(0);
59 | }
60 | 100% {
61 | transform: rotateZ(360deg);
62 | }
63 | }
--------------------------------------------------------------------------------
/src/style/search.scss:
--------------------------------------------------------------------------------
1 | .search-container {
2 | .search-count {
3 | padding: 3rem;
4 | font-size: 13px;
5 | .keywords {
6 | color: #3f6bad;
7 | }
8 | .search-num {
9 | margin: 0 .5rem;
10 | }
11 | }
12 | .nav {
13 | height: 3.2rem;
14 | width: 100%;
15 | padding-left: 3rem;
16 | overflow: hidden;
17 | border-bottom: 2px solid #c62f2f;
18 | span {
19 | display: inline-block;
20 | width: 8rem;
21 | height: 3.2rem;
22 | margin: 0 .5rem;
23 | line-height: 3.2rem;
24 | text-align: center;
25 | font-size: 13px;
26 | background-color: #fff;
27 | border: 1px solid #ced6d7;
28 | cursor: pointer;
29 | &:hover {
30 | background-color: #ecedee;
31 | }
32 | }
33 | .active {
34 | color: #fdf8f8;
35 | background-color: #c62f2f;
36 | border: 1px solid #c62f2f;
37 | &:hover {
38 | background-color: #c62f2f;
39 | }
40 | }
41 | }
42 | .loading {
43 | position: absolute;
44 | top: 0;
45 | left: 50%;
46 | transform: translateX(-50%);
47 | margin-top: 5rem;
48 | text-align: center;
49 | > p {
50 | margin-top: 3rem;
51 | }
52 | .fa {
53 | color: #c62f2f;
54 | font-size: 30px;
55 | }
56 | }
57 | }
58 | .fade-enter-active, .fade-leave-active {
59 | transition: opacity .5s
60 | }
61 | .fade-enter, .fade-leave-active {
62 | opacity: 0
63 | }
64 | #black {
65 | .search-count {
66 | color: #dadbe2;
67 | }
68 | .nav {
69 | span {
70 | background-color: #26272b;
71 | border-color: transparent;
72 | color: #cacbd2;
73 | &:hover {
74 | background-color: #2d2f32;
75 | }
76 | }
77 | .active {
78 | color: #fdf8f8;
79 | background-color: #c62f2f;
80 | border: 1px solid #c62f2f;
81 | &:hover {
82 | background-color: #c62f2f;
83 | }
84 | }
85 | }
86 | .loading {
87 | p {
88 | color: #a4a4a4;
89 | }
90 | }
91 | }
--------------------------------------------------------------------------------
/src/style/searchAlbum.scss:
--------------------------------------------------------------------------------
1 | .search-album-container {
2 | .album-list {
3 | img {
4 | width: 4rem;
5 | height: 4rem;
6 | margin-right: 1rem;
7 | vertical-align: middle;
8 | border: 1px solid #e4e4e4;
9 | }
10 | li {
11 | height: 6rem;
12 | padding: 0 3.5rem;
13 | line-height: 6rem;
14 | font-size: 13px;
15 | cursor: pointer;
16 | .album-name {
17 | display: inline-block;
18 | width: 40rem;
19 | margin-right: 20rem;
20 | }
21 | .alias {
22 | font-size: 12px;
23 | color: #888;
24 | }
25 | .singer {
26 | display: inline-block;
27 | width: 40rem;
28 | }
29 | .singer,
30 | .album-name {
31 | text-overflow: ellipsis;
32 | white-space: nowrap;
33 | }
34 | &:hover {
35 | background-color: #ecedee;
36 | }
37 | }
38 | li:nth-child(even) {
39 | background-color: #f5f5f7;
40 | &:hover {
41 | background-color: #ecedee;
42 | }
43 | }
44 | }
45 | .page {
46 | margin-top: 3rem;
47 | margin-bottom: 4rem;
48 | text-align: center;
49 | ul {
50 | list-style: none;
51 | .fa {
52 | color: #646464;
53 | font-size: 14px;
54 | vertical-align: middle;
55 | }
56 | li {
57 | display: inline-block;
58 | height: 2.4rem;
59 | padding: 0 .9rem;
60 | color: #a4a4a4;
61 | line-height: 2.4rem;
62 | text-align: center;
63 | font-size: 12px;
64 | border: 1px solid transparent;
65 | cursor: pointer;
66 | &:hover {
67 | color: #646464;
68 | border: 1px solid #c3c4c7;
69 | background-color: #ecedf1;
70 | }
71 | }
72 | .pre-btn,
73 | .next-btn {
74 | border: 2px solid #e9e9e9;
75 | &:hover {
76 | border: 2px solid #e9e9e9;
77 | }
78 | }
79 | .apostrophe {
80 | cursor: default;
81 | &:hover {
82 | border: 1px solid transparent;
83 | background-color: transparent;
84 | }
85 | }
86 | .active {
87 | color: #c62f2f;
88 | text-decoration: underline;
89 | border: none;
90 | cursor: default;
91 | &:hover {
92 | color: #c62f2f;
93 | background-color: transparent;
94 | border: none;
95 | }
96 | }
97 | }
98 | }
99 | }
100 | @media screen and (max-width: 1450px) {
101 | .search-album-container {
102 | .album-list {
103 | li {
104 | .album-name {
105 | width: 30rem;
106 | }
107 | .singer {
108 | width: 30rem;
109 | }
110 | }
111 | }
112 | }
113 | }
114 | #black {
115 | .album-list {
116 | li {
117 | color: #c2d1dc;
118 | background: #16181c;
119 | img {
120 | border: 1px solid transparent;
121 | }
122 | .alias {
123 | font-size: 13px;
124 | color: #888;
125 | }
126 | &:hover {
127 | background-color: #242629;
128 | }
129 | }
130 | li:nth-child(even) {
131 | background-color: #1b1d20;
132 | &:hover {
133 | background-color: #242629;
134 | }
135 | }
136 | }
137 | .page {
138 | ul {
139 | .fa {
140 | color: #7a7b7d;
141 | }
142 | li {
143 | color: #a4a4a4;
144 | &:hover {
145 | color: #fff;
146 | border: 1px solid #1f2227;
147 | background-color: #282b32;
148 | }
149 | }
150 | .pre-btn,
151 | .next-btn {
152 | border: 2px solid #1f2227;
153 | &:hover {
154 | border: 2px solid #1f2227;
155 | }
156 | }
157 | .active {
158 | color: #c62f2f;
159 | &:hover {
160 | color: #c62f2f;
161 | }
162 | }
163 | }
164 | }
165 | }
--------------------------------------------------------------------------------
/src/style/searchSinger.scss:
--------------------------------------------------------------------------------
1 | .search-singer-container {
2 | .singer-list {
3 | li {
4 | height: 6rem;
5 | line-height: 6rem;
6 | padding: 0 3.5rem;
7 | cursor: pointer;
8 | img {
9 | width: 4rem;
10 | height: 4rem;
11 | margin-right: 1rem;
12 | vertical-align: middle;
13 | border: 1px solid #e4e4e4;
14 | }
15 | .singer-name {
16 | font-size: 13px;
17 | }
18 | .alias {
19 | font-size: 13px;
20 | color: #888;
21 | }
22 | &:hover {
23 | background-color: #ecedee;
24 | }
25 | }
26 | li:nth-child(even) {
27 | background-color: #f5f5f7;
28 | &:hover {
29 | background-color: #ecedee;
30 | }
31 | }
32 | }
33 | .page {
34 | margin-top: 3rem;
35 | margin-bottom: 4rem;
36 | text-align: center;
37 | ul {
38 | list-style: none;
39 | .fa {
40 | color: #646464;
41 | font-size: 14px;
42 | vertical-align: middle;
43 | }
44 | li {
45 | display: inline-block;
46 | height: 2.4rem;
47 | padding: 0 .9rem;
48 | color: #a4a4a4;
49 | line-height: 2.4rem;
50 | text-align: center;
51 | font-size: 12px;
52 | border: 1px solid transparent;
53 | cursor: pointer;
54 | &:hover {
55 | color: #646464;
56 | border: 1px solid #c3c4c7;
57 | background-color: #ecedf1;
58 | }
59 | }
60 | .pre-btn,
61 | .next-btn {
62 | border: 2px solid #e9e9e9;
63 | &:hover {
64 | border: 2px solid #e9e9e9;
65 | }
66 | }
67 | .apostrophe {
68 | cursor: default;
69 | &:hover {
70 | border: 1px solid transparent;
71 | background-color: transparent;
72 | }
73 | }
74 | .active {
75 | color: #c62f2f;
76 | text-decoration: underline;
77 | border: none;
78 | cursor: default;
79 | &:hover {
80 | color: #c62f2f;
81 | background-color: transparent;
82 | border: none;
83 | }
84 | }
85 | }
86 | }
87 | }
88 | #black {
89 | .singer-list {
90 | li {
91 | color: #c2d1dc;
92 | background: #16181c;
93 | img {
94 | border: 1px solid transparent;
95 | }
96 | .alias {
97 | font-size: 13px;
98 | color: #888;
99 | }
100 | &:hover {
101 | background-color: #242629;
102 | }
103 | }
104 | li:nth-child(even) {
105 | background-color: #1b1d20;
106 | &:hover {
107 | background-color: #242629;
108 | }
109 | }
110 | }
111 | .page {
112 | ul {
113 | .fa {
114 | color: #7a7b7d;
115 | }
116 | li {
117 | color: #a4a4a4;
118 | &:hover {
119 | color: #fff;
120 | border: 1px solid #1f2227;
121 | background-color: #282b32;
122 | }
123 | }
124 | .pre-btn,
125 | .next-btn {
126 | border: 2px solid #1f2227;
127 | &:hover {
128 | border: 2px solid #1f2227;
129 | }
130 | }
131 | .active {
132 | color: #c62f2f;
133 | &:hover {
134 | color: #c62f2f;
135 | }
136 | }
137 | }
138 | }
139 | }
--------------------------------------------------------------------------------
/src/style/searchSong.scss:
--------------------------------------------------------------------------------
1 | .search-list-head {
2 | box-sizing: border-box;
3 | height: 3rem;
4 | color: #555;
5 | font-size: 13px;
6 | line-height: 3rem;
7 | border-bottom: 1px solid #ced6d7;
8 | span {
9 | display: inline-block;
10 | margin-left: 1rem;
11 | font-size: 13px;
12 | vertical-align: middle;
13 | border-right: 1px solid #ced6d7;
14 | }
15 | .space,
16 | .option {
17 | width: 5rem;
18 | }
19 | .space {
20 | height: 100%;
21 | }
22 | .music-title {
23 | width: 40rem;
24 | }
25 | .singer {
26 | width: 30rem;
27 | }
28 | .album-name {
29 | width: 35rem;
30 | }
31 | .duration {
32 | width: 5rem;
33 | border-right: 0;
34 | }
35 | }
36 | .songs {
37 | margin-bottom: 5rem;
38 | li {
39 | line-height: 3rem;
40 | &:hover {
41 | background-color: #ecedee;
42 | }
43 | }
44 | span {
45 | display: inline-block;
46 | margin-left: 1rem;
47 | font-size: 13px;
48 | white-space: nowrap;
49 | overflow: hidden;
50 | text-overflow: ellipsis;
51 | vertical-align: middle;
52 | }
53 | .index,
54 | .option {
55 | width: 5rem;
56 | color: #777;
57 | }
58 | .index {
59 | text-align: right;
60 | }
61 | .music-title {
62 | width: 40rem;
63 | }
64 | div.music-title {
65 | display: inline-block;
66 | height: 6rem;
67 | margin-left: 1rem;
68 | font-size: 13px;
69 | vertical-align: top;
70 | }
71 | .alias {
72 | color: #888;
73 | }
74 | .singer {
75 | width: 30rem;
76 | color: #777;
77 | cursor: pointer;
78 | }
79 | .album-name {
80 | width: 35rem;
81 | color: #777;
82 | cursor: pointer;
83 | }
84 | .duration {
85 | width: 5rem;
86 | color: #777;
87 | }
88 | li:nth-child(even) {
89 | background-color: #f5f5f7;
90 | &:hover {
91 | background-color: #ecedee;
92 | }
93 | }
94 | }
95 | .page {
96 | margin-top: 3rem;
97 | margin-bottom: 4rem;
98 | text-align: center;
99 | ul {
100 | list-style: none;
101 | .fa {
102 | color: #646464;
103 | font-size: 14px;
104 | vertical-align: middle;
105 | }
106 | li {
107 | display: inline-block;
108 | height: 2.4rem;
109 | padding: 0 .9rem;
110 | color: #a4a4a4;
111 | line-height: 2.4rem;
112 | text-align: center;
113 | font-size: 12px;
114 | border: 1px solid transparent;
115 | cursor: pointer;
116 | &:hover {
117 | color: #646464;
118 | border: 1px solid #c3c4c7;
119 | background-color: #ecedf1;
120 | }
121 | }
122 | .pre-btn,
123 | .next-btn {
124 | border: 2px solid #e9e9e9;
125 | &:hover {
126 | border: 2px solid #e9e9e9;
127 | }
128 | }
129 | .apostrophe {
130 | cursor: default;
131 | &:hover {
132 | border: 1px solid transparent;
133 | background-color: transparent;
134 | }
135 | }
136 | .active {
137 | color: #c62f2f;
138 | text-decoration: underline;
139 | border: none;
140 | cursor: default;
141 | &:hover {
142 | color: #c62f2f;
143 | background-color: transparent;
144 | border: none;
145 | }
146 | }
147 | }
148 | }
149 | @media screen and (max-width: 1450px) {
150 | .search-list-head {
151 | .music-title {
152 | width: 30rem;
153 | }
154 | .singer {
155 | width: 20rem;
156 | }
157 | .album-name {
158 | width: 25rem;
159 | }
160 | }
161 | .songs {
162 | .music-title {
163 | width: 30rem;
164 | }
165 | .singer {
166 | width: 20rem;
167 | color: #777;
168 | cursor: pointer;
169 | }
170 | .album-name {
171 | width: 25rem;
172 | color: #777;
173 | cursor: pointer;
174 | }
175 | }
176 | }
177 | #black {
178 | li {
179 | .music-title {
180 | color: #d6d7de;
181 | }
182 | &:hover {
183 | background-color: #242629;
184 | color: #d6d7de;
185 | }
186 | }
187 | .search-list-head {
188 | .music-title {
189 | color: #777;
190 | }
191 | color: #d6d7de;
192 | background: #16181c;
193 | border-bottom: 1px solid #22252a;
194 | span {
195 | border-right: 1px solid #22252a;
196 | }
197 | }
198 | .songs{
199 | .index,
200 | .option {
201 | color: #777;
202 | }
203 | .singer {
204 | color: #777;
205 | }
206 | .album-name {
207 | color: #777;
208 | }
209 | .duration {
210 | color: #777;
211 | }
212 | li:nth-child(even) {
213 | background-color: #1b1c20;
214 | &:hover {
215 | background-color: #242629;
216 | }
217 | }
218 | }
219 | .page {
220 | ul {
221 | .fa {
222 | color: #7a7b7d;
223 | }
224 | li {
225 | color: #a4a4a4;
226 | &:hover {
227 | color: #fff;
228 | border: 1px solid #1f2227;
229 | background-color: #282b32;
230 | }
231 | }
232 | .pre-btn,
233 | .next-btn {
234 | border: 2px solid #1f2227;
235 | &:hover {
236 | border: 2px solid #1f2227;
237 | }
238 | }
239 | .active {
240 | color: #c62f2f;
241 | &:hover {
242 | color: #c62f2f;
243 | }
244 | }
245 | }
246 | }
247 | .loading {
248 | p {
249 | color: #a4a4a4;
250 | }
251 | }
252 | }
--------------------------------------------------------------------------------
/src/style/searchSongList.scss:
--------------------------------------------------------------------------------
1 | .search-song-list-container {
2 | .playlist {
3 | list-style: none;
4 | li {
5 | height: 6rem;
6 | line-height: 6rem;
7 | padding: 0 3.5rem;
8 | cursor: pointer;
9 | font-size: 13px;
10 | &:hover {
11 | background-color: #ecedee;
12 | }
13 | }
14 | .playlist-logo {
15 | width: 4rem;
16 | height: 4rem;
17 | margin-right: 1rem;
18 | border: 1px solid #ced6d7;
19 | vertical-align: middle;
20 | }
21 | .playlist-name {
22 | display: inline-block;
23 | width: 50rem;
24 | overflow: hidden;
25 | text-overflow: ellipsis;
26 | white-space: nowrap;
27 | vertical-align: middle;
28 | }
29 | .track-count {
30 | display: inline-block;
31 | width: 20rem;
32 | color: #888;
33 | }
34 | .creator {
35 | color: #777;
36 | &:hover {
37 | color: #222;
38 | }
39 | }
40 | li:nth-child(even) {
41 | background-color: #f5f5f7;
42 | &:hover {
43 | background-color: #ecedee;
44 | }
45 | }
46 | }
47 | .page {
48 | margin-top: 3rem;
49 | margin-bottom: 4rem;
50 | text-align: center;
51 | ul {
52 | list-style: none;
53 | .fa {
54 | color: #646464;
55 | font-size: 14px;
56 | vertical-align: middle;
57 | }
58 | li {
59 | display: inline-block;
60 | height: 2.4rem;
61 | padding: 0 .9rem;
62 | color: #a4a4a4;
63 | line-height: 2.4rem;
64 | text-align: center;
65 | font-size: 12px;
66 | border: 1px solid transparent;
67 | cursor: pointer;
68 | &:hover {
69 | color: #646464;
70 | border: 1px solid #c3c4c7;
71 | background-color: #ecedf1;
72 | }
73 | }
74 | .pre-btn,
75 | .next-btn {
76 | border: 2px solid #e9e9e9;
77 | &:hover {
78 | border: 2px solid #e9e9e9;
79 | }
80 | }
81 | .apostrophe {
82 | cursor: default;
83 | &:hover {
84 | border: 1px solid transparent;
85 | background-color: transparent;
86 | }
87 | }
88 | .active {
89 | color: #c62f2f;
90 | text-decoration: underline;
91 | border: none;
92 | cursor: default;
93 | &:hover {
94 | color: #c62f2f;
95 | background-color: transparent;
96 | border: none;
97 | }
98 | }
99 | }
100 | }
101 | }
102 | @media screen and (max-width: 1450px) {
103 | .search-song-list-container {
104 | .playlist {
105 | list-style: none;
106 | .playlist-name {
107 | width: 40rem;
108 | }
109 | }
110 | }
111 | }
112 | #black {
113 | .playlist {
114 | li {
115 | color: #c2d1dc;
116 | background: #16181c;
117 | img {
118 | border: 1px solid transparent;
119 | }
120 | .alias {
121 | font-size: 13px;
122 | color: #888;
123 | }
124 | &:hover {
125 | background-color: #242629;
126 | }
127 | }
128 | li:nth-child(even) {
129 | background-color: #1b1d20;
130 | &:hover {
131 | background-color: #242629;
132 | }
133 | }
134 | }
135 | .page {
136 | ul {
137 | .fa {
138 | color: #7a7b7d;
139 | }
140 | li {
141 | color: #a4a4a4;
142 | &:hover {
143 | color: #fff;
144 | border: 1px solid #1f2227;
145 | background-color: #282b32;
146 | }
147 | }
148 | .pre-btn,
149 | .next-btn {
150 | border: 2px solid #1f2227;
151 | &:hover {
152 | border: 2px solid #1f2227;
153 | }
154 | }
155 | .active {
156 | color: #c62f2f;
157 | &:hover {
158 | color: #c62f2f;
159 | }
160 | }
161 | }
162 | }
163 | }
--------------------------------------------------------------------------------
/src/style/sidebar.scss:
--------------------------------------------------------------------------------
1 | .sidebar {
2 | position: absolute;
3 | top: 5rem;
4 | bottom: 4.6rem;
5 | width: 20rem;
6 | border-right: 1px solid #e1e1e2;
7 | background-color: #f5f5f7;
8 | .sidebar-list {
9 | height: 90%;
10 | overflow: auto;
11 | &::-webkit-scrollbar {
12 | width: 8px;
13 | }
14 | &::-webkit-scrollbar-thumb {
15 | border-radius: 4px;
16 | background-color: #e1e1e2;
17 | &:hover {
18 | background-color: #cfcfd1;
19 | }
20 | }
21 | }
22 | .sidebar-head {
23 | position: relative;
24 | padding-left: 1rem;
25 | height: 3.2rem;
26 | line-height: 3.2rem;
27 | font-size: 1.3rem;
28 | text-align: left;
29 | color: #898989;
30 | cursor: pointer;
31 | .fa {
32 | margin-left: 10rem;
33 | font-size: 1.8rem;
34 | &:hover {
35 | color: #000;
36 | }
37 | }
38 | }
39 | ul {
40 | li {
41 | box-sizing: border-box;
42 | overflow-x: hidden;
43 | text-overflow: ellipsis;
44 | white-space: nowrap;
45 | width: 100%;
46 | height: 3rem;
47 | padding-left: 2rem;
48 | font-size: 1.3rem;
49 | line-height: 3rem;
50 | color: #5e5e5e;
51 | vertical-align: middle;
52 | cursor: pointer;
53 | &:hover {
54 | color: #000;
55 | }
56 | .fa {
57 | font-size: 1.8rem;
58 | margin-right: 1rem;
59 | }
60 | }
61 | }
62 | .preview {
63 | position: relative;
64 | height: 10%;
65 | border-top: 1px solid #e1e1e2;
66 | &:hover .shadow {
67 | display: flex;
68 | align-items: center;
69 | justify-content: center;
70 | }
71 | .musicImg,
72 | .shadow {
73 | position: absolute;
74 | top: 0;
75 | left: 0;
76 | height: 100%;
77 | width: 6.5rem;
78 | cursor: pointer;
79 | }
80 | .shadow {
81 | display: none;
82 | text-align: center;
83 | font-size: 3rem;
84 | color: #ddd;
85 | background: rgba(0, 0, 0, .3);
86 | }
87 | .info {
88 | display: flex;
89 | position: absolute;
90 | right: 0;
91 | top: 50%;
92 | transform: translateY(-50%);
93 | height: 100%;
94 | width: 12rem;
95 | flex-direction: column;
96 | justify-content: center;
97 | color: #474747;
98 | > div {
99 | display: flex;
100 | box-sizing: border-box;
101 | width: 12rem;
102 | padding-right: 1rem;
103 | flex-flow: row nowrap;
104 | align-items: center;
105 | justify-content: space-between;
106 | > span {
107 | display: inline-block;
108 | width: 10rem;
109 | overflow-x: hidden;
110 | text-overflow: ellipsis;
111 | white-space: nowrap;
112 | vertical-align: middle;
113 | cursor: pointer;
114 | }
115 | .singer {
116 | font-size: 1.2rem;
117 | }
118 | .fa {
119 | color: #a8a8a8;
120 | cursor: pointer;
121 | }
122 | .fa-heart {
123 | color: #e83c3c;
124 | }
125 | }
126 | }
127 | }
128 | }
129 | #black {
130 | .sidebar-head {
131 | position: relative;
132 | padding-left: 1rem;
133 | height: 3.2rem;
134 | line-height: 3.2rem;
135 | font-size: 1.3rem;
136 | text-align: left;
137 | color: #898989;
138 | cursor: pointer;
139 | .fa {
140 | &:hover {
141 | color: #fff;
142 | }
143 | }
144 | }
145 | ul {
146 | li {
147 | &:hover {
148 | color: #fff;
149 | }
150 | }
151 | }
152 | .preview {
153 | border-top: solid 1px #22252b;
154 | .info {
155 | color: #c8c9d0;
156 | }
157 | }
158 | }
--------------------------------------------------------------------------------
/src/style/singer.scss:
--------------------------------------------------------------------------------
1 | .singer-container {
2 | .singer-head {
3 | display: flex;
4 | box-sizing: border-box;
5 | width: 100%;
6 | padding: 2rem 3rem;
7 | flex-flow: row nowrap;
8 | .singer-img {
9 | width: 20rem;
10 | height: 20rem;
11 | margin-right: 2rem;
12 | border: 2px solid #ced6d7;
13 | img {
14 | width: 100%;
15 | height: 100%;
16 | }
17 | }
18 | .detail {
19 | margin-left: 2rem;
20 | .tag {
21 | display: inline-block;
22 | width: 4rem;
23 | height: 2.4rem;
24 | line-height: 2.4rem;
25 | text-align: center;
26 | color: #fdf8f8;
27 | vertical-align: middle;
28 | background-color: #c62f2f;
29 | border-radius: 3px;
30 | }
31 | p {
32 | font-size: 14px;
33 | margin-bottom: 1rem;
34 | }
35 | .singer {
36 | font-size: 24px;
37 | font-family: "SimSun";
38 | color: #666;
39 | vertical-align: middle;
40 | }
41 | .alias {
42 | margin-top: 3rem;
43 | margin-bottom: 2rem;
44 | font-size: 13px;
45 | }
46 | .detail-num {
47 | color: #6b696b;
48 | }
49 | }
50 | }
51 | .nav {
52 | box-sizing: border-box;
53 | height: 3.2rem;
54 | width: 100%;
55 | margin-top: 5rem;
56 | padding-left: 3rem;
57 | border-bottom: 2px solid #c62f2f;
58 | span {
59 | display: inline-block;
60 | width: 8rem;
61 | height: 3.2rem;
62 | line-height: 3.2rem;
63 | text-align: center;
64 | font-size: 13px;
65 | color: #fdf8f8;
66 | background-color: #c62f2f;
67 | }
68 | }
69 | .albums {
70 | box-sizing: border-box;
71 | padding: 2rem 3rem;
72 | .album-logo {
73 | width: 16rem;
74 | height: 16rem;
75 | img {
76 | width: 100%;
77 | height: 100%;
78 | }
79 | }
80 | .publishtime {
81 | margin-top: 1rem;
82 | margin-bottom: 1rem;
83 | font-size: 12px;
84 | color: #888;
85 | }
86 | .hot-songs,
87 | .album-songs {
88 | display: flex;
89 | flex-flow: row nowrap;
90 | margin-bottom: 5rem;
91 | }
92 | .albums-content {
93 | margin-left: 6rem;
94 | flex-grow: 1;
95 | }
96 | .albums-title {
97 | color: #555;
98 | font-size: 13px;
99 | margin-bottom: 2rem;
100 | &:hover {
101 | color: #000;
102 | }
103 | }
104 | .album-songs {
105 | .albums-title {
106 | cursor: pointer;
107 | }
108 | }
109 | ul {
110 | font-size: 13px;
111 | list-style: none;
112 | border: 2px solid #ededee;
113 | .fa {
114 | color: #b6b6b6;
115 | }
116 | .index,
117 | .time {
118 | color: #a1a2a2;
119 | font-weight: 500;
120 | }
121 | li {
122 | height: 3rem;
123 | line-height: 3rem;
124 | .index {
125 | margin-left: 2rem;
126 | }
127 | .fa {
128 | margin-left: .5rem;
129 | }
130 | .song-name {
131 | display: inline-block;
132 | width: 80rem;
133 | margin-left: 2rem;
134 | cursor: default;
135 | }
136 | &:hover {
137 | background-color: #ecedee;
138 | }
139 | }
140 | li:nth-child(even) {
141 | background-color: #f5f5f7;
142 | &:hover {
143 | background-color: #ecedee;
144 | }
145 | }
146 | }
147 | .show-all {
148 | padding: 1rem;
149 | font-size: 13px;
150 | color: #a1a2a2;
151 | span {
152 | cursor: pointer;
153 | &:hover {
154 | color: #666;
155 | }
156 | }
157 | }
158 | }
159 | }
160 | @media screen and (max-width: 1450px) {
161 | .singer-container {
162 | .albums {
163 | .album-logo {
164 | img {
165 | width: 16rem;
166 | height: 16rem;
167 | }
168 | }
169 | ul {
170 | li {
171 | .song-name {
172 | width: 60rem;
173 | }
174 | }
175 | }
176 | }
177 | }
178 | }
179 | #black {
180 | .singer {
181 | color: #c2c3c9;
182 | }
183 | .detail {
184 | p {
185 | color: #c2c3c9;
186 | }
187 | }
188 | .albums-title {
189 | color: #c2c3c9;
190 | &:hover {
191 | color: #fff;
192 | }
193 | }
194 | ul {
195 | border-color: transparent;
196 | li:nth-child(even) {
197 | background-color: #1b1d20;
198 | }
199 | li:hover {
200 | background-color: #242629;
201 | }
202 | .song-name {
203 | color: #c2c3c9;
204 | }
205 | }
206 | }
--------------------------------------------------------------------------------
/src/style/slider.scss:
--------------------------------------------------------------------------------
1 | .progress-container {
2 | position: relative;
3 | display: inline-block;
4 | width: 95rem;
5 | height: .5rem;
6 | margin: {
7 | left: 1rem;
8 | right: 1rem;
9 | }
10 | vertical-align: middle;
11 | background-color: #e8e8e8;
12 | border-radius: 5px;
13 | .progress {
14 | position: absolute;
15 | top: 0;
16 | left: 0;
17 | height: 5px;
18 | width: 0;
19 | border-radius: 5px;
20 | background-color: #e83c3c;
21 | }
22 | .dot {
23 | position: absolute;
24 | top: 50%;
25 | left: -10px;
26 | transform: translateY(-50%);
27 | width: 1.5rem;
28 | height: 1.5rem;
29 | text-align: center;
30 | line-height: 1.5rem;
31 | background-color: #fff;
32 | border: 1px solid #cdcdcd;
33 | border-radius: 50%;
34 | cursor: pointer;
35 | user-select: all;
36 | &:hover {
37 | box-shadow: 0 0 5px #bbb;
38 | }
39 | .circle {
40 | display: inline-block;
41 | height: .5rem;
42 | width: .5rem;
43 | margin-bottom: 2px;
44 | vertical-align: middle;
45 | border-radius: 50%;
46 | background-color: #e83c3c;
47 | }
48 | }
49 | }
--------------------------------------------------------------------------------
/src/style/songList.scss:
--------------------------------------------------------------------------------
1 | .container-head {
2 | position: relative;
3 | display: flex;
4 | box-sizing: border-box;
5 | width: 100%;
6 | padding: 2rem 3rem;
7 | flex-flow: row nowrap;
8 | .list-logo {
9 | width: 20rem;
10 | height: 20rem;
11 | margin-right: 2rem;
12 | border: 2px solid #ced6d7;
13 | img {
14 | width: 20rem;
15 | height: 20rem;
16 | }
17 | }
18 | .detail {
19 | flex-grow: 1;
20 | margin-left: 2rem;
21 | p {
22 | margin-bottom: 2rem;
23 | }
24 | .tag {
25 | display: inline-block;
26 | width: 4rem;
27 | height: 2.4rem;
28 | line-height: 2.4rem;
29 | text-align: center;
30 | color: #fdf8f8;
31 | vertical-align: middle;
32 | background-color: #c62f2f;
33 | border-radius: 3px;
34 | }
35 | .list-name {
36 | margin-left: 1rem;
37 | font-size: 24px;
38 | color: #666;
39 | vertical-align: middle;
40 | }
41 | .avatar {
42 | width: 3.2rem;
43 | height: 3.2rem;
44 | vertical-align: middle;
45 | border-radius: 50%;
46 | }
47 | .creator {
48 | color: #555;
49 | }
50 | .time {
51 | margin-left: 2rem;
52 | color: #888;
53 | font-size: 13px;
54 | }
55 | .tags {
56 | color: #2481c8;
57 | }
58 | .description {
59 | color: #666;
60 | font-size: 13px;
61 | }
62 | .toggle-btn {
63 | position: absolute;
64 | right: 4rem;
65 | bottom: 3rem;
66 | font-size: 25px;
67 | color: #888;
68 | cursor: pointer;
69 | &:hover {
70 | color: #000;
71 | }
72 | }
73 | .count {
74 | position: absolute;
75 | right: 5rem;
76 | top: 3rem;
77 | color: #666;
78 | span {
79 | margin-right: 2rem;
80 | }
81 | .fa {
82 | font-size: 16px;
83 | color: #666;
84 | margin-right: .5rem;
85 | }
86 | }
87 | }
88 | }
89 | .nav {
90 | box-sizing: border-box;
91 | height: 3.2rem;
92 | width: 100%;
93 | margin-top: 5rem;
94 | padding-left: 3rem;
95 | border-bottom: 2px solid #c62f2f;
96 | span {
97 | display: inline-block;
98 | width: 8rem;
99 | height: 3.2rem;
100 | line-height: 3.2rem;
101 | text-align: center;
102 | font-size: 13px;
103 | color: #fdf8f8;
104 | background-color: #c62f2f;
105 | }
106 | }
107 | .music-list {
108 | width: 100%;
109 | margin-bottom: 5rem;
110 | li {
111 | height: 3rem;
112 | line-height: 3rem;
113 | cursor: default;
114 | &:hover {
115 | background-color: #ecedee;
116 | }
117 | }
118 | span {
119 | display: inline-block;
120 | margin-left: 1rem;
121 | font-size: 13px;
122 | }
123 | .music-list-head {
124 | box-sizing: border-box;
125 | color: #555;
126 | font-size: 13px;
127 | border-bottom: 1px solid #ced6d7;
128 | span {
129 | border-right: 1px solid #ced6d7;
130 | vertical-align: middle;
131 | }
132 | .space,
133 | .option {
134 | width: 5rem;
135 | }
136 | .space {
137 | height: 100%;
138 | }
139 | .music-title {
140 | width: 40rem;
141 | }
142 | .singer {
143 | width: 30rem;
144 | }
145 | .album-name {
146 | width: 35rem;
147 | }
148 | .duration {
149 | width: 5rem;
150 | border-right: 0;
151 | }
152 | }
153 | ul {
154 | .index,
155 | .option {
156 | width: 5rem;
157 | color: #777;
158 | vertical-align: top;
159 | }
160 | .index {
161 | text-align: right;
162 | }
163 | .music-title {
164 | width: 40rem;
165 | }
166 | .singer {
167 | width: 30rem;
168 | color: #777;
169 | cursor: pointer;
170 | }
171 | .album-name {
172 | width: 35rem;
173 | color: #777;
174 | cursor: pointer;
175 | }
176 | .duration {
177 | width: 5rem;
178 | color: #777;
179 | }
180 | .music-title,
181 | .album-name,
182 | .singer {
183 | overflow: hidden;
184 | text-overflow: ellipsis;
185 | white-space: nowrap;
186 | }
187 | .alias {
188 | color: #888;
189 | }
190 | li:nth-child(odd) {
191 | background-color: #f5f5f7;
192 | &:hover {
193 | background-color: #ecedee;
194 | }
195 | }
196 | }
197 | }
198 | .loading {
199 | position: absolute;
200 | top: 0;
201 | left: 50%;
202 | transform: translateX(-50%);
203 | margin-top: 5rem;
204 | text-align: center;
205 | > p {
206 | margin-top: 3rem;
207 | }
208 | .fa {
209 | color: #c62f2f;
210 | font-size: 30px;
211 | }
212 | }
213 | .fade-enter-active, .fade-leave-active {
214 | transition: opacity .5s
215 | }
216 | .fade-enter, .fade-leave-active {
217 | opacity: 0
218 | }
219 | @media screen and (max-width: 1450px) {
220 | .music-list {
221 | .music-list-head {
222 | .music-title {
223 | width: 30rem;
224 | }
225 | .singer {
226 | width: 20rem;
227 | }
228 | .album-name {
229 | width: 25rem;
230 | }
231 | }
232 | ul {
233 | .music-title {
234 | width: 30rem;
235 | }
236 | .singer {
237 | width: 20rem;
238 | }
239 | .album-name {
240 | width: 25rem;
241 | }
242 | .duration {
243 | width: 5rem;
244 | }
245 | }
246 | }
247 | }
248 | #black {
249 | .list-name {
250 | color: #dbdde3;
251 | }
252 | .istag {
253 | color: #dbdde3;
254 | }
255 | .toggle-btn:hover {
256 | color: #dbdde3;
257 | }
258 | li {
259 | .music-title {
260 | color: #d6d7de;
261 | }
262 | &:hover {
263 | background-color: #242629;
264 | color: #d6d7de;
265 | }
266 | }
267 | .music-list-head {
268 | .music-title {
269 | color: #777;
270 | }
271 | color: #d6d7de;
272 | background: #16181c;
273 | border-bottom: 1px solid #22252a;
274 | span {
275 | border-right: 1px solid #22252a;
276 | }
277 | }
278 | ul {
279 | .index,
280 | .option {
281 | color: #777;
282 | }
283 | .singer {
284 | color: #777;
285 | }
286 | .album-name {
287 | color: #777;
288 | }
289 | .duration {
290 | color: #777;
291 | }
292 | li:nth-child(odd) {
293 | background-color: #1b1c20;
294 | &:hover {
295 | background-color: #242629;
296 | }
297 | }
298 | }
299 | .loading {
300 | p {
301 | color: #a4a4a4;
302 | }
303 | }
304 | }
--------------------------------------------------------------------------------
/static/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reusser/VueMusic-PC/bdad1226829f042270383b86d289ac864bc9644f/static/.gitkeep
--------------------------------------------------------------------------------