From d66acf692a3c89b4b3af2371288b92a918d9ad0e Mon Sep 17 00:00:00 2001 From: panhuishan <1475702015@qq.com> Date: Sat, 8 Dec 2018 11:25:28 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .babelrc | 18 + .editorconfig | 9 + .eslintignore | 5 + .eslintrc.js | 29 + .gitignore | 17 + .postcssrc.js | 10 + build/build.js | 41 + build/check-versions.js | 54 + build/logo.png | Bin 0 -> 6849 bytes build/utils.js | 101 ++ build/vue-loader.conf.js | 22 + build/webpack.base.conf.js | 92 ++ build/webpack.dev.conf.js | 95 ++ build/webpack.prod.conf.js | 149 +++ build/webpack.test.conf.js | 32 + config/dev.env.js | 7 + config/index.js | 85 ++ config/prod.env.js | 4 + config/test.env.js | 7 + index.html | 12 + package.json | 100 ++ src/App.vue | 23 + src/assets/logo.png | Bin 0 -> 6849 bytes src/components/Footer.vue | 62 ++ src/components/HelloWorld.vue | 113 ++ src/components/Kit.vue | 33 + src/components/Life.vue | 15 + src/components/News.vue | 15 + src/components/Prolist.vue | 40 + src/components/User.vue | 15 + src/components/Vod.vue | 15 + src/font/demo.css | 370 +++++++ src/font/demo_fontclass.html | 316 ++++++ src/font/demo_symbol.html | 431 ++++++++ src/font/demo_unicode.html | 354 ++++++ src/font/iconfont.css | 109 ++ src/font/iconfont.eot | Bin 0 -> 15164 bytes src/font/iconfont.js | 1 + src/font/iconfont.svg | 164 +++ src/font/iconfont.ttf | Bin 0 -> 14996 bytes src/font/iconfont.woff | Bin 0 -> 10176 bytes src/lib/base.scss | 55 + src/lib/classes.scss | 1139 ++++++++++++++++++++ src/lib/function.scss | 191 ++++ src/lib/reset.scss | 271 +++++ src/lib/variables.scss | 121 +++ src/main.js | 17 + src/main.scss | 27 + src/router/index.js | 40 + static/.gitkeep | 0 test/e2e/custom-assertions/elementCount.js | 27 + test/e2e/nightwatch.conf.js | 46 + test/e2e/runner.js | 48 + test/e2e/specs/test.js | 19 + test/unit/.eslintrc | 9 + test/unit/index.js | 13 + test/unit/karma.conf.js | 33 + test/unit/specs/HelloWorld.spec.js | 11 + 58 files changed, 5032 insertions(+) create mode 100644 .babelrc create mode 100644 .editorconfig create mode 100644 .eslintignore create mode 100644 .eslintrc.js create mode 100644 .gitignore create mode 100644 .postcssrc.js create mode 100644 build/build.js create mode 100644 build/check-versions.js create mode 100644 build/logo.png create mode 100644 build/utils.js create mode 100644 build/vue-loader.conf.js create mode 100644 build/webpack.base.conf.js create mode 100644 build/webpack.dev.conf.js create mode 100644 build/webpack.prod.conf.js create mode 100644 build/webpack.test.conf.js create mode 100644 config/dev.env.js create mode 100644 config/index.js create mode 100644 config/prod.env.js create mode 100644 config/test.env.js create mode 100644 index.html create mode 100644 package.json create mode 100644 src/App.vue create mode 100644 src/assets/logo.png create mode 100644 src/components/Footer.vue create mode 100644 src/components/HelloWorld.vue create mode 100644 src/components/Kit.vue create mode 100644 src/components/Life.vue create mode 100644 src/components/News.vue create mode 100644 src/components/Prolist.vue create mode 100644 src/components/User.vue create mode 100644 src/components/Vod.vue create mode 100644 src/font/demo.css create mode 100644 src/font/demo_fontclass.html create mode 100644 src/font/demo_symbol.html create mode 100644 src/font/demo_unicode.html create mode 100644 src/font/iconfont.css create mode 100644 src/font/iconfont.eot create mode 100644 src/font/iconfont.js create mode 100644 src/font/iconfont.svg create mode 100644 src/font/iconfont.ttf create mode 100644 src/font/iconfont.woff create mode 100644 src/lib/base.scss create mode 100644 src/lib/classes.scss create mode 100644 src/lib/function.scss create mode 100644 src/lib/reset.scss create mode 100644 src/lib/variables.scss create mode 100644 src/main.js create mode 100644 src/main.scss create mode 100644 src/router/index.js create mode 100644 static/.gitkeep create mode 100644 test/e2e/custom-assertions/elementCount.js create mode 100644 test/e2e/nightwatch.conf.js create mode 100644 test/e2e/runner.js create mode 100644 test/e2e/specs/test.js create mode 100644 test/unit/.eslintrc create mode 100644 test/unit/index.js create mode 100644 test/unit/karma.conf.js create mode 100644 test/unit/specs/HelloWorld.spec.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..801edec --- /dev/null +++ b/.babelrc @@ -0,0 +1,18 @@ +{ + "presets": [ + ["env", { + "modules": false, + "targets": { + "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] + } + }], + "stage-2" + ], + "plugins": ["transform-vue-jsx", "transform-runtime"], + "env": { + "test": { + "presets": ["env", "stage-2"], + "plugins": ["transform-vue-jsx", "istanbul"] + } + } +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..9d08a1a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..e2192c5 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,5 @@ +/build/ +/config/ +/dist/ +/*.js +/test/unit/coverage/ diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..22fdce8 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,29 @@ +// https://eslint.org/docs/user-guide/configuring + +module.exports = { + root: true, + parserOptions: { + parser: 'babel-eslint' + }, + env: { + browser: true, + }, + extends: [ + // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention + // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules. + 'plugin:vue/essential', + // https://github.com/standard/standard/blob/master/docs/RULES-en.md + 'standard' + ], + // required to lint *.vue files + plugins: [ + 'vue' + ], + // add your custom rules here + rules: { + // allow async-await + 'generator-star-spacing': 'off', + // allow debugger during development + 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dfb4167 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +.DS_Store +node_modules/ +/dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +/test/unit/coverage/ +/test/e2e/reports/ +selenium-debug.log + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln diff --git a/.postcssrc.js b/.postcssrc.js new file mode 100644 index 0000000..eee3e92 --- /dev/null +++ b/.postcssrc.js @@ -0,0 +1,10 @@ +// https://github.com/michael-ciniawsky/postcss-load-config + +module.exports = { + "plugins": { + "postcss-import": {}, + "postcss-url": {}, + // to edit target browsers: use "browserslist" field in package.json + "autoprefixer": {} + } +} diff --git a/build/build.js b/build/build.js new file mode 100644 index 0000000..8f2ad8a --- /dev/null +++ b/build/build.js @@ -0,0 +1,41 @@ +'use strict' +require('./check-versions')() + +process.env.NODE_ENV = 'production' + +const ora = require('ora') +const rm = require('rimraf') +const path = require('path') +const chalk = require('chalk') +const webpack = require('webpack') +const config = require('../config') +const webpackConfig = require('./webpack.prod.conf') + +const spinner = ora('building for production...') +spinner.start() + +rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { + if (err) throw err + webpack(webpackConfig, (err, stats) => { + spinner.stop() + if (err) throw err + process.stdout.write(stats.toString({ + colors: true, + modules: false, + children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build. + chunks: false, + chunkModules: false + }) + '\n\n') + + if (stats.hasErrors()) { + console.log(chalk.red(' Build failed with errors.\n')) + process.exit(1) + } + + console.log(chalk.cyan(' Build complete.\n')) + console.log(chalk.yellow( + ' Tip: built files are meant to be served over an HTTP server.\n' + + ' Opening index.html over file:// won\'t work.\n' + )) + }) +}) diff --git a/build/check-versions.js b/build/check-versions.js new file mode 100644 index 0000000..3ef972a --- /dev/null +++ b/build/check-versions.js @@ -0,0 +1,54 @@ +'use strict' +const chalk = require('chalk') +const semver = require('semver') +const packageConfig = require('../package.json') +const shell = require('shelljs') + +function exec (cmd) { + return require('child_process').execSync(cmd).toString().trim() +} + +const versionRequirements = [ + { + name: 'node', + currentVersion: semver.clean(process.version), + versionRequirement: packageConfig.engines.node + } +] + +if (shell.which('npm')) { + versionRequirements.push({ + name: 'npm', + currentVersion: exec('npm --version'), + versionRequirement: packageConfig.engines.npm + }) +} + +module.exports = function () { + const warnings = [] + + for (let i = 0; i < versionRequirements.length; i++) { + const mod = versionRequirements[i] + + if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { + warnings.push(mod.name + ': ' + + chalk.red(mod.currentVersion) + ' should be ' + + chalk.green(mod.versionRequirement) + ) + } + } + + if (warnings.length) { + console.log('') + console.log(chalk.yellow('To use this template, you must update following to modules:')) + console.log() + + for (let i = 0; i < warnings.length; i++) { + const warning = warnings[i] + console.log(' ' + warning) + } + + console.log() + process.exit(1) + } +} diff --git a/build/logo.png b/build/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d2503fc2a44b5053b0837ebea6e87a2d339a43 GIT binary patch literal 6849 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 { + const notifier = require('node-notifier') + + return (severity, errors) => { + if (severity !== 'error') return + + const error = errors[0] + const filename = error.file && error.file.split('!').pop() + + notifier.notify({ + title: packageConfig.name, + message: severity + ': ' + error.name, + subtitle: filename || '', + icon: path.join(__dirname, 'logo.png') + }) + } +} diff --git a/build/vue-loader.conf.js b/build/vue-loader.conf.js new file mode 100644 index 0000000..33ed58b --- /dev/null +++ b/build/vue-loader.conf.js @@ -0,0 +1,22 @@ +'use strict' +const utils = require('./utils') +const config = require('../config') +const isProduction = process.env.NODE_ENV === 'production' +const sourceMapEnabled = isProduction + ? config.build.productionSourceMap + : config.dev.cssSourceMap + +module.exports = { + loaders: utils.cssLoaders({ + sourceMap: sourceMapEnabled, + extract: isProduction + }), + cssSourceMap: sourceMapEnabled, + cacheBusting: config.dev.cacheBusting, + transformToRequire: { + video: ['src', 'poster'], + source: 'src', + img: 'src', + image: 'xlink:href' + } +} diff --git a/build/webpack.base.conf.js b/build/webpack.base.conf.js new file mode 100644 index 0000000..1f4f47e --- /dev/null +++ b/build/webpack.base.conf.js @@ -0,0 +1,92 @@ +'use strict' +const path = require('path') +const utils = require('./utils') +const config = require('../config') +const vueLoaderConfig = require('./vue-loader.conf') + +function resolve (dir) { + return path.join(__dirname, '..', dir) +} + +const createLintingRule = () => ({ + test: /\.(js|vue)$/, + loader: 'eslint-loader', + enforce: 'pre', + include: [resolve('src'), resolve('test')], + options: { + formatter: require('eslint-friendly-formatter'), + emitWarning: !config.dev.showEslintErrorsInOverlay + } +}) + +module.exports = { + context: path.resolve(__dirname, '../'), + entry: { + app: './src/main.js' + }, + output: { + path: config.build.assetsRoot, + filename: '[name].js', + publicPath: process.env.NODE_ENV === 'production' + ? config.build.assetsPublicPath + : config.dev.assetsPublicPath + }, + resolve: { + extensions: ['.js', '.vue', '.json'], + alias: { + 'vue$': 'vue/dist/vue.esm.js', + '@': resolve('src'), + } + }, + module: { + rules: [ + ...(config.dev.useEslint ? [createLintingRule()] : []), + { + test: /\.vue$/, + loader: 'vue-loader', + options: vueLoaderConfig + }, + { + test: /\.js$/, + loader: 'babel-loader', + include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')] + }, + { + test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, + name: utils.assetsPath('img/[name].[hash:7].[ext]') + } + }, + { + test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, + name: utils.assetsPath('media/[name].[hash:7].[ext]') + } + }, + { + test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, + name: utils.assetsPath('fonts/[name].[hash:7].[ext]') + } + } + ] + }, + node: { + // prevent webpack from injecting useless setImmediate polyfill because Vue + // source contains it (although only uses it if it's native). + setImmediate: false, + // prevent webpack from injecting mocks to Node native modules + // that does not make sense for the client + dgram: 'empty', + fs: 'empty', + net: 'empty', + tls: 'empty', + child_process: 'empty' + } +} diff --git a/build/webpack.dev.conf.js b/build/webpack.dev.conf.js new file mode 100644 index 0000000..070ae22 --- /dev/null +++ b/build/webpack.dev.conf.js @@ -0,0 +1,95 @@ +'use strict' +const utils = require('./utils') +const webpack = require('webpack') +const config = require('../config') +const merge = require('webpack-merge') +const path = require('path') +const baseWebpackConfig = require('./webpack.base.conf') +const CopyWebpackPlugin = require('copy-webpack-plugin') +const HtmlWebpackPlugin = require('html-webpack-plugin') +const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') +const portfinder = require('portfinder') + +const HOST = process.env.HOST +const PORT = process.env.PORT && Number(process.env.PORT) + +const devWebpackConfig = merge(baseWebpackConfig, { + module: { + rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true }) + }, + // cheap-module-eval-source-map is faster for development + devtool: config.dev.devtool, + + // these devServer options should be customized in /config/index.js + devServer: { + clientLogLevel: 'warning', + historyApiFallback: { + rewrites: [ + { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') }, + ], + }, + hot: true, + contentBase: false, // since we use CopyWebpackPlugin. + compress: true, + host: HOST || config.dev.host, + port: PORT || config.dev.port, + open: config.dev.autoOpenBrowser, + overlay: config.dev.errorOverlay + ? { warnings: false, errors: true } + : false, + publicPath: config.dev.assetsPublicPath, + proxy: config.dev.proxyTable, + quiet: true, // necessary for FriendlyErrorsPlugin + watchOptions: { + poll: config.dev.poll, + } + }, + plugins: [ + new webpack.DefinePlugin({ + 'process.env': require('../config/dev.env') + }), + new webpack.HotModuleReplacementPlugin(), + new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update. + new webpack.NoEmitOnErrorsPlugin(), + // https://github.com/ampedandwired/html-webpack-plugin + new HtmlWebpackPlugin({ + filename: 'index.html', + template: 'index.html', + inject: true + }), + // copy custom static assets + new CopyWebpackPlugin([ + { + from: path.resolve(__dirname, '../static'), + to: config.dev.assetsSubDirectory, + ignore: ['.*'] + } + ]) + ] +}) + +module.exports = new Promise((resolve, reject) => { + portfinder.basePort = process.env.PORT || config.dev.port + portfinder.getPort((err, port) => { + if (err) { + reject(err) + } else { + // publish the new Port, necessary for e2e tests + process.env.PORT = port + // add port to devServer config + devWebpackConfig.devServer.port = port + + // Add FriendlyErrorsPlugin + devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({ + compilationSuccessInfo: { + messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`], + }, + onErrors: config.dev.notifyOnErrors + ? utils.createNotifierCallback() + : undefined + })) + + resolve(devWebpackConfig) + } + }) +}) diff --git a/build/webpack.prod.conf.js b/build/webpack.prod.conf.js new file mode 100644 index 0000000..2f17259 --- /dev/null +++ b/build/webpack.prod.conf.js @@ -0,0 +1,149 @@ +'use strict' +const path = require('path') +const utils = require('./utils') +const webpack = require('webpack') +const config = require('../config') +const merge = require('webpack-merge') +const baseWebpackConfig = require('./webpack.base.conf') +const CopyWebpackPlugin = require('copy-webpack-plugin') +const HtmlWebpackPlugin = require('html-webpack-plugin') +const ExtractTextPlugin = require('extract-text-webpack-plugin') +const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') +const UglifyJsPlugin = require('uglifyjs-webpack-plugin') + +const env = process.env.NODE_ENV === 'testing' + ? require('../config/test.env') + : require('../config/prod.env') + +const webpackConfig = merge(baseWebpackConfig, { + module: { + rules: utils.styleLoaders({ + sourceMap: config.build.productionSourceMap, + extract: true, + usePostCSS: true + }) + }, + devtool: config.build.productionSourceMap ? config.build.devtool : false, + output: { + path: config.build.assetsRoot, + filename: utils.assetsPath('js/[name].[chunkhash].js'), + chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') + }, + plugins: [ + // http://vuejs.github.io/vue-loader/en/workflow/production.html + new webpack.DefinePlugin({ + 'process.env': env + }), + new UglifyJsPlugin({ + uglifyOptions: { + compress: { + warnings: false + } + }, + sourceMap: config.build.productionSourceMap, + parallel: true + }), + // extract css into its own file + new ExtractTextPlugin({ + filename: utils.assetsPath('css/[name].[contenthash].css'), + // Setting the following option to `false` will not extract CSS from codesplit chunks. + // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack. + // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`, + // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110 + allChunks: true, + }), + // Compress extracted CSS. We are using this plugin so that possible + // duplicated CSS from different components can be deduped. + new OptimizeCSSPlugin({ + cssProcessorOptions: config.build.productionSourceMap + ? { safe: true, map: { inline: false } } + : { safe: true } + }), + // generate dist index.html with correct asset hash for caching. + // you can customize output by editing /index.html + // see https://github.com/ampedandwired/html-webpack-plugin + new HtmlWebpackPlugin({ + filename: process.env.NODE_ENV === 'testing' + ? 'index.html' + : config.build.index, + template: 'index.html', + inject: true, + minify: { + removeComments: true, + collapseWhitespace: true, + removeAttributeQuotes: true + // more options: + // https://github.com/kangax/html-minifier#options-quick-reference + }, + // necessary to consistently work with multiple chunks via CommonsChunkPlugin + chunksSortMode: 'dependency' + }), + // keep module.id stable when vendor modules does not change + new webpack.HashedModuleIdsPlugin(), + // enable scope hoisting + new webpack.optimize.ModuleConcatenationPlugin(), + // split vendor js into its own file + new webpack.optimize.CommonsChunkPlugin({ + name: 'vendor', + minChunks (module) { + // any required modules inside node_modules are extracted to vendor + return ( + module.resource && + /\.js$/.test(module.resource) && + module.resource.indexOf( + path.join(__dirname, '../node_modules') + ) === 0 + ) + } + }), + // extract webpack runtime and module manifest to its own file in order to + // prevent vendor hash from being updated whenever app bundle is updated + new webpack.optimize.CommonsChunkPlugin({ + name: 'manifest', + minChunks: Infinity + }), + // This instance extracts shared chunks from code splitted chunks and bundles them + // in a separate chunk, similar to the vendor chunk + // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk + new webpack.optimize.CommonsChunkPlugin({ + name: 'app', + async: 'vendor-async', + children: true, + minChunks: 3 + }), + + // copy custom static assets + new CopyWebpackPlugin([ + { + from: path.resolve(__dirname, '../static'), + to: config.build.assetsSubDirectory, + ignore: ['.*'] + } + ]) + ] +}) + +if (config.build.productionGzip) { + const CompressionWebpackPlugin = require('compression-webpack-plugin') + + webpackConfig.plugins.push( + new CompressionWebpackPlugin({ + asset: '[path].gz[query]', + algorithm: 'gzip', + test: new RegExp( + '\\.(' + + config.build.productionGzipExtensions.join('|') + + ')$' + ), + threshold: 10240, + minRatio: 0.8 + }) + ) +} + +if (config.build.bundleAnalyzerReport) { + const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin + webpackConfig.plugins.push(new BundleAnalyzerPlugin()) +} + +module.exports = webpackConfig diff --git a/build/webpack.test.conf.js b/build/webpack.test.conf.js new file mode 100644 index 0000000..0d658d9 --- /dev/null +++ b/build/webpack.test.conf.js @@ -0,0 +1,32 @@ +'use strict' +// This is the webpack config used for unit tests. + +const utils = require('./utils') +const webpack = require('webpack') +const merge = require('webpack-merge') +const baseWebpackConfig = require('./webpack.base.conf') + +const webpackConfig = merge(baseWebpackConfig, { + // use inline sourcemap for karma-sourcemap-loader + module: { + rules: utils.styleLoaders() + }, + devtool: '#inline-source-map', + resolveLoader: { + alias: { + // necessary to to make lang="scss" work in test when using vue-loader's ?inject option + // see discussion at https://github.com/vuejs/vue-loader/issues/724 + 'scss-loader': 'sass-loader' + } + }, + plugins: [ + new webpack.DefinePlugin({ + 'process.env': require('../config/test.env') + }) + ] +}) + +// no need for app entry during tests +delete webpackConfig.entry + +module.exports = webpackConfig diff --git a/config/dev.env.js b/config/dev.env.js new file mode 100644 index 0000000..1e22973 --- /dev/null +++ b/config/dev.env.js @@ -0,0 +1,7 @@ +'use strict' +const merge = require('webpack-merge') +const prodEnv = require('./prod.env') + +module.exports = merge(prodEnv, { + NODE_ENV: '"development"' +}) diff --git a/config/index.js b/config/index.js new file mode 100644 index 0000000..6e0bcb2 --- /dev/null +++ b/config/index.js @@ -0,0 +1,85 @@ +'use strict' +// Template version: 1.3.1 +// see http://vuejs-templates.github.io/webpack for documentation. + +const path = require('path') + +module.exports = { + dev: { + + // Paths + assetsSubDirectory: 'static', + assetsPublicPath: '/', + proxyTable: { //代理服务器 + '/pan': { + target: 'https://www.daxunxun.com/', + changeOrigin: true, + pathRewrite: { + '^/pan': '' + } + } + + }, + + // Various Dev Server settings + host: 'localhost', // can be overwritten by process.env.HOST + port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined + autoOpenBrowser: false, + errorOverlay: true, + notifyOnErrors: true, + poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- + + // Use Eslint Loader? + // If true, your code will be linted during bundling and + // linting errors and warnings will be shown in the console. + useEslint: true, + // If true, eslint errors and warnings will also be shown in the error overlay + // in the browser. + showEslintErrorsInOverlay: false, + + /** + * Source Maps + */ + + // https://webpack.js.org/configuration/devtool/#development + devtool: 'cheap-module-eval-source-map', + + // If you have problems debugging vue-files in devtools, + // set this to false - it *may* help + // https://vue-loader.vuejs.org/en/options.html#cachebusting + cacheBusting: true, + + cssSourceMap: true + }, + + build: { + // Template for index.html + index: path.resolve(__dirname, '../dist/index.html'), + + // Paths + assetsRoot: path.resolve(__dirname, '../dist'), + assetsSubDirectory: 'static', + assetsPublicPath: '/', + + /** + * Source Maps + */ + + productionSourceMap: true, + // https://webpack.js.org/configuration/devtool/#production + devtool: '#source-map', + + // Gzip off by default as many popular static hosts such as + // Surge or Netlify already gzip all static assets for you. + // Before setting to `true`, make sure to: + // npm install --save-dev compression-webpack-plugin + productionGzip: false, + productionGzipExtensions: ['js', 'css'], + + // Run the build command with an extra argument to + // View the bundle analyzer report after build finishes: + // `npm run build --report` + // Set to `true` or `false` to always turn it on or off + bundleAnalyzerReport: process.env.npm_config_report + } +} diff --git a/config/prod.env.js b/config/prod.env.js new file mode 100644 index 0000000..a6f9976 --- /dev/null +++ b/config/prod.env.js @@ -0,0 +1,4 @@ +'use strict' +module.exports = { + NODE_ENV: '"production"' +} diff --git a/config/test.env.js b/config/test.env.js new file mode 100644 index 0000000..c2824a3 --- /dev/null +++ b/config/test.env.js @@ -0,0 +1,7 @@ +'use strict' +const merge = require('webpack-merge') +const devEnv = require('./dev.env') + +module.exports = merge(devEnv, { + NODE_ENV: '"testing"' +}) diff --git a/index.html b/index.html new file mode 100644 index 0000000..73cb8ec --- /dev/null +++ b/index.html @@ -0,0 +1,12 @@ + + + + + + mypro + + +
+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..0677ab2 --- /dev/null +++ b/package.json @@ -0,0 +1,100 @@ +{ + "name": "mypro", + "version": "1.0.0", + "description": "A Vue.js project", + "author": "pan", + "private": true, + "scripts": { + "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", + "start": "npm run dev", + "unit": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js --single-run", + "e2e": "node test/e2e/runner.js", + "test": "npm run unit && npm run e2e", + "lint": "eslint --ext .js,.vue src test/unit test/e2e/specs", + "build": "node build/build.js" + }, + "dependencies": { + "vue": "^2.5.2", + "vue-router": "^3.0.1" + }, + "devDependencies": { + "autoprefixer": "^7.1.2", + "babel-core": "^6.22.1", + "babel-eslint": "^8.2.1", + "babel-helper-vue-jsx-merge-props": "^2.0.3", + "babel-loader": "^7.1.1", + "babel-plugin-istanbul": "^4.1.1", + "babel-plugin-syntax-jsx": "^6.18.0", + "babel-plugin-transform-runtime": "^6.22.0", + "babel-plugin-transform-vue-jsx": "^3.5.0", + "babel-preset-env": "^1.3.2", + "babel-preset-stage-2": "^6.22.0", + "babel-register": "^6.22.0", + "chai": "^4.1.2", + "chalk": "^2.0.1", + "chromedriver": "^2.27.2", + "copy-webpack-plugin": "^4.0.1", + "cross-env": "^5.0.1", + "cross-spawn": "^5.0.1", + "css-loader": "^0.28.0", + "eslint": "^4.15.0", + "eslint-config-standard": "^10.2.1", + "eslint-friendly-formatter": "^3.0.0", + "eslint-loader": "^1.7.1", + "eslint-plugin-import": "^2.7.0", + "eslint-plugin-node": "^5.2.0", + "eslint-plugin-promise": "^3.4.0", + "eslint-plugin-standard": "^3.0.1", + "eslint-plugin-vue": "^4.0.0", + "extract-text-webpack-plugin": "^3.0.0", + "file-loader": "^1.1.4", + "friendly-errors-webpack-plugin": "^1.6.1", + "html-webpack-plugin": "^2.30.1", + "inject-loader": "^3.0.0", + "karma": "^1.4.1", + "karma-coverage": "^1.1.1", + "karma-mocha": "^1.3.0", + "karma-phantomjs-launcher": "^1.0.2", + "karma-phantomjs-shim": "^1.4.0", + "karma-sinon-chai": "^1.3.1", + "karma-sourcemap-loader": "^0.3.7", + "karma-spec-reporter": "0.0.31", + "karma-webpack": "^2.0.2", + "mocha": "^3.2.0", + "nightwatch": "^0.9.12", + "node-notifier": "^5.1.2", + "node-sass": "^4.10.0", + "optimize-css-assets-webpack-plugin": "^3.2.0", + "ora": "^1.2.0", + "phantomjs-prebuilt": "^2.1.14", + "portfinder": "^1.0.13", + "postcss-import": "^11.0.0", + "postcss-loader": "^2.0.8", + "postcss-url": "^7.2.1", + "rimraf": "^2.6.0", + "sass-loader": "^7.1.0", + "selenium-server": "^3.0.1", + "semver": "^5.3.0", + "shelljs": "^0.7.6", + "sinon": "^4.0.0", + "sinon-chai": "^2.8.0", + "uglifyjs-webpack-plugin": "^1.1.1", + "url-loader": "^0.5.8", + "vue-loader": "^13.3.0", + "vue-style-loader": "^3.0.1", + "vue-template-compiler": "^2.5.2", + "webpack": "^3.6.0", + "webpack-bundle-analyzer": "^2.9.0", + "webpack-dev-server": "^2.9.1", + "webpack-merge": "^4.1.0" + }, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not ie <= 8" + ] +} diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..4e9802d --- /dev/null +++ b/src/App.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d2503fc2a44b5053b0837ebea6e87a2d339a43 GIT binary patch literal 6849 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 +
+
    + + +

    {{item.name}}

    +
    +
+
+ + + diff --git a/src/components/HelloWorld.vue b/src/components/HelloWorld.vue new file mode 100644 index 0000000..1c19f2a --- /dev/null +++ b/src/components/HelloWorld.vue @@ -0,0 +1,113 @@ + + + + + + diff --git a/src/components/Kit.vue b/src/components/Kit.vue new file mode 100644 index 0000000..3d41909 --- /dev/null +++ b/src/components/Kit.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/src/components/Life.vue b/src/components/Life.vue new file mode 100644 index 0000000..011924b --- /dev/null +++ b/src/components/Life.vue @@ -0,0 +1,15 @@ + + + + + diff --git a/src/components/News.vue b/src/components/News.vue new file mode 100644 index 0000000..4392b47 --- /dev/null +++ b/src/components/News.vue @@ -0,0 +1,15 @@ + + + + + diff --git a/src/components/Prolist.vue b/src/components/Prolist.vue new file mode 100644 index 0000000..ed81dc1 --- /dev/null +++ b/src/components/Prolist.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/src/components/User.vue b/src/components/User.vue new file mode 100644 index 0000000..3fdf6fc --- /dev/null +++ b/src/components/User.vue @@ -0,0 +1,15 @@ + + + + + diff --git a/src/components/Vod.vue b/src/components/Vod.vue new file mode 100644 index 0000000..5e86309 --- /dev/null +++ b/src/components/Vod.vue @@ -0,0 +1,15 @@ + + + + + diff --git a/src/font/demo.css b/src/font/demo.css new file mode 100644 index 0000000..3d9cbe7 --- /dev/null +++ b/src/font/demo.css @@ -0,0 +1,370 @@ +*{margin: 0;padding: 0;list-style: none;} +/* +KISSY CSS Reset +理念:1. reset 的目的不是清除浏览器的默认样式,这仅是部分工作。清除和重置是紧密不可分的。 +2. reset 的目的不是让默认样式在所有浏览器下一致,而是减少默认样式有可能带来的问题。 +3. reset 期望提供一套普适通用的基础样式。但没有银弹,推荐根据具体需求,裁剪和修改后再使用。 +特色:1. 适应中文;2. 基于最新主流浏览器。 +维护:玉伯, 正淳 + */ + +/** 清除内外边距 **/ +body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, /* structural elements 结构元素 */ +dl, dt, dd, ul, ol, li, /* list elements 列表元素 */ +pre, /* text formatting elements 文本格式元素 */ +form, fieldset, legend, button, input, textarea, /* form elements 表单元素 */ +th, td /* table elements 表格元素 */ { + margin: 0; + padding: 0; +} + +/** 设置默认字体 **/ +body, +button, input, select, textarea /* for ie */ { + font: 12px/1.5 tahoma, arial, \5b8b\4f53, sans-serif; +} +h1, h2, h3, h4, h5, h6 { font-size: 100%; } +address, cite, dfn, em, var { font-style: normal; } /* 将斜体扶正 */ +code, kbd, pre, samp { font-family: courier new, courier, monospace; } /* 统一等宽字体 */ +small { font-size: 12px; } /* 小于 12px 的中文很难阅读,让 small 正常化 */ + +/** 重置列表元素 **/ +ul, ol { list-style: none; } + +/** 重置文本格式元素 **/ +a { text-decoration: none; } +a:hover { text-decoration: underline; } + + +/** 重置表单元素 **/ +legend { color: #000; } /* for ie6 */ +fieldset, img { border: 0; } /* img 搭车:让链接里的 img 无边框 */ +button, input, select, textarea { font-size: 100%; } /* 使得表单元素在 ie 下能继承字体大小 */ +/* 注:optgroup 无法扶正 */ + +/** 重置表格元素 **/ +table { border-collapse: collapse; border-spacing: 0; } + +/* 清除浮动 */ +.ks-clear:after, .clear:after { + content: '\20'; + display: block; + height: 0; + clear: both; +} +.ks-clear, .clear { + *zoom: 1; +} + +.main { + padding: 30px 100px; +width: 960px; +margin: 0 auto; +} +.main h1{font-size:36px; color:#333; text-align:left;margin-bottom:30px; border-bottom: 1px solid #eee;} + +.helps{margin-top:40px;} +.helps pre{ + padding:20px; + margin:10px 0; + border:solid 1px #e7e1cd; + background-color: #fffdef; + overflow: auto; +} + +.icon_lists{ + width: 100% !important; + +} + +.icon_lists li{ + float:left; + width: 100px; + height:180px; + text-align: center; + list-style: none !important; +} +.icon_lists .icon{ + font-size: 42px; + line-height: 100px; + margin: 10px 0; + color:#333; + -webkit-transition: font-size 0.25s ease-out 0s; + -moz-transition: font-size 0.25s ease-out 0s; + transition: font-size 0.25s ease-out 0s; + +} +.icon_lists .icon:hover{ + font-size: 100px; +} + + + +.markdown { + color: #666; + font-size: 14px; + line-height: 1.8; +} + +.highlight { + line-height: 1.5; +} + +.markdown img { + vertical-align: middle; + max-width: 100%; +} + +.markdown h1 { + color: #404040; + font-weight: 500; + line-height: 40px; + margin-bottom: 24px; +} + +.markdown h2, +.markdown h3, +.markdown h4, +.markdown h5, +.markdown h6 { + color: #404040; + margin: 1.6em 0 0.6em 0; + font-weight: 500; + clear: both; +} + +.markdown h1 { + font-size: 28px; +} + +.markdown h2 { + font-size: 22px; +} + +.markdown h3 { + font-size: 16px; +} + +.markdown h4 { + font-size: 14px; +} + +.markdown h5 { + font-size: 12px; +} + +.markdown h6 { + font-size: 12px; +} + +.markdown hr { + height: 1px; + border: 0; + background: #e9e9e9; + margin: 16px 0; + clear: both; +} + +.markdown p, +.markdown pre { + margin: 1em 0; +} + +.markdown > p, +.markdown > blockquote, +.markdown > .highlight, +.markdown > ol, +.markdown > ul { + width: 80%; +} + +.markdown ul > li { + list-style: circle; +} + +.markdown > ul li, +.markdown blockquote ul > li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown > ul li p, +.markdown > ol li p { + margin: 0.6em 0; +} + +.markdown ol > li { + list-style: decimal; +} + +.markdown > ol li, +.markdown blockquote ol > li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown code { + margin: 0 3px; + padding: 0 5px; + background: #eee; + border-radius: 3px; +} + +.markdown pre { + border-radius: 6px; + background: #f7f7f7; + padding: 20px; +} + +.markdown pre code { + border: none; + background: #f7f7f7; + margin: 0; +} + +.markdown strong, +.markdown b { + font-weight: 600; +} + +.markdown > table { + border-collapse: collapse; + border-spacing: 0px; + empty-cells: show; + border: 1px solid #e9e9e9; + width: 95%; + margin-bottom: 24px; +} + +.markdown > table th { + white-space: nowrap; + color: #333; + font-weight: 600; + +} + +.markdown > table th, +.markdown > table td { + border: 1px solid #e9e9e9; + padding: 8px 16px; + text-align: left; +} + +.markdown > table th { + background: #F7F7F7; +} + +.markdown blockquote { + font-size: 90%; + color: #999; + border-left: 4px solid #e9e9e9; + padding-left: 0.8em; + margin: 1em 0; + font-style: italic; +} + +.markdown blockquote p { + margin: 0; +} + +.markdown .anchor { + opacity: 0; + transition: opacity 0.3s ease; + margin-left: 8px; +} + +.markdown .waiting { + color: #ccc; +} + +.markdown h1:hover .anchor, +.markdown h2:hover .anchor, +.markdown h3:hover .anchor, +.markdown h4:hover .anchor, +.markdown h5:hover .anchor, +.markdown h6:hover .anchor { + opacity: 1; + display: inline-block; +} + +.markdown > br, +.markdown > p > br { + clear: both; +} + + +.hljs { + display: block; + background: white; + padding: 0.5em; + color: #333333; + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #df5000; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-type { + color: #a71d5d; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-title, +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #795da3; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} + +pre{ + background: #fff; +} + + + + + diff --git a/src/font/demo_fontclass.html b/src/font/demo_fontclass.html new file mode 100644 index 0000000..b9dd488 --- /dev/null +++ b/src/font/demo_fontclass.html @@ -0,0 +1,316 @@ + + + + + + IconFont + + + + +
+

IconFont 图标

+
    + +
  • + +
    数码
    +
    .icon-shuma
    +
  • + +
  • + +
    男装
    +
    .icon-nanzhuang
    +
  • + +
  • + +
    女装
    +
    .icon-nvzhuang
    +
  • + +
  • + +
    电器-01
    +
    .icon-dianqi01
    +
  • + +
  • + +
    +
    .icon-50
    +
  • + +
  • + +
    +
    .icon-xin
    +
  • + +
  • + +
    微博
    +
    .icon-weibo
    +
  • + +
  • + +
    删除
    +
    .icon-iconfontshanchu3
    +
  • + +
  • + +
    箭头
    +
    .icon-iconfontjiantou
    +
  • + +
  • + +
    箭头
    +
    .icon-jiantouarrowheads3
    +
  • + +
  • + +
    时间
    +
    .icon-shijian
    +
  • + +
  • + +
    分享
    +
    .icon-fenxiang
    +
  • + +
  • + +
    +
    .icon-baozhuanhuan
    +
  • + +
  • + +
    箭头
    +
    .icon-xiazai6
    +
  • + +
  • + +
    微信
    +
    .icon-ai-weixin
    +
  • + +
  • + +
    美食
    +
    .icon-meishi
    +
  • + +
  • + +
    鞋子1-01
    +
    .icon-xiezi101
    +
  • + +
  • + +
    放大镜
    +
    .icon-fangdajing
    +
  • + +
  • + +
    +
    .icon-wo
    +
  • + +
  • + +
    二维码
    +
    .icon-QRcode
    +
  • + +
  • + +
    +
    .icon-qian
    +
  • + +
  • + +
    手机
    +
    .icon-tel
    +
  • + +
  • + +
    搜索 粗
    +
    .icon-sousuo5
    +
  • + +
  • + +
    微信
    +
    .icon-weixin
    +
  • + +
  • + +
    店铺
    +
    .icon-dianpu
    +
  • + +
  • + +
    认证
    +
    .icon-renzheng
    +
  • + +
  • + +
    淘宝
    +
    .icon-taobao
    +
  • + +
  • + +
    箭头
    +
    .icon-jiantou
    +
  • + +
  • + +
    沙发
    +
    .icon-shafa
    +
  • + +
  • + +
    内衣
    +
    .icon-neiyi
    +
  • + +
  • + +
    购物袋
    +
    .icon-shoppingbag
    +
  • + +
  • + +
    购物
    +
    .icon-gouwu
    +
  • + +
  • + +
    +
    .icon-suo
    +
  • + +
  • + +
    闪电
    +
    .icon-shandian
    +
  • + +
  • + +
    箭头 上
    +
    .icon-jiantoushang
    +
  • + +
  • + +
    消息
    +
    .icon-xiaoxi
    +
  • + +
  • + +
    标签
    +
    .icon-biaoqian
    +
  • + +
  • + +
    收藏
    +
    .icon-shoucang
    +
  • + +
  • + +
    二维码
    +
    .icon-erweima
    +
  • + +
  • + +
    名片
    +
    .icon-mingpian
    +
  • + +
  • + +
    铅笔
    +
    .icon-icon-test
    +
  • + +
  • + +
    刷子
    +
    .icon-shuazi
    +
  • + +
  • + +
    奶瓶
    +
    .icon-naiping
    +
  • + +
  • + +
    +
    .icon-san
    +
  • + +
  • + +
    眼镜
    +
    .icon-yanjing
    +
  • + +
  • + +
    对号
    +
    .icon-duihao
    +
  • + +
+ +

font-class引用

+
+ +

font-class是unicode使用方式的一种变种,主要是解决unicode书写不直观,语意不明确的问题。

+

与unicode使用方式相比,具有如下特点:

+
    +
  • 兼容性良好,支持ie8+,及所有现代浏览器。
  • +
  • 相比于unicode语意明确,书写更直观。可以很容易分辨这个icon是什么。
  • +
  • 因为使用class来定义图标,所以当要替换图标时,只需要修改class里面的unicode引用。
  • +
  • 不过因为本质上还是使用的字体,所以多色图标还是不支持的。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的fontclass代码:

+ + +
<link rel="stylesheet" type="text/css" href="./iconfont.css">
+

第二步:挑选相应图标并获取类名,应用于页面:

+
<i class="iconfont icon-xxx"></i>
+
+

"iconfont"是你项目下的font-family。可以通过编辑项目查看,默认是"iconfont"。

+
+
+ + diff --git a/src/font/demo_symbol.html b/src/font/demo_symbol.html new file mode 100644 index 0000000..74fb12f --- /dev/null +++ b/src/font/demo_symbol.html @@ -0,0 +1,431 @@ + + + + + + IconFont + + + + + + +
+

IconFont 图标

+
    + +
  • + +
    数码
    +
    #icon-shuma
    +
  • + +
  • + +
    男装
    +
    #icon-nanzhuang
    +
  • + +
  • + +
    女装
    +
    #icon-nvzhuang
    +
  • + +
  • + +
    电器-01
    +
    #icon-dianqi01
    +
  • + +
  • + +
    +
    #icon-50
    +
  • + +
  • + +
    +
    #icon-xin
    +
  • + +
  • + +
    微博
    +
    #icon-weibo
    +
  • + +
  • + +
    删除
    +
    #icon-iconfontshanchu3
    +
  • + +
  • + +
    箭头
    +
    #icon-iconfontjiantou
    +
  • + +
  • + +
    箭头
    +
    #icon-jiantouarrowheads3
    +
  • + +
  • + +
    时间
    +
    #icon-shijian
    +
  • + +
  • + +
    分享
    +
    #icon-fenxiang
    +
  • + +
  • + +
    +
    #icon-baozhuanhuan
    +
  • + +
  • + +
    箭头
    +
    #icon-xiazai6
    +
  • + +
  • + +
    微信
    +
    #icon-ai-weixin
    +
  • + +
  • + +
    美食
    +
    #icon-meishi
    +
  • + +
  • + +
    鞋子1-01
    +
    #icon-xiezi101
    +
  • + +
  • + +
    放大镜
    +
    #icon-fangdajing
    +
  • + +
  • + +
    +
    #icon-wo
    +
  • + +
  • + +
    二维码
    +
    #icon-QRcode
    +
  • + +
  • + +
    +
    #icon-qian
    +
  • + +
  • + +
    手机
    +
    #icon-tel
    +
  • + +
  • + +
    搜索 粗
    +
    #icon-sousuo5
    +
  • + +
  • + +
    微信
    +
    #icon-weixin
    +
  • + +
  • + +
    店铺
    +
    #icon-dianpu
    +
  • + +
  • + +
    认证
    +
    #icon-renzheng
    +
  • + +
  • + +
    淘宝
    +
    #icon-taobao
    +
  • + +
  • + +
    箭头
    +
    #icon-jiantou
    +
  • + +
  • + +
    沙发
    +
    #icon-shafa
    +
  • + +
  • + +
    内衣
    +
    #icon-neiyi
    +
  • + +
  • + +
    购物袋
    +
    #icon-shoppingbag
    +
  • + +
  • + +
    购物
    +
    #icon-gouwu
    +
  • + +
  • + +
    +
    #icon-suo
    +
  • + +
  • + +
    闪电
    +
    #icon-shandian
    +
  • + +
  • + +
    箭头 上
    +
    #icon-jiantoushang
    +
  • + +
  • + +
    消息
    +
    #icon-xiaoxi
    +
  • + +
  • + +
    标签
    +
    #icon-biaoqian
    +
  • + +
  • + +
    收藏
    +
    #icon-shoucang
    +
  • + +
  • + +
    二维码
    +
    #icon-erweima
    +
  • + +
  • + +
    名片
    +
    #icon-mingpian
    +
  • + +
  • + +
    铅笔
    +
    #icon-icon-test
    +
  • + +
  • + +
    刷子
    +
    #icon-shuazi
    +
  • + +
  • + +
    奶瓶
    +
    #icon-naiping
    +
  • + +
  • + +
    +
    #icon-san
    +
  • + +
  • + +
    眼镜
    +
    #icon-yanjing
    +
  • + +
  • + +
    对号
    +
    #icon-duihao
    +
  • + +
+ + +

symbol引用

+
+ +

这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章 + 这种用法其实是做了一个svg的集合,与另外两种相比具有如下特点:

+
    +
  • 支持多色图标了,不再受单色限制。
  • +
  • 通过一些技巧,支持像字体那样,通过font-size,color来调整样式。
  • +
  • 兼容性较差,支持 ie9+,及现代浏览器。
  • +
  • 浏览器渲染svg的性能一般,还不如png。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的symbol代码:

+
<script src="./iconfont.js"></script>
+

第二步:加入通用css代码(引入一次就行):

+
<style type="text/css">
+.icon {
+   width: 1em; height: 1em;
+   vertical-align: -0.15em;
+   fill: currentColor;
+   overflow: hidden;
+}
+</style>
+

第三步:挑选相应图标并获取类名,应用于页面:

+
<svg class="icon" aria-hidden="true">
+  <use xlink:href="#icon-xxx"></use>
+</svg>
+        
+
+ + diff --git a/src/font/demo_unicode.html b/src/font/demo_unicode.html new file mode 100644 index 0000000..d506725 --- /dev/null +++ b/src/font/demo_unicode.html @@ -0,0 +1,354 @@ + + + + + + IconFont + + + + + +
+

IconFont 图标

+
    + +
  • + +
    数码
    +
    &#xe64b;
    +
  • + +
  • + +
    男装
    +
    &#xe60e;
    +
  • + +
  • + +
    女装
    +
    &#xe60f;
    +
  • + +
  • + +
    电器-01
    +
    &#xe634;
    +
  • + +
  • + +
    +
    &#xe632;
    +
  • + +
  • + +
    +
    &#xe640;
    +
  • + +
  • + +
    微博
    +
    &#xe63d;
    +
  • + +
  • + +
    删除
    +
    &#xe61a;
    +
  • + +
  • + +
    箭头
    +
    &#xe638;
    +
  • + +
  • + +
    箭头
    +
    &#xe6bd;
    +
  • + +
  • + +
    时间
    +
    &#xe67c;
    +
  • + +
  • + +
    分享
    +
    &#xe635;
    +
  • + +
  • + +
    +
    &#xe66f;
    +
  • + +
  • + +
    箭头
    +
    &#xe606;
    +
  • + +
  • + +
    微信
    +
    &#xe630;
    +
  • + +
  • + +
    美食
    +
    &#xe60c;
    +
  • + +
  • + +
    鞋子1-01
    +
    &#xe71d;
    +
  • + +
  • + +
    放大镜
    +
    &#xe61d;
    +
  • + +
  • + +
    +
    &#xe663;
    +
  • + +
  • + +
    二维码
    +
    &#xe63b;
    +
  • + +
  • + +
    +
    &#xe642;
    +
  • + +
  • + +
    手机
    +
    &#xe641;
    +
  • + +
  • + +
    搜索 粗
    +
    &#xe611;
    +
  • + +
  • + +
    微信
    +
    &#xe64f;
    +
  • + +
  • + +
    店铺
    +
    &#xe650;
    +
  • + +
  • + +
    认证
    +
    &#xe63f;
    +
  • + +
  • + +
    淘宝
    +
    &#xe633;
    +
  • + +
  • + +
    箭头
    +
    &#xe64e;
    +
  • + +
  • + +
    沙发
    +
    &#xe652;
    +
  • + +
  • + +
    内衣
    +
    &#xe61c;
    +
  • + +
  • + +
    购物袋
    +
    &#xe613;
    +
  • + +
  • + +
    购物
    +
    &#xe658;
    +
  • + +
  • + +
    +
    &#xe619;
    +
  • + +
  • + +
    闪电
    +
    &#xe60d;
    +
  • + +
  • + +
    箭头 上
    +
    &#xe62c;
    +
  • + +
  • + +
    消息
    +
    &#xe607;
    +
  • + +
  • + +
    标签
    +
    &#xe637;
    +
  • + +
  • + +
    收藏
    +
    &#xe64d;
    +
  • + +
  • + +
    二维码
    +
    &#xe614;
    +
  • + +
  • + +
    名片
    +
    &#xeeea;
    +
  • + +
  • + +
    铅笔
    +
    &#xe601;
    +
  • + +
  • + +
    刷子
    +
    &#xe608;
    +
  • + +
  • + +
    奶瓶
    +
    &#xe62f;
    +
  • + +
  • + +
    +
    &#xe625;
    +
  • + +
  • + +
    眼镜
    +
    &#xe610;
    +
  • + +
  • + +
    对号
    +
    &#xe6fd;
    +
  • + +
+

unicode引用

+
+ +

unicode是字体在网页端最原始的应用方式,特点是:

+
    +
  • 兼容性最好,支持ie6+,及所有现代浏览器。
  • +
  • 支持按字体的方式去动态调整图标大小,颜色等等。
  • +
  • 但是因为是字体,所以不支持多色。只能使用平台里单色的图标,就算项目里有多色图标也会自动去色。
  • +
+
+

注意:新版iconfont支持多色图标,这些多色图标在unicode模式下将不能使用,如果有需求建议使用symbol的引用方式

+
+

unicode使用步骤如下:

+

第一步:拷贝项目下面生成的font-face

+
@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.eot');
+  src: url('iconfont.eot?#iefix') format('embedded-opentype'),
+  url('iconfont.woff') format('woff'),
+  url('iconfont.ttf') format('truetype'),
+  url('iconfont.svg#iconfont') format('svg');
+}
+
+

第二步:定义使用iconfont的样式

+
.iconfont{
+  font-family:"iconfont" !important;
+  font-size:16px;font-style:normal;
+  -webkit-font-smoothing: antialiased;
+  -webkit-text-stroke-width: 0.2px;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+

第三步:挑选相应图标并获取字体编码,应用于页面

+
<i class="iconfont">&#x33;</i>
+ +
+

"iconfont"是你项目下的font-family。可以通过编辑项目查看,默认是"iconfont"。

+
+
+ + + + diff --git a/src/font/iconfont.css b/src/font/iconfont.css new file mode 100644 index 0000000..69a11bb --- /dev/null +++ b/src/font/iconfont.css @@ -0,0 +1,109 @@ + +@font-face {font-family: "iconfont"; + src: url('iconfont.eot?t=1543197690328'); /* IE9*/ + src: url('iconfont.eot?t=1543197690328#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'), + url('iconfont.ttf?t=1543197690328') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + url('iconfont.svg?t=1543197690328#iconfont') format('svg'); /* iOS 4.1- */ +} + +.iconfont { + font-family:"iconfont" !important; + font-size:16px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-shuma:before { content: "\e64b"; } + +.icon-nanzhuang:before { content: "\e60e"; } + +.icon-nvzhuang:before { content: "\e60f"; } + +.icon-dianqi01:before { content: "\e634"; } + +.icon-50:before { content: "\e632"; } + +.icon-xin:before { content: "\e640"; } + +.icon-weibo:before { content: "\e63d"; } + +.icon-iconfontshanchu3:before { content: "\e61a"; } + +.icon-iconfontjiantou:before { content: "\e638"; } + +.icon-jiantouarrowheads3:before { content: "\e6bd"; } + +.icon-shijian:before { content: "\e67c"; } + +.icon-fenxiang:before { content: "\e635"; } + +.icon-baozhuanhuan:before { content: "\e66f"; } + +.icon-xiazai6:before { content: "\e606"; } + +.icon-ai-weixin:before { content: "\e630"; } + +.icon-meishi:before { content: "\e60c"; } + +.icon-xiezi101:before { content: "\e71d"; } + +.icon-fangdajing:before { content: "\e61d"; } + +.icon-wo:before { content: "\e663"; } + +.icon-QRcode:before { content: "\e63b"; } + +.icon-qian:before { content: "\e642"; } + +.icon-tel:before { content: "\e641"; } + +.icon-sousuo5:before { content: "\e611"; } + +.icon-weixin:before { content: "\e64f"; } + +.icon-dianpu:before { content: "\e650"; } + +.icon-renzheng:before { content: "\e63f"; } + +.icon-taobao:before { content: "\e633"; } + +.icon-jiantou:before { content: "\e64e"; } + +.icon-shafa:before { content: "\e652"; } + +.icon-neiyi:before { content: "\e61c"; } + +.icon-shoppingbag:before { content: "\e613"; } + +.icon-gouwu:before { content: "\e658"; } + +.icon-suo:before { content: "\e619"; } + +.icon-shandian:before { content: "\e60d"; } + +.icon-jiantoushang:before { content: "\e62c"; } + +.icon-xiaoxi:before { content: "\e607"; } + +.icon-biaoqian:before { content: "\e637"; } + +.icon-shoucang:before { content: "\e64d"; } + +.icon-erweima:before { content: "\e614"; } + +.icon-mingpian:before { content: "\eeea"; } + +.icon-icon-test:before { content: "\e601"; } + +.icon-shuazi:before { content: "\e608"; } + +.icon-naiping:before { content: "\e62f"; } + +.icon-san:before { content: "\e625"; } + +.icon-yanjing:before { content: "\e610"; } + +.icon-duihao:before { content: "\e6fd"; } + diff --git a/src/font/iconfont.eot b/src/font/iconfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..dcd79e2b76c58ffd1700580a29e51208d0f4fb08 GIT binary patch literal 15164 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 W_yiVvaA-`dL*21&bYy5;lKu}OvTzju literal 0 HcmV?d00001 diff --git a/src/font/iconfont.js b/src/font/iconfont.js new file mode 100644 index 0000000..ce04282 --- /dev/null +++ b/src/font/iconfont.js @@ -0,0 +1 @@ +!function(s){var c,i='',l=(c=document.getElementsByTagName("script"))[c.length-1].getAttribute("data-injectcss");if(l&&!s.__iconfont__svg__cssinject__){s.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}!function(c){if(document.addEventListener)if(~["complete","loaded","interactive"].indexOf(document.readyState))setTimeout(c,0);else{var l=function(){document.removeEventListener("DOMContentLoaded",l,!1),c()};document.addEventListener("DOMContentLoaded",l,!1)}else document.attachEvent&&(a=c,h=s.document,t=!1,o=function(){t||(t=!0,a())},(i=function(){try{h.documentElement.doScroll("left")}catch(c){return void setTimeout(i,50)}o()})(),h.onreadystatechange=function(){"complete"==h.readyState&&(h.onreadystatechange=null,o())});var a,h,t,o,i}(function(){var c,l,a,h,t,o;(c=document.createElement("div")).innerHTML=i,i=null,(l=c.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",a=l,(h=document.body).firstChild?(t=a,(o=h.firstChild).parentNode.insertBefore(t,o)):h.appendChild(a))})}(window); \ No newline at end of file diff --git a/src/font/iconfont.svg b/src/font/iconfont.svg new file mode 100644 index 0000000..1e9f6a2 --- /dev/null +++ b/src/font/iconfont.svg @@ -0,0 +1,164 @@ + + + + + +Created by iconfont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/font/iconfont.ttf b/src/font/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..68c66b239b8440890c4a2c70e9e43c003170f924 GIT binary patch literal 14996 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 J42?_D{{hmgU4Q@p literal 0 HcmV?d00001 diff --git a/src/font/iconfont.woff b/src/font/iconfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..27812c5053dba0ebbda34733850e82a146e79c62 GIT binary patch literal 10176 zcmY*fQ;;S=ll;cEZF|SIcgMDEn>#jkY}>YN+qR9H|L|}Xkyu%0A&OZxJ| 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 RChP^tA-jMgzhjmG{{;ahiv9oq literal 0 HcmV?d00001 diff --git a/src/lib/base.scss b/src/lib/base.scss new file mode 100644 index 0000000..b601d89 --- /dev/null +++ b/src/lib/base.scss @@ -0,0 +1,55 @@ +@charset "utf-8"; +/** + * 全局base定义 + * 本文件与variables不同地方在于,这里所定义的map可以使用在variables和任何地方 + * 本文件中map使用"_"开头,extra中不使用"_" + * base ⇌ extra + */ + +// base +$base: ( + // root字号类型:normal | scaling + // normal表示root字号使用 `font-size-root` + // scaling表示root字号使用 `font-size-root-scaling` + responsive-type: normal, + // html root使用100px,方便rem单位的换算 + font-size-root: 100px, + // 适配:用于做元素随屏幕大小而变化的情况 + font-size-root-scaling: 31.25vw, + // body的默认字号(文档基准字号) + // chrome37-45/opera24-33在body上使用rem时有个bug(其他版本未测),后续版本已被修复: + // 只要引用了外部样式,不论里面的内容是什么,body上的rem就会失效 + // 这时在开发者工具里,关闭又开启一次该条属性,则生效,刷新又挂 + // 由于body是html的子元素,所以对于body来讲,此时rem与em的效果是相同的 + font-size: .14em, + // font-family + font-family: #{"Helvetica Neue", Helvetica, STHeiTi, sans-serif}, + // lin-height + line-height: 1.5, + // 默认文档背景色 + doc-bgcolor: #ffffff, + // 默认边框色 + border-color: #ccc, + // 默认次级边框色 + sub-border-color: #ddd, + // 默认背景颜色 + bgcolor: #ffffff, + // 默认文本颜色 + color: #333, + // 默认次级文本颜色 + sub-color: #666, + // 默认边框色 + disabled-border-color:#ccc, + // 默认文档颜色 + disabled-bgcolor: #e0e0e0, + // 默认禁用文本颜色 + disabled-color: #bbb, + // 高亮色 + light-color: #FE0053, + // 价格颜色 + price-color: #f60, + // 默认链接色 + link-color: #00afc7, + // 链接经过色 + link-hover-color: #f60 +); diff --git a/src/lib/classes.scss b/src/lib/classes.scss new file mode 100644 index 0000000..f5b8acb --- /dev/null +++ b/src/lib/classes.scss @@ -0,0 +1,1139 @@ +@charset "utf-8"; +/** + * 全局基础方法 + * 包括响应式方案,CSS3兼容性方案,厂商前缀方案,iconfont方案,flex布局等全局方法 + */ + +/** + * @module 功能 + * @description 给需要的属性加厂家前缀 + * @method _prefix + * @version 1.0.0 + * @param {String} $property 指定属性 <1.0.0> + * @param {String} $value 指定属性值 <1.0.0> + * @skip + */ +@mixin prefix($property, $value) { + // 老式浏览器 + // 是否开启厂商前缀支持 + @if map-get($setting, is-vendor-prefix) { + // 遍历输出厂商代码 + @each $vendor in map-get($setting, vendor-prefix) { + #{$vendor}#{$property}: $value; + } + } + // 现代浏览器(支持最新草案) + #{$property}: $value; +} + +/** + * @module 功能 + * @description 定义字体图标 + * @method _yofont + * @version 1.0.0 + * @skip + */ +@mixin yofont() { + // 是否开启图标字体 + @if map-get($ico, is-use) { + @font-face { + font-family: map-get($ico, font-name); + src: + // 现代浏览器 + url(#{map-get($ico,font-path)}#{map-get($ico,font-name)}.woff) format("woff"), + // Android2.2+ + url(#{map-get($ico,font-path)}#{map-get($ico,font-name)}.ttf) format("truetype"); + } + .yo-ico { + font-family: map-get($ico, font-name) !important; + font-style: normal; + -webkit-font-smoothing: antialiased; + // PC端chrome有锯齿问题,Mobile不需要 + // -webkit-text-stroke-width: .1px; + -moz-osx-font-smoothing: grayscale; + vertical-align: middle; + } + } +} + +/** + * @module 功能 + * @description 四则运算(iOS6.0+,Android4.4+) + * @method calc + * @version 1.7.0 + * @param {String} $property 指定需要进行计算的CSS属性 <1.7.0> + * @param {String} $value 与原生CSS语法一致,区别在于需要使用引号包裹表达式 <1.7.0> + * @example
四则运算
+ * .calc { @include calc(width, "100% - 100px"); } + */ +@mixin calc($property, $value) { + // 是否开启厂商前缀支持 + @if map-get($setting, is-vendor-prefix) { + // 遍历输出厂商代码 + @each $vendor in map-get($setting, vendor-prefix) { + // 输出所有厂商前缀(IE9.0+支持标准写法,更早版本不支持该函数) + @if $vendor != -ms- { + #{$property}: #{$vendor}calc(#{$value}); + } + } + } + #{$property}: calc(#{$value}); +} + +/** + * @module 功能 + * @description 定义响应式方案 + * @method responsive + * @version 1.0.0 + * @param {String} $media 指定媒体查询条件,取值为`config`文件map `media-types`中的值 <1.0.0> + */ +@mixin responsive($media) { + @if not map-has-key($media-types, $media) { + @warn "#{$media} is not a known media type. Using portrait instead."; + $media: portrait; + } + @media #{map-get($media-types, $media)} { + @content; + } +} + +/** + * @module 功能 + * @description 清除浮动方案 + * @method clearfix + * @version 1.0.0 + * @param {String} $type 指定清除浮动的方式,包括:pseudo-element | bfc,默认值:pseudo-element <1.8.5> + */ +@mixin clearfix($type: pseudo-element) { + @if $type == pseudo-element { + // 创建伪元素用以清除自身浮动 + &::after{ + display: block; + overflow: hidden; + clear: both; + height: 0; + content: "\0020"; + } + } @else { + // 创建BFC用以清除自身浮动 + overflow: hidden; + } +} + +/** + * @module 功能 + * @description 清除行内级元素间间隙方案 + * @method killspace + * @version 1.0.0 + * @param {Length} $font-size 指定子元素字号,默认值:.14rem <2.0.0> + * @example + *
+ * 1 + * 2 + * 3 + *
+ * .demo {@include killspace;} + */ +@mixin killspace($font-size: .14rem) { + font-size: 0; + font-family: arial; + > .item { + display: inline-block; + font-size: $font-size; + font-family: map-get($base, font-family); + } +} + +/** + * @module 功能 + * @description 元素在包含块中的对齐方式,默认为水平垂直对齐 + * @method align + * @version 2.0.0 + * @param {String} $flexbox 指定包含块布局方式,可选值:flex | inline-flex,默认值:flex <2.0.0> + * @param {String} $type 指定居中元素类型,可选值:image | text | other,默认值:text <2.0.0> + * @param {Keywords} $justify-content 指定元素水平对齐方式,取值与`justify-content`属性一致,默认值:center <2.0.0> + * @param {Keywords} $align-items 指定元素垂直对齐方式,取值与`align-items`属性一致,默认值:center <2.0.0> + * @example + *
+ * 未知尺寸图片居中 + *
+ * .demo {@include align;} + */ +@mixin align($flexbox: flex, $type: text, $justify-content: center, $align-items: center) { + @include flexbox($flexbox); + @include justify-content($justify-content); + @include align-items($align-items); + @if $type == text { + @include wrap; + } + > .item { + @if $type == image { + max-width: 100%; + max-height: 100%; + } + } +} + +/** + * @module 功能 + * @description 定义文档根节点是否允许滚动 + * @method root-scroll + * @version 1.4.0 + * @param {Boolean} $is-scroll 指定是否有滚动,默认值:false <1.8.6> + */ +@mixin root-scroll($is-scroll: false) { + html, + body { + @if $is-scroll { + overflow: visible; + height: auto; + } @else { + overflow: hidden; + height: 100%; + } + } +} + +/** + * @module 功能 + * @description 定义是否有滚动条 + * @method overflow + * @version 1.0.0 + * @param {String} $overflow 取值与最新原生语法一致,默认值:auto <1.0.0> + */ +@mixin overflow($overflow: auto) { + @if $overflow == auto { + overflow: auto; + // 移除此条规则,防止iOS8.0+ webview崩溃 + -webkit-overflow-scrolling: touch; + } @else { + overflow: $overflow; + } +} + +/** + * @module 功能 + * @description 生成全屏方法 + * @method fullscreen + * @version 1.7.0 + * @param {Integer} $z-index 指定层叠级别 <1.7.0> + * @param {Keywords} $position 指定定位方式,取除`static | relative`之外的值,默认值:absolute <1.8.5> + */ +@mixin fullscreen($z-index: null, $position: absolute) { + position: $position; + z-index: $z-index; + top: 0; + right: 0; + bottom: 0; + left: 0; +} + +/** + * @module 用户界面 + * @description 定义使用何种滤镜 + * @method filter + * @version 1.7.0 + * @param {String} $filter 取值与`filter`属性一致 <1.7.0> + */ +@mixin filter($filter...) { + @include prefix(filter, $filter); +} + +/** + * @module 用户界面 + * @description 定义UA默认外观 + * @method appearance + * @version 1.0.0 + * @param {String} $appearance 取值与`appearance`属性一致,默认值:none <1.0.0> + */ +@mixin appearance($appearance: none) { + @include prefix(appearance, $appearance); +} + +/** + * @module 用户界面 + * @description 定义如何选中内容 + * @method user-select + * @version 1.0.0 + * @param {String} $user-select 取值与`user-select`属性一致,默认值:none <1.0.0> + */ +@mixin user-select($user-select: none) { + @include prefix(user-select, $user-select); +} + +/** + * @module 用户界面 + * @description 定义盒模型 + * @method box-sizing + * @version 1.0.0 + * @param {String} $box-sizing 指定盒模型类型,取值与`box-sizing`属性一致,默认值:border-box <1.0.0> + */ +@mixin box-sizing($box-sizing: border-box) { + @include prefix(box-sizing, $box-sizing); +} + +/** + * @module 背景与边框 + * @description 定义渐变色值 + * @method gradient + * @version 1.0.0 + * @param {String} $type 指定渐变的4种类型:linear, repeating-linear, radial, repeating-radial <1.0.0> + * @param {String} $dir 指定渐变方向,可选值:[left | right] || [top | bottom] | angle <2.0.0> + * @param {String} $gradient 指定渐变取值,与w3c最新原生语法一致 <1.0.0> + */ +@mixin gradient($type, $dir, $color-stop...) { + // 最新草案:当方向为top,right,bottom,left时需要使用关键字to + $dir-new: to; + $dir-x: right left; + $dir-y: top bottom; + + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + background-image: $vendor$type#{-gradient($dir, $color-stop)}; + } + } + @each $direction in $dir { + @if index($dir-x, $direction) != null { + $dir-new: append($dir-new, remove($dir-x, $direction), space); + } @else if index($dir-y, $direction) != null { + $dir-new: append($dir-new, remove($dir-y, $direction), space); + } @else { + $dir-new: $direction; + } + } + + background-image: $type#{-gradient($dir-new, $color-stop)}; +} + +/** + * @module 背景与边框 + * @description 定义背景图像缩放(AndroidBrowser2.3.*还需要厂商前缀) + * @method background-size + * @version 1.4.0 + * @param {Keywords | Length} $background-size 指定背景图缩放值,取值与`background-size`属性一致 <1.4.0> + */ +@mixin background-size($background-size...) { + @include prefix(background-size, $background-size); +} + +/** + * @module 背景与边框 + * @description 定义背景裁减(AndroidBrowser2.3.*还需要厂商前缀) + * @method background-clip + * @version 1.6.0 + * @param {Keywords} $background-clip 指定背景图缩放值,取值与`background-clip`属性一致 <1.6.0> + */ +@mixin background-clip($background-clip...) { + @include prefix(background-clip, $background-clip); +} + +/** + * @module 背景与边框 + * @description 定义背景显示区域(AndroidBrowser2.3.*还需要厂商前缀) + * @method background-origin + * @version 1.6.0 + * @param {Keywords} $background-origin 指定背景图`background-position`属性计算相对的参考点,取值与`background-origin`属性一致 <1.6.0> + */ +@mixin background-origin($background-origin...) { + @include prefix(background-origin, $background-origin); +} + +/** + * @module 背景与边框 + * @description 定义圆角,用于修复某些安卓机型上“圆角+边框+背景”,背景溢出的情况 + * @method border-radius + * @version 1.6.0 + * @param {Length} $border-radius 指定元素的圆角半径,取值与`border-radius`属性一致 <1.6.0> + */ +@mixin border-radius($border-radius...) { + border-radius: $border-radius; + // 之所以会这样是因为这些机型的背景是从边框处开始渲染,所以只需要改成从padding处渲染即可 + @include background-clip(padding-box !important); +} + +/** + * @module 背景与边框 + * @description 为元素添加边框(包括1px边框) + * @method border + * @version 2.0.0 + * @param {String} $border-width 指定边框厚度(单位为px),默认值:1px,取值与`border-width`属性一致,不同方向代表边框位置 <2.0.0> + * @param {String} $border-color 指定边框颜色 <2.0.0> + * @param {String} $border-style 指定边框样式 <2.0.0> + * @param {String} $radius 指定边框圆角半径,默认值:null <2.0.0> + */ +@mixin border($border-width: 1px, $border-color: map-get($base, border-color), $border-style: solid, $radius: null) { + // 为边框位置提供定位参考 + position: relative; + @if $border-width == null { + $border-width: 0; + } + border-radius: $radius; + &::after { + // 用以解决边框layer遮盖内容 + pointer-events: none; + position: absolute; + z-index: 999; + top: 0; + left: 0; + overflow: hidden; + content: "\0020"; + border-color: $border-color; + border-style: $border-style; + border-width: $border-width; + // 适配dpr进行缩放 + @include responsive(retina1x) { + width: 100%; + height: 100%; + @if $radius != null { + border-radius: $radius; + } + } + @include responsive(retina2x) { + width: 200%; + height: 200%; + @include transform(scale(.5)); + @if $radius != null { + border-radius: $radius * 2; + } + } + @include responsive(retina3x) { + width: 300%; + height: 300%; + @include transform(scale(.33333)); + @if $radius != null { + border-radius: $radius * 3; + } + } + @include transform-origin(0 0); + } +} + +/** + * @module Transform + * @description 定义简单变换 + * @method transform + * @version 1.0.0 + * @param {String} $transform 取值范围与`transform`属性一致 <1.0.0> + */ +@mixin transform($transform...) { + @include prefix(transform, $transform); +} + +/** + * @module Transform + * @description 定义变换原点 + * @method transform-origin + * @version 1.0.0 + * @param {Length | Percentage | Keywords} $transform-origin 取值范围与`transform-origin`属性一致 <1.0.0> + */ +@mixin transform-origin($transform-origin) { + @include prefix(transform-origin, $transform-origin); +} + +/** + * @module Transform + * @description 指定某元素的子元素是(看起来)位于三维空间内,还是在该元素所在的平面内被扁平化 + * @method transform-style + * @version 2.0.0 + * @param {String} $transform-style 取值范围与`transform-style`属性一致 <2.0.0> + */ +@mixin transform-style($transform-style) { + @include prefix(transform-style, $transform-style); +} + +/** + * @module Transform + * @description 指定观察者与「z=0」平面的距离,使具有三维位置变换的元素产生透视效果。「z>0」的三维元素比正常大,而「z<0」时则比正常小,大小程度由该属性的值决定。 + * @method perspective + * @version 2.0.0 + * @param {none | Length} $perspective 取值范围与`perspective`属性一致 <2.0.0> + */ +@mixin perspective($perspective) { + @include prefix(perspective, $perspective); +} + +/** + * @module Transform + * @description 指定透视点的位置 + * @method perspective-origin + * @version 2.0.0 + * @param {Length | Percentage | Keywords} $perspective-origin 取值范围与`perspective-origin`属性一致 <2.0.0> + */ +@mixin perspective-origin($perspective-origin) { + @include prefix(perspective-origin, $perspective-origin); +} + +/** + * @module Transform + * @description 指定元素背面面向用户时是否可见 + * @method backface-visibility + * @version 2.0.0 + * @param {Keywords} $backface-visibility 取值范围与`backface-visibility`属性一致 <2.0.0> + */ +@mixin backface-visibility($backface-visibility) { + @include prefix(backface-visibility, $backface-visibility); +} + +/** + * @module Animation + * @description 定义动画 + * @method animation + * @version 1.0.0 + * @param {String} $animation 取值与原生语法一致 <1.0.0> + */ +@mixin animation($animation...) { + @include prefix(animation, $animation); +} + +/** + * @module Transition + * @description 定义补间 + * @method transition + * @version 1.0.0 + * @param {String} $transition 取值与原生语法一致 <1.0.0> + */ +@mixin transition($transition...){ + $prefix-properties: transform, transform-origin; + $vendor-list: (); + + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + @for $i from 1 through length($transition) { + @if index($prefix-properties, nth(nth($transition, $i), 1)) { + $vendor-list: join($vendor-list, #{$vendor}#{nth($transition, $i)}, comma); + } @else { + $vendor-list: join($vendor-list, #{nth($transition, $i)}, comma); + } + } + #{$vendor}transition: $vendor-list; + } + } + + transition: $transition; +} + +/** + * @module Flexbox + * @description 定义显示类型为伸缩盒 + * @method flexbox + * @version 1.0.0 + * @param {String} $flexbox 默认值:flex,可选值:flex | inline-flex <1.0.0> + */ +@mixin flexbox($flexbox: flex) { + @if $flexbox == inline-flex or $flexbox == inline { + $flexbox: "inline-"; + } @else { + $flexbox: ""; + } + // 老式浏览器(实验性质支持3个阶段草案) + // 原始草案:20090723 + // 过渡草案:20110322-20120322(以后面这个日期为准) + // 最新草案:20120612-20140925(以后面这个日期为准) + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + @if $vendor != -ms- { + // 当厂商前缀不为`-ms-`时输出原始和最新草案厂商前缀版 + display: #{$vendor}#{$flexbox}box; + display: #{$vendor}#{$flexbox}flex; + } @else { + // 当厂商前缀为`-ms-`时输出过渡草案厂商前缀版 + display: #{$vendor}#{$flexbox}flexbox; + } + } + } + // 现代浏览器(支持最新草案) + display: #{$flexbox}flex; +} + +/** + * @module Flexbox + * @description 定义伸缩盒子元素如何分配空间 + * @method flex + * @version 1.0.0 + * @param {Number} $flex 取值与`flex`属性一致,默认值:1 <1.0.0> + * @param {String} $direction 默认值: row,可选值:row | column <1.5.0> + */ +@mixin flex($flex: 1, $direction: row) { + // 老式浏览器(实验性质支持3个阶段草案) + // 原始版本box-flex并不是复合属性,所以只有一个为数字的值 + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + @if $vendor != -ms- { + // 当厂商前缀不为`-ms-`时输出原始和最新草案厂商前缀版 + #{$vendor}box-flex: $flex; + #{$vendor}flex: $flex; + } @else { + // 当厂商前缀为`-ms-`时输出过渡草案厂商前缀版 + #{$vendor}flex: $flex; + } + } + } + // 现代浏览器(支持最新草案) + flex: $flex; + // 修复Android Browser4.3及以下,iOS Safari6.1及以下按比例分配错误的问题(同时还包括flex嵌套时分配错误) + @if $direction == row { + width: .1px; + } @else { + height: .1px; + } +} + +/** + * @module Flexbox + * @description 定义伸缩盒子元素的排版顺序 + * @method order + * @version 1.0.0 + * @param {Integer} $order 取值与`order`属性一致,默认值:1 <1.0.0> + */ +@mixin order($order: 1) { + // 老式浏览器(实验性质支持3个阶段草案) + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + @if $vendor != -ms- { + // 当厂商前缀不为`-ms-`时输出原始和最新草案厂商前缀版 + #{$vendor}box-ordinal-group: $order; + #{$vendor}order: $order; + } @else { + // 当厂商前缀为`-ms-`时输出过渡草案厂商前缀版 + #{$vendor}flex-order: $order; + } + } + } + // 现代浏览器(支持最新草案) + order: $order; +} + +/** + * @module Flexbox + * @description 定义弹性盒子元素流动方向及遇见边界时是否换行(iOS7.0+,Android4.4+) + * @method flex-flow + * @version 2.0.0 + * @param {String} $flex-flow 取值与`flex-flow`属性一致,默认值:row nowrap <2.0.0> + */ +@mixin flex-flow($flex-flow: row nowrap) { + // 老式浏览器(实验性质支持过渡和最新2个阶段草案)+ 现代浏览器 + @include prefix(flex-flow, $flex-flow); +} + +/** + * @module Flexbox + * @description 定义伸缩盒子元素的流动方向 + * @method flex-direction + * @version 1.0.0 + * @param {String} $flex-direction 取值与`flex-direction`属性一致,默认值:row <1.0.0> + */ +@mixin flex-direction($flex-direction: row) { + // 老式浏览器(实验性质支持原始草案) + // 当厂商前缀不为`-ms-`时输出原始草案厂商前缀版 + @if $flex-direction == row { + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + @if $vendor != -ms- { + #{$vendor}box-orient: horizontal; + #{$vendor}box-direction: normal; + } + } + } + } @else if $flex-direction == column { + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + @if $vendor != -ms- { + #{$vendor}box-orient: vertical; + #{$vendor}box-direction: normal; + } + } + } + } @else if $flex-direction == row-reverse { + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + @if $vendor != -ms- { + #{$vendor}box-orient: horizontal; + #{$vendor}box-direction: reverse; + } + } + } + } @else if $flex-direction == column-reverse { + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + @if $vendor != -ms- { + #{$vendor}box-orient: vertical; + #{$vendor}box-direction: reverse; + } + } + } + } + // 老式浏览器(实验性质支持过渡及最新草案) + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + // `flex-direction`属性在过渡和最新草案中语法一致 + #{$vendor}flex-direction: $flex-direction; + } + } + // 现代浏览器(支持最新草案) + flex-direction: $flex-direction; +} + +/** + * @module Flexbox + * @description 定义弹性盒子元素溢出后排版(iOS7.0+,Android4.4+) + * @method flex-wrap + * @version 1.0.0 + * @param {String} $flex-wrap 取值与`flex-wrap`属性一致,默认值:nowrap <1.0.0> + */ +@mixin flex-wrap($flex-wrap: nowrap) { + // 老式浏览器(实验性质支持过渡和最新2个阶段草案)+ 现代浏览器 + // 原始草案有`box-lines`对应本属性,不过虽然被webkit实验性质支援,但却未被任何浏览器实现(等同于未实现) + @include prefix(flex-wrap, $flex-wrap); +} + +/** + * @module Flexbox + * @description 定义弹性容器主轴对齐方式(其中`space-around`值需要iOS7.0+,Android4.4+) + * @method justify-content + * @version 1.0.0 + * @param {String} $justify-content 取值与`justify-content`属性一致,默认值:center <1.0.0> + */ +@mixin justify-content($justify-content: center) { + // 老式浏览器(实验性质支持3个阶段草案) + @if $justify-content == center { + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + @if $vendor != -ms- { + // 当厂商前缀不为`-ms-`时输出原始和最新草案厂商前缀版 + #{$vendor}box-pack: $justify-content; + #{$vendor}justify-content: $justify-content; + } @else { + // 当厂商前缀为`-ms-`时输出过渡草案厂商前缀版 + #{$vendor}flex-pack: $justify-content; + } + } + } + } @else if $justify-content == flex-start { + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + @if $vendor != -ms- { + // 当厂商前缀不为`-ms-`时输出原始和最新草案厂商前缀版 + #{$vendor}box-pack: start; + #{$vendor}justify-content: $justify-content; + } @else { + // 当厂商前缀为`-ms-`时输出过渡草案厂商前缀版 + #{$vendor}flex-pack: start; + } + } + } + } @else if $justify-content == flex-end { + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + @if $vendor != -ms- { + // 当厂商前缀不为`-ms-`时输出原始和最新草案厂商前缀版 + #{$vendor}box-pack: end; + #{$vendor}justify-content: $justify-content; + } @else { + // 当厂商前缀为`-ms-`时输出过渡草案厂商前缀版 + #{$vendor}flex-pack: end; + } + } + } + } @else if $justify-content == space-between { + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + @if $vendor != -ms- { + // 当厂商前缀不为`-ms-`时输出原始和最新草案厂商前缀版 + #{$vendor}box-pack: justify; + #{$vendor}justify-content: $justify-content; + } @else { + // 当厂商前缀为`-ms-`时输出过渡草案厂商前缀版 + #{$vendor}flex-pack: justify; + } + } + } + } @else if $justify-content == space-around { + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + @if $vendor != -ms- { + // 当厂商前缀不为`-ms-`时输出原始和最新草案厂商前缀版 + // 原始草案不支持`space-around`(过渡版本中的`distribute`) 值 + //#{$vendor}box-pack: distribute; + #{$vendor}justify-content: $justify-content; + } @else { + // 当厂商前缀为`-ms-`时输出过渡草案厂商前缀版 + #{$vendor}flex-pack: distribute; + } + } + } + } + // 现代浏览器(支持最新草案) + justify-content: $justify-content; +} + +/** + * @module Flexbox + * @description 定义多行弹性容器侧轴对齐方式(iOS7.0+,Android4.4+) + * @method align-content + * @version 1.8.5 + * @param {String} $align-content 取值与`align-content`属性一致,默认值:center <1.8.5> + */ +@mixin align-content($align-content: center) { + // 老式浏览器(实验性质支持2个阶段草案) + @if $align-content == flex-start { + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + @if $vendor != -ms- { + // 当厂商前缀不为`-ms-`时输最新草案厂商前缀版(原始草案没有类似属性) + #{$vendor}align-content: $align-content; + } @else { + // 当厂商前缀为`-ms-`时输出过渡草案厂商前缀版 + #{$vendor}flex-line-pack: start; + } + } + } + } @else if $align-content == flex-end { + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + @if $vendor != -ms- { + // 当厂商前缀不为`-ms-`时输最新草案厂商前缀版(原始草案没有类似属性) + #{$vendor}align-content: $align-content; + } @else { + // 当厂商前缀为`-ms-`时输出过渡草案厂商前缀版 + #{$vendor}flex-line-pack: end; + } + } + } + } @else if $align-content == space-between { + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + @if $vendor != -ms- { + // 当厂商前缀不为`-ms-`时输最新草案厂商前缀版(原始草案没有类似属性) + #{$vendor}align-content: $align-content; + } @else { + // 当厂商前缀为`-ms-`时输出过渡草案厂商前缀版 + #{$vendor}flex-line-pack: justify; + } + } + } + } @else if $align-content == space-around { + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + @if $vendor != -ms- { + // 当厂商前缀不为`-ms-`时输最新草案厂商前缀版(原始草案没有类似属性) + #{$vendor}align-content: $align-content; + } @else { + // 当厂商前缀为`-ms-`时输出过渡草案厂商前缀版 + #{$vendor}flex-line-pack: distribute; + } + } + } + } @else if $align-content == center or $align-content == stretch { + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + @if $vendor != -ms- { + // 当厂商前缀不为`-ms-`时输最新草案厂商前缀版(原始草案没有类似属性) + #{$vendor}align-content: $align-content; + } @else { + // 当厂商前缀为`-ms-`时输出过渡草案厂商前缀版 + #{$vendor}flex-line-pack: $align-content; + } + } + } + } + // 现代浏览器(支持最新草案) + align-content: $align-content; +} + +/** + * @module Flexbox + * @description 定义单行弹性容器侧轴对齐方式 + * @method align-items + * @version 1.0.0 + * @param {String} $align-items 取值与`align-items`属性一致,默认值:center <1.0.0> + */ +@mixin align-items($align-items: center) { + // 老式浏览器(实验性质支持3个阶段草案) + @if $align-items == flex-start { + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + @if $vendor != -ms- { + // 当厂商前缀不为`-ms-`时输出原始和最新草案厂商前缀版 + #{$vendor}box-align: start; + #{$vendor}align-items: $align-items; + } @else { + // 当厂商前缀为`-ms-`时输出过渡草案厂商前缀版 + #{$vendor}flex-align: start; + } + } + } + } @else if $align-items == flex-end { + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + @if $vendor != -ms- { + // 当厂商前缀不为`-ms-`时输出原始和最新草案厂商前缀版 + #{$vendor}box-align: end; + #{$vendor}align-items: $align-items; + } @else { + // 当厂商前缀为`-ms-`时输出过渡草案厂商前缀版 + #{$vendor}flex-align: end; + } + } + } + } @else { + // 取值为center | baseline | stretch时,3个阶段草案均相同 + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + @if $vendor != -ms- { + // 当厂商前缀不为`-ms-`时输出原始和最新草案厂商前缀版 + #{$vendor}box-align: $align-items; + #{$vendor}align-items: $align-items; + } @else { + // 当厂商前缀为`-ms-`时输出过渡草案厂商前缀版 + #{$vendor}flex-align: $align-items; + } + } + } + } + // 现代浏览器(支持最新草案) + align-items: $align-items; +} + +/** + * @module Flexbox + * @description 定义弹性容器中子元素自身的在侧轴对齐方式(iOS7.0+,Android4.4+) + * @method align-self + * @version 1.0.0 + * @param {String} $align-self 取值与`align-self`属性一致,默认值:center <1.0.0> + */ +@mixin align-self($align-self: center) { + // 老式浏览器(实验性质支持3个阶段草案) + @if $align-self == flex-start { + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + @if $vendor != -ms- { + // 当厂商前缀不为`-ms-`时输最新草案厂商前缀版(原始草案没有类似属性) + #{$vendor}align-self: $align-self; + } @else { + // 当厂商前缀为`-ms-`时输出过渡草案厂商前缀版 + #{$vendor}flex-item-align: start; + } + } + } + } @else if $align-self == flex-end { + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + @if $vendor != -ms- { + // 当厂商前缀不为`-ms-`时输最新草案厂商前缀版(原始草案没有类似属性) + #{$vendor}align-self: $align-self; + } @else { + // 当厂商前缀为`-ms-`时输出过渡草案厂商前缀版 + #{$vendor}flex-item-align: end; + } + } + } + } @else if $align-self == auto or $align-self == center or $align-self == baseline or $align-self == stretch { + @if map-get($setting, is-vendor-prefix) { + @each $vendor in map-get($setting, vendor-prefix) { + @if $vendor != -ms- { + // 当厂商前缀不为`-ms-`时输最新草案厂商前缀版(原始草案没有类似属性) + #{$vendor}align-self: $align-self; + } @else { + // 当厂商前缀为`-ms-`时输出过渡草案厂商前缀版 + #{$vendor}flex-item-align: $align-self; + } + } + } + } + // 现代浏览器(支持最新草案) + align-self: $align-self; +} + +/** + * @module 形状 + * @description 生成矩形方法 + * @method rect + * @version 1.0.0 + * @param {Length} $width 定义矩形的长度 <1.0.0> + * @param {Length} $height 定义矩形的高度 <1.0.0> + */ +@mixin rect($width, $height) { + width: $width; + height: $height; +} + +/** + * @module 形状 + * @description 生成正方形方法 + * @method square + * @version 1.0.0 + * @param {Length} $size 定义正方形的边长 <1.0.0> + */ +@mixin square($size) { + width: $size; + height: $size; +} + +/** + * @module 形状 + * @description 生成圆形方法 + * @method circle + * @version 1.0.0 + * @param {Length} $size 定义圆的半径长度 <1.0.0> + * @param {Length} $radius 定义圆的圆角半径长度 <1.0.0> + */ +@mixin circle($size, $radius: 50%) { + @include square($size); + @include border-radius($radius); +} + +/** + * @module 文本 + * @description 链接处理方法 + * @method link + * @version 1.0.0 + * @param {Color} $color 定义链接颜色 <1.0.0> + */ +@mixin link($color: map-get($base, link-color)) { + color: $color; + cursor: pointer; + &:active { + opacity: .5; + } +} + +/** + * @module 文本 + * @description 文本碰到边界是否换行 + * @method wrap + * @version 1.0.0 + * @param {Boolean} $is-wrap 定义文本是否换行,默认值:true <2.0.0> + */ +@mixin wrap($is-wrap: true) { + @if $is-wrap == true { + word-wrap: break-word; + word-break: break-all; + } @else { + white-space: nowrap; + } +} + +/** + * @module 文本 + * @description 单行文本溢出时显示省略号 + * @method ellipsis + * @version 1.0.0 + * @param {Length} $width 定义容器的宽度,默认值:null <2.0.0> + * @param {Integer} $line-clamp 定义需要显示的行数,默认值:1(即使用单行溢出的处理方案),需要注意的是本参数只支持webkit内核 <2.1.2> + */ +@mixin ellipsis($width: null, $line-clamp: 1) { + overflow: hidden; + text-overflow: ellipsis; + width: $width; + @if abs($line-clamp) > 1 { + // 要使得多行截取生效,display的值只能为-webkit-box + display: -webkit-box !important; + -webkit-line-clamp: $line-clamp; + @include flex-direction(column); + } @else { + @include wrap(false); + } +} + +/** + * @module 文本 + * @description 文字隐藏方案 + * @method texthide + * @version 1.0.0 + * @param {Length} $width 定义容器的宽度,默认值:null <2.0.0> + */ +@mixin texthide($width: null) { + overflow: hidden; + white-space: nowrap; + text-indent: 100%; + width: $width; +} + + +/** + * @module 背景颜色 + * @description 填充背景颜色方案 + * @method background-color + * @version 1.0.0 + * @param {Length} $color 定义背景的颜色,默认值:#eee <2.0.0> + */ +@mixin background-color($color: #eee) { + background-color: $color; +} + +/** + * @module 文本颜色 + * @description 文本颜色方案 + * @method text-color + * @version 1.0.0 + * @param {Length} $color 定义文本的颜色,默认值:#333 <2.0.0> + */ +@mixin text-color($color: #333) { + color: $color; +} +/** + * @module 文本行高 + * @description 文本行高方案 + * @method line-height + * @version 1.0.0 + * @param {Length} $color 定义文本行高,默认值:1 <2.0.0> + */ +@mixin line-height($lineheight: 1) { + line-height: $lineheight; +} +/** + * @module 字体大小 + * @description 字体大小方案 + * @method font-size + * @version 1.0.0 + * @param {Length} $size 字体大小,默认值:0.12rem <2.0.0> + */ +@mixin font-size($size: 0.12rem) { + font-size: $size; +} +/** + * @module 文本对齐方式 + * @description 文本对齐方式 + * @method fontsize + * @version 1.0.0 + * @param {Length} $val 文本对齐方式,默认值:居中 + */ +@mixin text-align($val: center) { + text-align: $val; +} + +/** + * @module 内边距 + * @description 内边距 + * @method padding + * @version 1.0.0 + * @param {auto} $val 5px + */ +@mixin padding($val: 5px) { + padding: $val; +} +/** + * @module 字体样式 + * @description 字体样式 + * @method padding + * @version 1.0.0 + * @param {auto} $val bold + */ +@mixin font-weight($val: bold) { + font-weight: $val; +} +/** + * @module 外边距 + * @description 外边距 + * @method padding + * @version 1.0.0 + * @param {auto} $val 5px + */ +@mixin margin($val: 5px) { + margin: $val; +} + +@mixin display($val: block) { + display: $val; +} + diff --git a/src/lib/function.scss b/src/lib/function.scss new file mode 100644 index 0000000..898517a --- /dev/null +++ b/src/lib/function.scss @@ -0,0 +1,191 @@ +@charset "utf-8"; +/** + * 自定义全局函数 + * 扩充Sass默认函数库,用以增强语法 + */ + +/** + * @module List扩展函数 + * @description 返回SassList中的第一项 + * @function first + * @version 2.1.0 + * @param {String} $list 指定一个Sass List <2.1.0> + */ +@function first($list) { + $length: length($list); + $value: ""; + + @if type-of($list) != list { + @warn "`$list` of `first($list)` must be a list type."; + } @else if $length == 0 { + @warn "`$list` of `first($list)` must not be empty."; + } @else { + $value: nth($list, 1); + } + + @return $value; +} + +/** + * @module List扩展函数 + * @description 返回SassList中的最后一项 + * @function last + * @version 2.1.0 + * @param {String} $list 指定一个Sass List <2.1.0> + */ +@function last($list) { + $length: length($list); + $value: ""; + + @if type-of($list) != list { + @warn "`$list` of `last($list)` must be a list type."; + } @else if $length == 0 { + @warn "`$list` of `last($list)` must not be empty."; + } @else { + $value: nth($list, -1); + } + + @return $value; +} + +/** + * @module List扩展函数 + * @description 返回SassList中的倒数第几项 + * @function nth-last + * @version 2.1.0 + * @param {String} $list 指定一个Sass List <2.1.0> + * @param {Integer} $index 指定需要返回的值在list中的倒数位置 <2.1.0> + */ +@function nth-last($list, $index) { + $length: length($list); + $value: ""; + + @if type-of($list) != list { + @warn "$list of `nth-last($list, $index)` must be a list type."; + } @else if type-of($index) != number { + @warn "$index of `nth-last($list, $index)` must be a integer."; + } @else if $index <= 0 { + @warn "$index of `nth-last($list, $index)` must be a greater than zero integer."; + } @else if $index > $length { + @warn "$index out of bounds for `nth-last($list, $index)`."; + } @else { + $value: nth($list, -$index); + } + + @return $value; +} + +/** + * @module List扩展函数 + * @description 移除SassList中的某个项目并返回新的List + * @function remove + * @version 2.1.0 + * @param {String} $list 指定一个Sass List <2.1.0> + * @param {String} $value 指定需要被删除的值 <2.1.0> + */ +@function remove($list, $value) { + $new-list: (); + $length: length($list); + + @if type-of($list) != list { + @warn "$list of `remove($list, $value)` must be a list type."; + } @else { + @for $i from 1 through $length { + @if type-of(nth($list, $i)) == list { + $new-list: append($new-list, remove(nth($list, $i), $value), list-separator($list)); + } @else if nth($list, $i) != $value { + $new-list: append($new-list, nth($list, $i), list-separator($list)); + } + } + } + + @return $new-list; +} + +/** + * @module List扩展函数 + * @description 截取SassList中的某个部分并返回新的List + * @function slice + * @version 2.1.0 + * @param {String} $list 指定一个Sass List <2.1.0> + * @param {Integer} $start 指定需要截取的开始下标 <2.1.0> + * @param {Integer} $end 指定需要截取的结束下标(不包括end),当该值缺省时默认为末尾下标 <2.1.0> + */ +@function slice($list, $start, $end: length($list) + 1) { + $new-list: (); + $length: length($list); + + @if type-of($list) != list { + @warn "$list of `slice($list, $start, $end)` must be a list type."; + } @else if type-of($start) != number or type-of($end) != number { + @warn "$strat and $end of `slice($list, $start, $end)` must be a integer."; + } @else if $start == 0 or $end == 0 { + @warn "$start and $end of `slice($list, $start, $end)` must be a non-zero integer."; + } @else { + $start: if($start < 0, $length + $start + 1, $start); + $end: if($end < 0, $length + $end + 1, $end); + @for $i from $start through $end - 1 { + $new-list: append($new-list, nth($list, $i), list-separator($list)); + } + } + + @return $new-list; +} + +/** + * @module List扩展函数 + * @description 从SassList中添加/删除项目,然后返回新的List。 + * @function splice + * @version 2.1.0 + * @param {String} $list 指定一个Sass List <2.1.0> + * @param {Integer} $index 指定需要移除的开始下标 <2.1.0> + * @param {Integer} $count 指定需要移除的数量,不可以为负值,0表示不移除 <2.1.0> + * @param {String} $values 指定需要添加的新值(可以是多个),如果该值缺省,则表示只移除不添加新值 <2.1.0> + */ +@function splice($list, $index, $count, $values...) { + $new-list: (); + $length: length($list); + + @if type-of($list) != list { + @warn "$list of `splice($list, $index, $count, $values...)` must be a list type."; + } @else if type-of($index) != number or $index == 0 { + @warn "$index of `splice($list, $index, $count, $values...)` must be a non-zero integer."; + } @else if type-of($count) != number or $count < 0 { + @warn "$count of `splice($list, $index, $count, $values...)` must be a positive integer."; + } @else { + $index: if($index < 0, $length + $index + 1, $index); + @if $count == 0 { + @if $index < $length { + @for $i from 1 through $length { + @if $i != $index { + $new-list: append($new-list, nth($list, $i), list-separator($list)); + } @else { + // 在$index位置插入新值,并且将原来位置上的值往后移一位 + $new-list: join($new-list, $values, list-separator($list)); + $new-list: append($new-list, nth($list, $i), list-separator($list)); + } + } + } @else { + @for $i from 1 through $index { + @if $i < $index { + $new-list: append($new-list, nth($list, $i), list-separator($list)); + } @else { + $new-list: join($new-list, $values, list-separator($list)); + } + } + } + } @else { + @for $i from 1 through $length { + @if $i < $index { + $new-list: append($new-list, nth($list, $i), list-separator($list)); + } @else if $i == $index { + $new-list: join($new-list, $values, list-separator($list)); + } @else if $i >= ($index + $count) { + $new-list: append($new-list, nth($list, $i), list-separator($list)); + } + } + } + } + + @return $new-list; +} diff --git a/src/lib/reset.scss b/src/lib/reset.scss new file mode 100644 index 0000000..e29a8d5 --- /dev/null +++ b/src/lib/reset.scss @@ -0,0 +1,271 @@ +@charset "utf-8"; +@import "base"; +@import "variables"; +@import "function"; +@import "classes"; +/** + * 全局Reset + * 重置Mobile及高级浏览器上常见的差异 + */ + +// 1. 将元素的盒模型统一为: border-box +// 2. 清除元素tap时出现的焦点框 +*, +::before, +::after { + @include box-sizing(border-box); + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +// 1. 默认禁止body滚动 +@include root-scroll; + +// 1. 隐藏页面滚动条 +::-webkit-scrollbar { + @if map-get($setting, is-scrollbar) == false { + display: none; + } +} + +// 1. 防止用户自定义网页背景及文字颜色、大小影响 +html { + background-color: map-get($base, doc-bgcolor); + color: map-get($base, color); + // 定义root字号,作为rem计算基准 + @if map-get($base, responsive-type) == scaling { + // 如果是跟随屏幕大小而变的场景,使用 vw + font-size: map-get($base, font-size-root-scaling); + } @else { + // 如果是常规场景,使用 px + font-size: map-get($base, font-size-root); + } + // 是否允许横竖屏时字号调整 + @if map-get($setting, is-text-size-adjust) == false { + // 如果为flase,则不允许自动调整 + -webkit-text-size-adjust: 100%; + } + @include user-select; +} + +// 1. 清除body的默认margin +// 2. 定义页面的默认字号 +// 3. 定义页面的默认行高 +// 4. 定义页面的默认字体 +body { + margin: 0; + font-size: map-get($base, font-size); + line-height: map-get($base, line-height); + font-family: map-get($base, font-family); +} + +// 1. 清除某些元素在不同浏览器下内外补白不同造成的影响 +ul, +ol, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +figure, +form, +fieldset, +legend, +input, +textarea, +button, +p, +blockquote, +th, +td, +pre, +xmp { + margin: 0; + padding: 0; +} + +// 1. 为不继承的元素设定继承父级行高 +// 2. 为不继承的元素设定继承父级字体 +input, +textarea, +button, +select, +pre, +xmp, +tt, +code, +kbd, +samp { + line-height: inherit; + font-family: inherit; +} + +// 1. 为不继承的元素设定继承父级字号 +h1, +h2, +h3, +h4, +h5, +h6, +small, +big, +input, +textarea, +button, +select { + font-size: inherit; +} + +// 1. 重置斜体表现为正常文本 +address, +cite, +dfn, +em, +i, +optgroup, +var { + font-style: normal; +} + +// 1. 清除单元格边距并让边框合并 +table { + border-collapse: collapse; + border-spacing: 0; + table-layout: fixed; + text-align: left; +} + +// 1. 清除列表默认序号 +ul, +ol, +menu { + list-style: none; +} + +// 1. 清除默认边框 +// 2. 清除img底部留白问题,并使得默认居中 +fieldset, +img { + border: 0; + vertical-align: middle; +} + +// 1. 设置HTML5部分新增元素为块元素 +article, +aside, +details, +figcaption, +figure, +footer, +header, +main, +menu, +nav, +section, +summary { + display: block; +} + +// 1. 设置HTML5新增媒体元素与img, object保持一致 +audio, +canvas, +video { + display: inline-block; +} + +// 1. 清除引用元素的默认派生标识 +blockquote:before, +blockquote:after, +q:before, +q:after { + content: "\0020"; +} + +// 1. 设置文本域和代码块在需要时出现滚动条 +textarea, +pre, +xmp { + @include overflow; +} + +// 1. 设置文本域滚可拖动改变垂直方向尺寸 +textarea { + resize: vertical; +} + +// 1. 清除webkit下表单元素的outline +input, +textarea, +button, +select +a { + outline: 0 none; +} + +// 1. 让表单元素具有颜色继承 +// 2. iOS上当禁用时会设置opacity: .4 +input, +textarea, +button, +select { + color: inherit; + &:disabled { + opacity: 1; + } +} + +// 1. 清除Firefox按钮内部边框和补白 +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +// 1. 重置按钮的外观 +input[type="button"], +input[type="submit"], +input[type="reset"], +input[type="file"]::-webkit-file-upload-button, +input[type="search"]::-webkit-search-cancel-button { + @include appearance; +} + +// 1. 重置mark元素的默认背景色 +mark { + background-color: rgba(0, 0, 0, 0); +} + +// 1. 清除文本线条装饰 +a, +ins, +s, +u, +del { + text-decoration: none; +} + +// 1. 禁止长按链接与图片弹出菜单 +// issues: 在iOS8.1下此设置对a仍无效 +a, +img { + -webkit-touch-callout: none; +} + +// 1. 预设默认链接表现 +a { + color: map-get($base, link-color); +} + +// 1. fix Android Browser 4.2.* 及以下 input:checked ~ .xxx 失效的问题 +html + input {} + +// 1. 预设清除浮动 +.g-clear, +.g-mod { + @include clearfix; +} + +// 1. 使用字体图标 +@include yofont; diff --git a/src/lib/variables.scss b/src/lib/variables.scss new file mode 100644 index 0000000..161c982 --- /dev/null +++ b/src/lib/variables.scss @@ -0,0 +1,121 @@ +@charset "utf-8"; +/** + * 全局Variables + * 基础变量map,如果不想定义某属性,将其value设置为null + * 仅使用2种长度单位:px用于边框,rem用于除边框之外的所有地方 + * 本文件中map使用"_"开头,config中不使用"_" + * variables ⇌ config + */ + +// 基本设置 +$setting: ( + // {String} 版本号 + version: "2.1.3", + // {Boolean} 是否开启厂商前缀 + is-vendor-prefix: true, + // {String} 厂商前缀 + vendor-prefix: -webkit-, + // {String} 背景图片服务器 + bgimg-domain: "//s.qunarzz.com/yo/bgimg/", + // {Boolean} 是否允许横竖屏时文本字号自动调整 + is-text-size-adjust: true, + // {Boolean} 是否显示页面滚动条 + is-scrollbar: false +); + +// responsive media types +$media-types: ( + // {String} 横屏 + landscape: "(orientation: landscape)", + // {String} 竖屏 + portrait: "(orientation: portrait)", + // 视网膜屏定义,这里不做非常细节的界定,比如完全一致的整数倍 + // retina1x:< 1.5dppx; + // retina2x:1.5dppx ~ 2.49dppx + // retina3x:>= 2.5dppx + // {String} 非视网膜屏 + retina1x: "(max--moz-device-pixel-ratio: 1.49), + (-webkit-max-device-pixel-ratio: 1.49), + (max-device-pixel-ratio: 1.49), + (max-resolution: 143dpi), + (max-resolution: 1.49dppx)", + // {String} 视网膜屏2x + retina2x: "(min--moz-device-pixel-ratio: 1.5) and (max--moz-device-pixel-ratio: 2.49), + (-webkit-min-device-pixel-ratio: 1.5) and (-webkit-max-device-pixel-ratio: 2.49), + (min-device-pixel-ratio: 1.5) and (max-device-pixel-ratio: 2.49), + (min-resolution: 144dpi) and (max-resolution: 239dpi), + (min-resolution: 1.5dppx) and (max-resolution: 2.49dppx)", + // {String} 视网膜屏3x + retina3x: "(min--moz-device-pixel-ratio: 2.5), + (-webkit-min-device-pixel-ratio: 2.5), + (min-device-pixel-ratio: 2.5), + (min-resolution: 240dpi), + (min-resolution: 2.5dppx)", + // 待添加stop-points + // 用于常规手机横竖屏 + xs: "(max-width: 767px)", + // 用于常规pad横竖屏 + s: "(min-width: 768px) and (max-width: 1024px)", + // 用于常规笔记本 + m: "(min-width: 1025px) and (max-width: 1280px)", + // 用于常规台式机 + l: "(min-width: 1281px) and (max-width: 1440px)", + // 用于超大台式机 + xl: "(min-width: 1441px)" +); + +// ico font +$ico: ( + // {Boolean} 是否使用图标字体 + is-use: true, + // {String} 图标字体文件名 + font-name: yofont, + // {Url} 图标字体路径 + font-path: "//ss.qunarzz.com/yo/font/1.0.3/" +); + +// z-index +$z-index: ( + // {Number} 下拉菜单层级范围50-100 + dropdown: 50, + // {Number} 遮罩层级 + mask: 1000, + // {Number} 弹窗层级范围1001-1500 + dialog: 1001, + // {Number} 浮层层级范围1501-2000 + popup: 1501, + // {Number} 搜索层级范围2001-2500 + suggest: 2001, + // {Number} 搜索层级范围2501-3000 + actionsheet: 2501, + // {Number} 浮层层级范围3001-3500 + tooltip: 3001, + // {Number} loading层级 + loading: 9999 +); + +// Layout align +$align: ( + // {String} 定义弹性水平对齐方式 + justify-content: center, + // {String} 定义弹性垂直对齐方式 + align-items: center +); + +// Layout column(1) +$column: ( + // {Length} 容器高度,取值:[auto|cover] + size: auto +); + +// Layout flex +$flex: ( + // {String} 定义是水平布局还是垂直布局: row | column + direction: column +); + +// Layout Stacked +$stacked: ( + // {Length} 区块外边距 + margin: .2rem .1rem +); diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..88aa47a --- /dev/null +++ b/src/main.js @@ -0,0 +1,17 @@ +// The Vue build version to load with the `import` command +// (runtime-only or standalone) has been set in webpack.base.conf with an alias. +import Vue from 'vue' +import App from './App' +import router from './router' // ./router/index.js index.js可以省略 + +import './main.scss' +import './font/iconfont.css' +Vue.config.productionTip = false + +/* eslint-disable no-new */ +new Vue({ + el: '#app', + router, + components: { App }, + template: '' +}) diff --git a/src/main.scss b/src/main.scss new file mode 100644 index 0000000..54452fd --- /dev/null +++ b/src/main.scss @@ -0,0 +1,27 @@ +@import './lib/reset.scss'; + +html, body, .container { + @include rect(100%, 100%); //宽高100% +} +.container { + @include flexbox(); //display:flex加兼容 + @include flex-direction(column); + .box { + @include flex(); + @include rect(100%, auto); + @include flexbox(); //display:flex加兼容 + @include flex-direction(column); + .header { + @include rect(100%, 0.44rem); + } + .content{ + @include flex(); + @include rect(100%, 100%); + @include overflow(); + } + } + .footer { + @include rect(100%, 0.42rem); + + } +} \ No newline at end of file diff --git a/src/router/index.js b/src/router/index.js new file mode 100644 index 0000000..cff353c --- /dev/null +++ b/src/router/index.js @@ -0,0 +1,40 @@ +import Vue from 'vue' +import Router from 'vue-router' +// import HelloWorld from '@/components/HelloWorld' +import Kit from '@/components/Kit' +import Life from '@/components/Life' +import Vod from '@/components/Vod' +import News from '@/components/News' +import User from '@/components/User' + +Vue.use(Router) + +const routes = [ + { + path: '/kit', + component: Kit + }, + { + path: '/life', + component: Life + }, + { + path: '/vod', + component: Vod + }, + { + path: '/news', + component: News + }, + { + path: '/user', + component: User + } +] +// 路由器↑ +// 路由规则↓ +const router = new Router({ + routes: routes +}) +// 把router暴露出去 +export default router diff --git a/static/.gitkeep b/static/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/test/e2e/custom-assertions/elementCount.js b/test/e2e/custom-assertions/elementCount.js new file mode 100644 index 0000000..818e602 --- /dev/null +++ b/test/e2e/custom-assertions/elementCount.js @@ -0,0 +1,27 @@ +// A custom Nightwatch assertion. +// The assertion name is the filename. +// Example usage: +// +// browser.assert.elementCount(selector, count) +// +// For more information on custom assertions see: +// http://nightwatchjs.org/guide#writing-custom-assertions + +exports.assertion = function (selector, count) { + this.message = 'Testing if element <' + selector + '> has count: ' + count + this.expected = count + this.pass = function (val) { + return val === this.expected + } + this.value = function (res) { + return res.value + } + this.command = function (cb) { + var self = this + return this.api.execute(function (selector) { + return document.querySelectorAll(selector).length + }, [selector], function (res) { + cb.call(self, res) + }) + } +} diff --git a/test/e2e/nightwatch.conf.js b/test/e2e/nightwatch.conf.js new file mode 100644 index 0000000..f019c0a --- /dev/null +++ b/test/e2e/nightwatch.conf.js @@ -0,0 +1,46 @@ +require('babel-register') +var config = require('../../config') + +// http://nightwatchjs.org/gettingstarted#settings-file +module.exports = { + src_folders: ['test/e2e/specs'], + output_folder: 'test/e2e/reports', + custom_assertions_path: ['test/e2e/custom-assertions'], + + selenium: { + start_process: true, + server_path: require('selenium-server').path, + host: '127.0.0.1', + port: 4444, + cli_args: { + 'webdriver.chrome.driver': require('chromedriver').path + } + }, + + test_settings: { + default: { + selenium_port: 4444, + selenium_host: 'localhost', + silent: true, + globals: { + devServerURL: 'http://localhost:' + (process.env.PORT || config.dev.port) + } + }, + + chrome: { + desiredCapabilities: { + browserName: 'chrome', + javascriptEnabled: true, + acceptSslCerts: true + } + }, + + firefox: { + desiredCapabilities: { + browserName: 'firefox', + javascriptEnabled: true, + acceptSslCerts: true + } + } + } +} diff --git a/test/e2e/runner.js b/test/e2e/runner.js new file mode 100644 index 0000000..2722032 --- /dev/null +++ b/test/e2e/runner.js @@ -0,0 +1,48 @@ +// 1. start the dev server using production config +process.env.NODE_ENV = 'testing' + +const webpack = require('webpack') +const DevServer = require('webpack-dev-server') + +const webpackConfig = require('../../build/webpack.prod.conf') +const devConfigPromise = require('../../build/webpack.dev.conf') + +let server + +devConfigPromise.then(devConfig => { + const devServerOptions = devConfig.devServer + const compiler = webpack(webpackConfig) + server = new DevServer(compiler, devServerOptions) + const port = devServerOptions.port + const host = devServerOptions.host + return server.listen(port, host) +}) +.then(() => { + // 2. run the nightwatch test suite against it + // to run in additional browsers: + // 1. add an entry in test/e2e/nightwatch.conf.js under "test_settings" + // 2. add it to the --env flag below + // or override the environment flag, for example: `npm run e2e -- --env chrome,firefox` + // For more information on Nightwatch's config file, see + // http://nightwatchjs.org/guide#settings-file + let opts = process.argv.slice(2) + if (opts.indexOf('--config') === -1) { + opts = opts.concat(['--config', 'test/e2e/nightwatch.conf.js']) + } + if (opts.indexOf('--env') === -1) { + opts = opts.concat(['--env', 'chrome']) + } + + const spawn = require('cross-spawn') + const runner = spawn('./node_modules/.bin/nightwatch', opts, { stdio: 'inherit' }) + + runner.on('exit', function (code) { + server.close() + process.exit(code) + }) + + runner.on('error', function (err) { + server.close() + throw err + }) +}) diff --git a/test/e2e/specs/test.js b/test/e2e/specs/test.js new file mode 100644 index 0000000..a7b1bd9 --- /dev/null +++ b/test/e2e/specs/test.js @@ -0,0 +1,19 @@ +// For authoring Nightwatch tests, see +// http://nightwatchjs.org/guide#usage + +module.exports = { + 'default e2e tests': function (browser) { + // automatically uses dev Server port from /config.index.js + // default: http://localhost:8080 + // see nightwatch.conf.js + const devServer = browser.globals.devServerURL + + browser + .url(devServer) + .waitForElementVisible('#app', 5000) + .assert.elementPresent('.hello') + .assert.containsText('h1', 'Welcome to Your Vue.js App') + .assert.elementCount('img', 1) + .end() + } +} diff --git a/test/unit/.eslintrc b/test/unit/.eslintrc new file mode 100644 index 0000000..d6346a7 --- /dev/null +++ b/test/unit/.eslintrc @@ -0,0 +1,9 @@ +{ + "env": { + "mocha": true + }, + "globals": { + "expect": true, + "sinon": true + } +} diff --git a/test/unit/index.js b/test/unit/index.js new file mode 100644 index 0000000..c69f33f --- /dev/null +++ b/test/unit/index.js @@ -0,0 +1,13 @@ +import Vue from 'vue' + +Vue.config.productionTip = false + +// require all test files (files that ends with .spec.js) +const testsContext = require.context('./specs', true, /\.spec$/) +testsContext.keys().forEach(testsContext) + +// require all src files except main.js for coverage. +// you can also change this to match only the subset of files that +// you want coverage for. +const srcContext = require.context('../../src', true, /^\.\/(?!main(\.js)?$)/) +srcContext.keys().forEach(srcContext) diff --git a/test/unit/karma.conf.js b/test/unit/karma.conf.js new file mode 100644 index 0000000..5d3966d --- /dev/null +++ b/test/unit/karma.conf.js @@ -0,0 +1,33 @@ +// This is a karma config file. For more details see +// http://karma-runner.github.io/0.13/config/configuration-file.html +// we are also using it with karma-webpack +// https://github.com/webpack/karma-webpack + +var webpackConfig = require('../../build/webpack.test.conf') + +module.exports = function karmaConfig (config) { + config.set({ + // to run in additional browsers: + // 1. install corresponding karma launcher + // http://karma-runner.github.io/0.13/config/browsers.html + // 2. add it to the `browsers` array below. + browsers: ['PhantomJS'], + frameworks: ['mocha', 'sinon-chai', 'phantomjs-shim'], + reporters: ['spec', 'coverage'], + files: ['./index.js'], + preprocessors: { + './index.js': ['webpack', 'sourcemap'] + }, + webpack: webpackConfig, + webpackMiddleware: { + noInfo: true + }, + coverageReporter: { + dir: './coverage', + reporters: [ + { type: 'lcov', subdir: '.' }, + { type: 'text-summary' } + ] + } + }) +} diff --git a/test/unit/specs/HelloWorld.spec.js b/test/unit/specs/HelloWorld.spec.js new file mode 100644 index 0000000..bfaa225 --- /dev/null +++ b/test/unit/specs/HelloWorld.spec.js @@ -0,0 +1,11 @@ +import Vue from 'vue' +import HelloWorld from '@/components/HelloWorld' + +describe('HelloWorld.vue', () => { + it('should render correct contents', () => { + const Constructor = Vue.extend(HelloWorld) + const vm = new Constructor().$mount() + expect(vm.$el.querySelector('.hello h1').textContent) + .to.equal('Welcome to Your Vue.js App') + }) +}) -- Gitee From 4bbcd7a7c2134747b9a9fdac2885920d1a2293b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BD=98=E6=85=A7=E5=A7=97?= <1475702015@qq.com> Date: Tue, 11 Dec 2018 18:31:43 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=B3=A8=E5=86=8C=E7=99=BB=E9=99=86?= =?UTF-8?q?=E5=B7=B2=E5=AE=8C=E6=88=90=20=E6=B3=A8=E5=86=8C=E7=99=BB?= =?UTF-8?q?=E9=99=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/First.vue | 72 +++++++++ src/components/Footer.vue | 124 ++++++++-------- src/components/Kit.vue | 66 ++++----- src/components/Life.vue | 30 ++-- src/components/Login.vue | 141 ++++++++++++++++++ src/components/News.vue | 30 ++-- src/components/Prolist.vue | 80 +++++----- src/components/Register.vue | 236 ++++++++++++++++++++++++++++++ src/components/User.vue | 39 +++-- src/components/Vod.vue | 135 +++++++++++++++-- src/components/vod/Achieve.vue | 17 +++ src/components/vod/Dcim.vue | 87 +++++++++++ src/components/vod/DcimClick.vue | 49 +++++++ src/components/vod/DcimImport.vue | 90 ++++++++++++ src/components/vod/Friends.vue | 15 ++ src/components/vod/Growth.vue | 15 ++ 16 files changed, 1031 insertions(+), 195 deletions(-) create mode 100644 src/components/First.vue create mode 100644 src/components/Login.vue create mode 100644 src/components/Register.vue create mode 100644 src/components/vod/Achieve.vue create mode 100644 src/components/vod/Dcim.vue create mode 100644 src/components/vod/DcimClick.vue create mode 100644 src/components/vod/DcimImport.vue create mode 100644 src/components/vod/Friends.vue create mode 100644 src/components/vod/Growth.vue diff --git a/src/components/First.vue b/src/components/First.vue new file mode 100644 index 0000000..5e4cc9a --- /dev/null +++ b/src/components/First.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/src/components/Footer.vue b/src/components/Footer.vue index e9d5bfa..5a126c8 100644 --- a/src/components/Footer.vue +++ b/src/components/Footer.vue @@ -1,62 +1,62 @@ - - - + + + diff --git a/src/components/Kit.vue b/src/components/Kit.vue index 3d41909..9524497 100644 --- a/src/components/Kit.vue +++ b/src/components/Kit.vue @@ -1,33 +1,33 @@ - - - - - + + + + + diff --git a/src/components/Life.vue b/src/components/Life.vue index 011924b..05a4af4 100644 --- a/src/components/Life.vue +++ b/src/components/Life.vue @@ -1,15 +1,15 @@ - - - - - + + + + + diff --git a/src/components/Login.vue b/src/components/Login.vue new file mode 100644 index 0000000..3872c8d --- /dev/null +++ b/src/components/Login.vue @@ -0,0 +1,141 @@ + + + + + diff --git a/src/components/News.vue b/src/components/News.vue index 4392b47..7a75c81 100644 --- a/src/components/News.vue +++ b/src/components/News.vue @@ -1,15 +1,15 @@ - - - - - + + + + + diff --git a/src/components/Prolist.vue b/src/components/Prolist.vue index ed81dc1..7710ef9 100644 --- a/src/components/Prolist.vue +++ b/src/components/Prolist.vue @@ -1,40 +1,40 @@ - - - - - + + + + + diff --git a/src/components/Register.vue b/src/components/Register.vue new file mode 100644 index 0000000..5451651 --- /dev/null +++ b/src/components/Register.vue @@ -0,0 +1,236 @@ + + + + + diff --git a/src/components/User.vue b/src/components/User.vue index 3fdf6fc..691789e 100644 --- a/src/components/User.vue +++ b/src/components/User.vue @@ -1,15 +1,24 @@ - - - - - + + + + + diff --git a/src/components/Vod.vue b/src/components/Vod.vue index 5e86309..2c3d7a7 100644 --- a/src/components/Vod.vue +++ b/src/components/Vod.vue @@ -1,15 +1,120 @@ - - - - - + + + + + diff --git a/src/components/vod/Achieve.vue b/src/components/vod/Achieve.vue new file mode 100644 index 0000000..867fc17 --- /dev/null +++ b/src/components/vod/Achieve.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/src/components/vod/Dcim.vue b/src/components/vod/Dcim.vue new file mode 100644 index 0000000..c71c77e --- /dev/null +++ b/src/components/vod/Dcim.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/src/components/vod/DcimClick.vue b/src/components/vod/DcimClick.vue new file mode 100644 index 0000000..840a25a --- /dev/null +++ b/src/components/vod/DcimClick.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/src/components/vod/DcimImport.vue b/src/components/vod/DcimImport.vue new file mode 100644 index 0000000..515434c --- /dev/null +++ b/src/components/vod/DcimImport.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/src/components/vod/Friends.vue b/src/components/vod/Friends.vue new file mode 100644 index 0000000..5118825 --- /dev/null +++ b/src/components/vod/Friends.vue @@ -0,0 +1,15 @@ + + + + + diff --git a/src/components/vod/Growth.vue b/src/components/vod/Growth.vue new file mode 100644 index 0000000..0ea99fc --- /dev/null +++ b/src/components/vod/Growth.vue @@ -0,0 +1,15 @@ + + + + + -- Gitee From 1c4b15f558e6388ebffaf7749286f547cd203811 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BD=98=E6=85=A7=E5=A7=97?= <1475702015@qq.com> Date: Tue, 11 Dec 2018 19:44:09 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9url?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/index.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/config/index.js b/config/index.js index 6e0bcb2..990bc1e 100644 --- a/config/index.js +++ b/config/index.js @@ -11,18 +11,19 @@ module.exports = { assetsSubDirectory: 'static', assetsPublicPath: '/', proxyTable: { //代理服务器 - '/pan': { - target: 'https://www.daxunxun.com/', + '/sgj': { + target: 'http://10.8.156.61:8000', + // target: 'https://www.daxunxun.com/', changeOrigin: true, pathRewrite: { - '^/pan': '' + '^/sgj': '' } } }, // Various Dev Server settings - host: 'localhost', // can be overwritten by process.env.HOST + host: '0.0.0.0', // can be overwritten by process.env.HOST port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined autoOpenBrowser: false, errorOverlay: true, -- Gitee From c3b229aacf0e8dc716fa277b9d09917274b85502 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BD=98=E6=85=A7=E5=A7=97?= <1475702015@qq.com> Date: Tue, 11 Dec 2018 19:45:57 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9main=E7=9A=84=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.scss | 54 ++++++++++++++++++++++++++------------------------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/src/main.scss b/src/main.scss index 54452fd..02eb3fd 100644 --- a/src/main.scss +++ b/src/main.scss @@ -1,27 +1,29 @@ -@import './lib/reset.scss'; - -html, body, .container { - @include rect(100%, 100%); //宽高100% -} -.container { - @include flexbox(); //display:flex加兼容 - @include flex-direction(column); - .box { - @include flex(); - @include rect(100%, auto); - @include flexbox(); //display:flex加兼容 - @include flex-direction(column); - .header { - @include rect(100%, 0.44rem); - } - .content{ - @include flex(); - @include rect(100%, 100%); - @include overflow(); - } - } - .footer { - @include rect(100%, 0.42rem); - - } +@import './lib/reset.scss'; + +html, body, .container { + @include rect(100%, 100%); //宽高100% +} +.container { + @include flexbox(); //display:flex加兼容 + @include flex-direction(column); + .box { + @include flex(); + @include rect(100%, auto); + @include flexbox(); //display:flex加兼容 + @include flex-direction(column); + .header { + @include rect(100%, 0.44rem); + @include background-color(#ff464e); + } + .content{ + @include flex(); + @include rect(100%, 100%); + @include overflow(); + @include background-color(#fff); + } + } + .footer { + @include rect(100%, 0.42rem); + + } } \ No newline at end of file -- Gitee From 0ddc25b6fc144ee578ea113dffc2adba6ceaae3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BD=98=E6=85=A7=E5=A7=97?= <1475702015@qq.com> Date: Tue, 11 Dec 2018 19:46:42 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E7=99=BB=E9=99=86=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Login.vue | 19 ++++++++++++------- src/components/Register.vue | 29 +++++++++++++++++------------ 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/components/Login.vue b/src/components/Login.vue index 3872c8d..a47959e 100644 --- a/src/components/Login.vue +++ b/src/components/Login.vue @@ -5,10 +5,10 @@ 时光记 注册 - -
+
+
@@ -43,7 +43,7 @@ export default { }, methods: { login () { - axios.post('/pan/login/', { + axios.post('/sgj/login/', { username: this.username, password: this.password }).then(data => { @@ -54,7 +54,7 @@ export default { Toast('登陆成功') localStorage.setItem('username', this.username) localStorage.setItem('isLogin', 'ok') - this.$router.push('/') + this.$router.push('/vod') } else { Toast('登陆失败') } @@ -66,9 +66,9 @@ export default {