├── static ├── .gitkeep └── music │ ├── red-01.mp3 │ ├── red-02.mp3 │ └── refresh.mp3 ├── src ├── components │ ├── v-input │ │ ├── index.vue │ │ └── currency.vue │ ├── v-svg │ │ └── index.vue │ ├── item │ │ └── item.vue │ ├── v-list │ │ ├── follow.vue │ │ ├── novelty.vue │ │ └── copy.vue │ ├── p-jsdk │ │ └── index.vue │ ├── popup │ │ ├── dialog.vue │ │ ├── popup.vue │ │ └── alert.vue │ ├── heads │ │ └── index.vue │ ├── button │ │ └── button.vue │ ├── v-dialog │ │ └── index.vue │ ├── alert │ │ └── index.vue │ └── vote │ │ └── voteItem.vue ├── assets │ ├── img │ │ ├── png.png │ │ ├── error.png │ │ ├── loading.png │ │ └── Dashboard.png │ ├── fonts │ │ ├── iconfont.eot │ │ ├── iconfont.ttf │ │ ├── iconfont.woff │ │ └── iconfont.svg │ ├── music │ │ └── refresh.mp3 │ ├── README.md │ └── scss │ │ ├── mobilewap.scss │ │ ├── media.scss │ │ ├── fonts.scss │ │ ├── App.scss │ │ ├── transition.scss │ │ ├── mixin.scss │ │ ├── clearsrollbar.scss │ │ ├── mreset.scss │ │ ├── index.scss │ │ └── animation.scss ├── vuexs │ ├── modules │ │ ├── index.js │ │ ├── state.js │ │ ├── navmenu.js │ │ ├── header.js │ │ └── api.js │ ├── store.js │ └── mutation-types.js ├── views │ ├── 404 │ │ └── 404.vue │ └── index │ │ └── index.vue ├── main.js ├── routers │ └── index.js ├── apis │ └── index.js ├── utils │ ├── common.js │ ├── flexible.js │ ├── tool.js │ └── navbar.js └── App.vue ├── .eslintignore ├── config ├── prod.env.js ├── dev.env.js └── index.js ├── favicon.ico ├── .gitignore ├── README.md ├── .editorconfig ├── .postcssrc.js ├── .babelrc ├── .eslintrc.js ├── package.json └── index.html /static/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/v-input/index.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | build/*.js 2 | config/*.js 3 | -------------------------------------------------------------------------------- /config/prod.env.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | NODE_ENV: '"production"' 3 | } 4 | -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luuman/FrontEndGuideV2/HEAD/favicon.ico -------------------------------------------------------------------------------- /src/assets/img/png.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luuman/FrontEndGuideV2/HEAD/src/assets/img/png.png -------------------------------------------------------------------------------- /src/assets/img/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luuman/FrontEndGuideV2/HEAD/src/assets/img/error.png -------------------------------------------------------------------------------- /static/music/red-01.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luuman/FrontEndGuideV2/HEAD/static/music/red-01.mp3 -------------------------------------------------------------------------------- /static/music/red-02.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luuman/FrontEndGuideV2/HEAD/static/music/red-02.mp3 -------------------------------------------------------------------------------- /static/music/refresh.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luuman/FrontEndGuideV2/HEAD/static/music/refresh.mp3 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | -------------------------------------------------------------------------------- /src/assets/img/loading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luuman/FrontEndGuideV2/HEAD/src/assets/img/loading.png -------------------------------------------------------------------------------- /src/assets/fonts/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luuman/FrontEndGuideV2/HEAD/src/assets/fonts/iconfont.eot -------------------------------------------------------------------------------- /src/assets/fonts/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luuman/FrontEndGuideV2/HEAD/src/assets/fonts/iconfont.ttf -------------------------------------------------------------------------------- /src/assets/fonts/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luuman/FrontEndGuideV2/HEAD/src/assets/fonts/iconfont.woff -------------------------------------------------------------------------------- /src/assets/img/Dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luuman/FrontEndGuideV2/HEAD/src/assets/img/Dashboard.png -------------------------------------------------------------------------------- /src/assets/music/refresh.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luuman/FrontEndGuideV2/HEAD/src/assets/music/refresh.mp3 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | - []( "") 2 | - [腾讯AlloyTeam](http://www.alloyteam.com/nav/ "") 3 | - []( "") 4 | - []( "") 5 | - []( "") 6 | - []( "") 7 | - []( "") 8 | - []( "") 9 | - []( "") -------------------------------------------------------------------------------- /config/dev.env.js: -------------------------------------------------------------------------------- 1 | var merge = require('webpack-merge') 2 | var prodEnv = require('./prod.env') 3 | 4 | module.exports = merge(prodEnv, { 5 | NODE_ENV: '"development"' 6 | }) 7 | -------------------------------------------------------------------------------- /src/vuexs/modules/index.js: -------------------------------------------------------------------------------- 1 | import header from './header' 2 | import navMenu from './navmenu' 3 | import api from './api' 4 | 5 | export default { 6 | header, navMenu, api 7 | } 8 | -------------------------------------------------------------------------------- /src/vuexs/store.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | import modules from './modules' 4 | 5 | Vue.use(Vuex) 6 | 7 | export default new Vuex.Store({ 8 | modules 9 | }) 10 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | // to edit target browsers: use "browserlist" field in package.json 6 | "autoprefixer": {} 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { "modules": false }], 4 | "stage-2" 5 | ], 6 | "plugins": ["transform-runtime"], 7 | "comments": false, 8 | "env": { 9 | "test": { 10 | "presets": ["env", "stage-2"], 11 | "plugins": [ "istanbul" ] 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/assets/README.md: -------------------------------------------------------------------------------- 1 | 放置需要经由 Webpack 处理的文件 2 | e.g. img css font 等 3 | 4 | ## rem大小 5 | size(width) 6 | 7 | ## font-size 8 | @include font-size(14px); 9 | 10 | ## 自定义dpr 11 | @include data-dpr(line-height, 14px); 12 | 13 | ## 全局配色 14 | color: $bg-c-1; 15 | 16 | ## 背景 17 | @include BgUrl('/assets/img/logo.png'); -------------------------------------------------------------------------------- /src/assets/scss/mobilewap.scss: -------------------------------------------------------------------------------- 1 | @media screen and (min-width:1280px){ 2 | // html { 3 | // background-repeat: no-repeat; 4 | // background-size: 351px; 5 | // margin: -8px auto; 6 | // width: 540px; 7 | // height: 100%; 8 | // overflow: hidden; 9 | // } 10 | // body{ 11 | // overflow: overlay; 12 | // } 13 | } -------------------------------------------------------------------------------- /src/vuexs/modules/state.js: -------------------------------------------------------------------------------- 1 | // import api from 'API' 2 | // import * as types from 'VUEX/mutation-types' 3 | 4 | const state = { 5 | } 6 | 7 | const getters = { 8 | } 9 | 10 | const actions = { 11 | } 12 | 13 | const mutations = { 14 | } 15 | 16 | export default { 17 | state, 18 | getters, 19 | actions, 20 | mutations 21 | } 22 | -------------------------------------------------------------------------------- /src/components/v-svg/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 13 | 14 | 15 | 18 | -------------------------------------------------------------------------------- /src/components/item/item.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 13 | 14 | 23 | -------------------------------------------------------------------------------- /src/views/404/404.vue: -------------------------------------------------------------------------------- 1 | 6 | 8 | 9 | 10 | 27 | -------------------------------------------------------------------------------- /src/assets/scss/media.scss: -------------------------------------------------------------------------------- 1 | /* media */ 2 | /* 横屏 */ 3 | @media screen and (orientation:landscape){ 4 | 5 | } 6 | /* 竖屏 */ 7 | @media screen and (orientation:portrait){ 8 | 9 | } 10 | /* 窗口宽度<960,设计宽度=768 */ 11 | @media screen and (max-width:959px){ 12 | 13 | } 14 | /* 窗口宽度<768,设计宽度=640 */ 15 | @media screen and (max-width:767px){ 16 | 17 | } 18 | /* 窗口宽度<640,设计宽度=480 */ 19 | @media screen and (max-width:639px){ 20 | 21 | } 22 | /* 窗口宽度<480,设计宽度=320 */ 23 | @media screen and (max-width:479px){ 24 | 25 | } 26 | /* windows UI 贴靠 */ 27 | @media screen and (-ms-view-state:snapped){ 28 | 29 | } 30 | /* 打印 */ 31 | @media print{ 32 | 33 | } -------------------------------------------------------------------------------- /src/assets/scss/fonts.scss: -------------------------------------------------------------------------------- 1 | @font-face{ 2 | font-family: 'iconfont'; 3 | src: url('//at.alicdn.com/t/font_euw9ajb9yazqto6r.eot'); 4 | src: url('//at.alicdn.com/t/font_euw9ajb9yazqto6r.eot?#iefix') format('embedded-opentype'), 5 | url('//at.alicdn.com/t/font_euw9ajb9yazqto6r.woff') format('woff'), 6 | url('//at.alicdn.com/t/font_euw9ajb9yazqto6r.ttf') format('truetype'), 7 | url('//at.alicdn.com/t/font_euw9ajb9yazqto6r.svg#iconfont') format('svg'); 8 | } 9 | .iconfont{ 10 | font-family: 'iconfont' !important; 11 | @include font-size(16px); 12 | font-style: normal; 13 | -webkit-font-smoothing: antialiased; 14 | -webkit-text-stroke-width: .2px; 15 | -moz-osx-font-smoothing: grayscale; 16 | } -------------------------------------------------------------------------------- /src/assets/scss/App.scss: -------------------------------------------------------------------------------- 1 | @charset"utf-8"; 2 | @import "public/MobileReset.scss"; 3 | @import "public/FlexibleSassMethod.scss"; 4 | @import "public/MobileSrollbar.scss"; 5 | @import "public/Fonts.scss"; 6 | // @import "public/MobileWap.scss"; 7 | 8 | // size 375px size(width px) 9 | @function size($size) { 10 | $width: 375; 11 | $scale: 10; 12 | @return ($size / $width * $scale) * 1rem; 13 | } 14 | $bg-c-1: #FFF; 15 | $bg-c-2: #200c41; 16 | $bg-c-3: #cc9729; 17 | $bg-c-4: #8dd9db; 18 | $bg-c-5: #33d0bf; 19 | $font-c-1: #494949; 20 | $font-c-2: #a0a0a0; 21 | $font-c-3: #b2b2b2; 22 | $font-c-4: #33d0bf; 23 | $main-color: #91D4DA; 24 | $border-color: rgba(0,0,0,0.16); 25 | $border: size(2) solid $border-color; 26 | html{width: 100%;height: 100%;} 27 | 28 | 29 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | // http://eslint.org/docs/user-guide/configuring 2 | 3 | module.exports = { 4 | root: true, 5 | parser: 'babel-eslint', 6 | parserOptions: { 7 | sourceType: 'module' 8 | }, 9 | env: { 10 | browser: true, 11 | }, 12 | // https://github.com/feross/standard/blob/master/RULES.md#javascript-standard-style 13 | extends: 'standard', 14 | // required to lint *.vue files 15 | plugins: [ 16 | 'html' 17 | ], 18 | // add your custom rules here 19 | 'rules': { 20 | // allow paren-less arrow functions 21 | 'arrow-parens': 0, 22 | // allow async-await 23 | 'generator-star-spacing': 0, 24 | // allow debugger during development 25 | 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/assets/scss/transition.scss: -------------------------------------------------------------------------------- 1 | .vue-fade-enter-active,.vue-fade-leave-active { 2 | opacity: 1; 3 | transition: opacity linear 0.2s 4 | } 5 | .vue-fade-enter, .vue-fade-leave-to { 6 | opacity: 0; 7 | } 8 | 9 | .vue-dialog-enter-active,.vue-dialog-leave-active { 10 | opacity: 1; 11 | transition-duration: 400ms; 12 | transform: translate(-50%, -50%) scale(1)!important; 13 | transition-property: transform, opacity!important; 14 | } 15 | .vue-dialog-enter, .vue-dialog-leave-active { 16 | opacity: 0; 17 | transform: translate(-50%, -50%) scale(1.185)!important; 18 | } 19 | 20 | .vue-mask-enter, .vue-mask-leave-active { 21 | opacity: 0; 22 | } 23 | .vue-mask-leave-active, .vue-mask-enter-active { 24 | transition: opacity 300ms; 25 | } 26 | 27 | .router-slid-enter-active, .router-slid-leave-active { 28 | transition: all .4s; 29 | } 30 | .router-slid-enter, .router-slid-leave-active { 31 | transform: translate3d(2rem, 0, 0); 32 | opacity: 0; 33 | } -------------------------------------------------------------------------------- /src/vuexs/modules/navmenu.js: -------------------------------------------------------------------------------- 1 | // import api from 'API' 2 | import * as types from 'VUEX/mutation-types' 3 | 4 | const state = { 5 | full: false, 6 | open: false 7 | } 8 | 9 | const getters = { 10 | getOpenState: state => state.open, 11 | getFullState: state => state.full 12 | } 13 | 14 | const actions = { 15 | fullNavMenu ({ commit }) { 16 | commit('FULL_NAV_MENU') 17 | }, 18 | openNavMenu ({ commit }) { 19 | commit('OPEN_NAV_MENU') 20 | }, 21 | closeNavMenu ({ commit }) { 22 | commit('CLOSE_NAV_MENU') 23 | }, 24 | toggleNavMenu ({ commit }) { 25 | commit('TOGGLE_NAV_MENU') 26 | } 27 | } 28 | 29 | const mutations = { 30 | [types.FULL_NAV_MENU] (state) { 31 | state.full = true 32 | }, 33 | [types.OPEN_NAV_MENU] (state) { 34 | state.full = false 35 | state.open = true 36 | }, 37 | [types.CLOSE_NAV_MENU] (state) { 38 | state.full = false 39 | state.open = false 40 | }, 41 | [types.TOGGLE_NAV_MENU] (state) { 42 | state.open = !state.open 43 | } 44 | } 45 | 46 | export default { 47 | state, 48 | getters, 49 | actions, 50 | mutations 51 | } 52 | -------------------------------------------------------------------------------- /src/vuexs/modules/header.js: -------------------------------------------------------------------------------- 1 | // import api from 'API' 2 | import * as types from 'VUEX/mutation-types' 3 | 4 | const state = { 5 | showLoading: false, 6 | doneLoading: false, 7 | loadFailed: false 8 | } 9 | 10 | const getters = { 11 | getHeaderState: state => state 12 | } 13 | 14 | const actions = { 15 | triggerLoadAnimation ({ commit }) { 16 | commit(types.TRIGGER_LOAD_ANIMATION) 17 | }, 18 | triggerLoadAnimationDone ({ commit }) { 19 | commit(types.TRIGGER_LOAD_ANIMATION_DONE) 20 | setTimeout(() => { 21 | commit(types.HIDE_LOAD_ANIMATION) 22 | }, 600) 23 | }, 24 | requestFailed ({ commit }) { 25 | commit('REQUEST_FAILED') 26 | } 27 | } 28 | 29 | const mutations = { 30 | [types.TRIGGER_LOAD_ANIMATION] (state) { 31 | state.showLoading = !state.loadFailed 32 | }, 33 | [types.TRIGGER_LOAD_ANIMATION_DONE] (state) { 34 | state.loadFailed = false 35 | state.doneLoading = true 36 | }, 37 | [types.HIDE_LOAD_ANIMATION] (state) { 38 | state.showLoading = false 39 | state.loadFailed = false 40 | state.doneLoading = false 41 | }, 42 | [types.REQUEST_FAILED] (state) { 43 | state.loadFailed = true 44 | } 45 | } 46 | 47 | export default { 48 | state, 49 | getters, 50 | actions, 51 | mutations 52 | } 53 | -------------------------------------------------------------------------------- /src/vuexs/mutation-types.js: -------------------------------------------------------------------------------- 1 | // 公共 2 | export const COM_NAV_STATUS = 'COM_NAV_STATUS' 3 | export const COM_HEADER_STATUS = 'COM_HEADER_STATUS' 4 | export const COM_LOADING_STATUS = 'COM_LOADING_STATUS' 5 | // 显示toast 6 | export const COM_SHOW_TOAST = 'COM_SHOW_TOAST' 7 | // 显示成功toast 8 | export const COM_SHOW_SUCCESS = 'COM_SHOW_SUCCESS' 9 | // 显示失败toast 10 | export const COM_SHOW_FAIL = 'COM_SHOW_FAIL' 11 | // 显示toast文字 12 | export const COM_TOAST_MSG = 'COM_TOAST_MSG' 13 | export const COM_SHOW_ALERT = 'COM_SHOW_ALERT' 14 | export const COM_ALERT_MSG = 'COM_ALERT_MSG' 15 | // 显示timepicker 16 | export const COM_SHOW_TIME_PICKER = 'COM_SHOW_TIME_PICKER' 17 | 18 | // nav menu 19 | export const FULL_NAV_MENU = 'FULL_NAV_MENU' 20 | export const OPEN_NAV_MENU = 'OPEN_NAV_MENU' 21 | export const CLOSE_NAV_MENU = 'CLOSE_NAV_MENU' 22 | export const TOGGLE_NAV_MENU = 'TOGGLE_NAV_MENU' 23 | 24 | // load 25 | export const TRIGGER_LOAD_ANIMATION = 'TRIGGER_LOAD_ANIMATION' 26 | export const TRIGGER_LOAD_ANIMATION_DONE = 'TRIGGER_LOAD_ANIMATION_DONE' 27 | export const HIDE_LOAD_ANIMATION = 'HIDE_LOAD_ANIMATION' 28 | export const REQUEST_FAILED = 'REQUEST_FAILED' 29 | 30 | export const GET_TRAVELS_LIST = 'GET_TRAVELS_LIST' 31 | export const GET_TRAVELS_SEARCH_KEY = 'GET_TRAVELS_SEARCH_KEY' 32 | export const GET_TRAVELS_SCORLL_STATUS = 'GET_TRAVELS_SCORLL_STATUS' 33 | export const GET_TRAVELS_PAGE_NUM = 'GET_TRAVELS_PAGE_NUM' 34 | -------------------------------------------------------------------------------- /src/assets/scss/mixin.scss: -------------------------------------------------------------------------------- 1 | // size 375px size(width px) 2 | @function size($size) { 3 | $width: 375; 4 | $scale: 10; 5 | @return ($size / $width * $scale) * 1rem; 6 | } 7 | $icon: #586069; 8 | $icon-on: #200c41; 9 | $top: #202b33; 10 | // $bgi: linear-gradient(90deg, #121c29 0%, #102848 100%); 11 | $bgi: #121c29; 12 | $bgc: #121c29; 13 | // $bg2: rgba(32, 43, 51, 0.4); 14 | // $bg3: #202b33; 15 | $bg2: #16222f; 16 | // $bg2: rgba(22, 34, 47, 0.5); 17 | $bg3: #1e2b3a; 18 | $bgt1: #1a293a; 19 | $nav: #252d47; 20 | $btn: #7e848b; 21 | $btna: #28e4d8; 22 | $font1: #d1d4d7; 23 | $font2: #a2a7ad; 24 | $shadow1: 0 26px 40px -24px rgba(0, 0, 0, 0.3); 25 | // $bg1: #f5f8fa; 26 | // $bg2: #e7ebed; 27 | // $bg3: #FFF; 28 | // $font1: #4d4d4d; 29 | // $font2: #a0a0a0; 30 | $font-c-3: #b2b2b2; 31 | $font-c-4: #33d0bf; 32 | $main-color: #91D4DA; 33 | $border-color: rgba(0,0,0,0.16); 34 | $border: size(2) solid $border-color; 35 | //宽高 36 | @mixin wh($width, $height){ 37 | width: $width; 38 | height: $height; 39 | } 40 | // dpr自定义样式 41 | @mixin data-dpr($field, $val) { 42 | #{$field}: $val; 43 | [data-dpr="2"] & { 44 | #{$field}: $val * 2; 45 | } 46 | [data-dpr="3"] & { 47 | #{$field}: $val * 3; 48 | } 49 | } 50 | 51 | // 字体大小 52 | @mixin font-size($size){ 53 | font-size: $size; 54 | [data-dpr="2"] & { 55 | font-size: $size * 2; 56 | } 57 | [data-dpr="3"] & { 58 | font-size: $size * 3; 59 | } 60 | } 61 | // 背景图片地址和大小 62 | @mixin BgUrl($url) { 63 | background-image: url($url); 64 | background-repeat: no-repeat; 65 | background-size: 100% 100%; 66 | } -------------------------------------------------------------------------------- /src/assets/scss/clearsrollbar.scss: -------------------------------------------------------------------------------- 1 | ::-webkit-scrollbar { 2 | width:4px; 3 | height:4px 4 | } 5 | ::-webkit-scrollbar-button { 6 | width:0; 7 | height:0 8 | } 9 | ::-webkit-scrollbar-button:end:decrement, ::-webkit-scrollbar-button:start:increment { 10 | display:none 11 | } 12 | ::-webkit-scrollbar-corner { 13 | display:block 14 | } 15 | ::-webkit-scrollbar-thumb { 16 | border-radius:8px; 17 | background-color:rgba(0, 0, 0, .2) 18 | } 19 | ::-webkit-scrollbar-thumb:hover { 20 | border-radius:8px; 21 | background-color:rgba(0, 0, 0, .5) 22 | } 23 | ::-webkit-scrollbar-thumb, ::-webkit-scrollbar-track { 24 | border-right:1px solid transparent; 25 | border-left:1px solid transparent 26 | } 27 | ::-webkit-scrollbar-track:hover { 28 | background-color:rgba(0, 0, 0, .15) 29 | } 30 | ::-webkit-scrollbar-button:start { 31 | width:4px; 32 | height:4px; 33 | // background:url(../img/scrollbar_arrow.png) no-repeat 0 0 34 | } 35 | ::-webkit-scrollbar-button:start:hover { 36 | // background:url(../img/scrollbar_arrow.png) no-repeat -15px 0 37 | } 38 | ::-webkit-scrollbar-button:start:active { 39 | // background:url(../img/scrollbar_arrow.png) no-repeat -30px 0 40 | } 41 | ::-webkit-scrollbar-button:end { 42 | width:4px; 43 | height:4px; 44 | // background:url(../img/scrollbar_arrow.png) no-repeat 0 -18px 45 | } 46 | ::-webkit-scrollbar-button:end:hover { 47 | // background:url(../img/scrollbar_arrow.png) no-repeat -15px -18px 48 | } 49 | ::-webkit-scrollbar-button:end:active { 50 | // background:url(../img/scrollbar_arrow.png) no-repeat -30px -18px 51 | } -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | // The Vue build version to load with the `import` command 2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias. 3 | require('!!script-loader!ASSET/fonts/iconfont') 4 | import Vue from 'vue' 5 | import App from './app' 6 | import router from './routers' 7 | // import 'UTIL/flexible' 8 | // import Alert from 'COMPONENT/alert' 9 | // Vue.component('my-alert', Alert) 10 | 11 | import SVG from 'COMPONENT/v-svg' 12 | Vue.component('v-svg', SVG) 13 | 14 | // console.time('执行时间') 15 | // console.timeEnd('执行时间') 16 | 17 | import VueLazyload from 'vue-lazyload' 18 | // import loading from 'ASSET/img/loading.png' 19 | // import error from 'ASSET/img/error.png' 20 | Vue.use(VueLazyload, { 21 | preLoad: 1.3, 22 | error: 'https://luuman.github.io/apple-touch-icon.png', 23 | loading: 'https://luuman.github.io/apple-touch-icon.png', 24 | // listenEvents: ['scroll', 'wheel', 'mousewheel', 'resize', 'animationend', 'transitionend'], 25 | attempt: 1 26 | }) 27 | 28 | // import VueScroller from 'vue-scroller' 29 | // Vue.use(VueScroller) 30 | 31 | // import vueTap from 'v-tap' 32 | // Vue.use(vueTap) 33 | 34 | // import Alert from 'vue-alerts' 35 | // Vue.use(Alert) 36 | 37 | // import progressive from 'progressive-image/dist/vue' 38 | // Vue.use(progressive, { 39 | // removePreview: true 40 | // }) 41 | // Vue.config.productionTip = false 42 | 43 | // import store from 'VUEX/store' 44 | 45 | /* eslint-disable no-new */ 46 | new Vue({ 47 | el: '#app', 48 | router, 49 | // store, 50 | template: '', 51 | components: { 52 | // Alert, 53 | App 54 | } 55 | }) 56 | -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | // see http://vuejs-templates.github.io/webpack for documentation. 2 | var path = require('path') 3 | 4 | module.exports = { 5 | build: { 6 | env: require('./prod.env'), 7 | index: path.resolve(__dirname, '../dist/index.html'), 8 | assetsRoot: path.resolve(__dirname, '../dist'), 9 | assetsSubDirectory: 'static', 10 | // assetsPublicPath: '/', 11 | assetsPublicPath: '', 12 | productionSourceMap: true, 13 | // Gzip off by default as many popular static hosts such as 14 | // Surge or Netlify already gzip all static assets for you. 15 | // Before setting to `true`, make sure to: 16 | // npm install --save-dev compression-webpack-plugin 17 | productionGzip: false, 18 | productionGzipExtensions: ['js', 'css'], 19 | // Run the build command with an extra argument to 20 | // View the bundle analyzer report after build finishes: 21 | // `npm run build --report` 22 | // Set to `true` or `false` to always turn it on or off 23 | bundleAnalyzerReport: process.env.npm_config_report 24 | }, 25 | dev: { 26 | env: require('./dev.env'), 27 | port: 5680, 28 | autoOpenBrowser: true, 29 | assetsSubDirectory: 'static', 30 | assetsPublicPath: '/', 31 | proxyTable: { 32 | // '/users': { 33 | // target: 'https://api.github.com', 34 | // changeOrigin: true, 35 | // pathRewrite: { 36 | // '^/users': '/users' 37 | // } 38 | // } 39 | }, 40 | // CSS Sourcemaps off by default because relative paths are "buggy" 41 | // with this option, according to the CSS-Loader README 42 | // (https://github.com/webpack/css-loader#sourcemaps) 43 | // In our experience, they generally work as expected, 44 | // just be aware of this issue when enabling this option. 45 | cssSourceMap: false 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/assets/scss/mreset.scss: -------------------------------------------------------------------------------- 1 | @import "mixin.scss"; 2 | @import 'clearsrollbar.scss'; 3 | @import 'mobilewap.scss'; 4 | @import 'transition.scss'; 5 | html { 6 | width: 100%; 7 | height: 100%; 8 | overflow-y: scroll; 9 | overflow-x: hidden; 10 | } 11 | html, body { 12 | font-family: PingFangSC-Regular, "Helvetica Neue", "Microsoft Yahei", 微软雅黑; 13 | // font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; 14 | } 15 | body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, textarea, p, blockquote, th, td, hr, button, article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { 16 | margin:0; 17 | padding:0; 18 | } 19 | input, select, textarea { 20 | font-size:100%; 21 | } 22 | table { 23 | border-collapse:collapse; 24 | border-spacing:0; 25 | } 26 | fieldset, img { 27 | border:0; 28 | } 29 | abbr, acronym { 30 | border:0; 31 | font-variant:normal; 32 | } 33 | del { 34 | text-decoration:line-through; 35 | } 36 | address, caption, cite, code, dfn, em, th, var { 37 | font-style:normal; 38 | font-weight:500; 39 | } 40 | ol, ul { 41 | list-style:none; 42 | } 43 | caption, th { 44 | text-align:left; 45 | } 46 | h1, h2, h3, h4, h5, h6 { 47 | font-size:100%; 48 | font-weight:500; 49 | } 50 | q:before, q:after { 51 | content:''; 52 | } 53 | sub, sup { 54 | font-size:75%; 55 | line-height:0; 56 | position:relative; 57 | vertical-align:baseline; 58 | } 59 | sup { 60 | top:-.5em; 61 | } 62 | sub { 63 | bottom:-.25em; 64 | } 65 | a:hover { 66 | text-decoration:none; 67 | } 68 | ins, a { 69 | text-decoration:none; 70 | } 71 | .fl{ 72 | float: left; 73 | } 74 | .fr{ 75 | float: right; 76 | } 77 | .img{ 78 | width: 100%; 79 | vertical-align: bottom; 80 | } 81 | img{ 82 | max-width: 100%; 83 | } 84 | html,body{ 85 | width: 100%; 86 | color: $font1; 87 | background-image: $bgi; 88 | background-color: $bgc; 89 | } 90 | .paper{ 91 | img{ 92 | width: 100%; 93 | vertical-align: bottom; 94 | } 95 | } 96 | 97 | -------------------------------------------------------------------------------- /src/components/v-list/follow.vue: -------------------------------------------------------------------------------- 1 | 9 | 49 | 50 | 51 | 80 | -------------------------------------------------------------------------------- /src/components/v-input/currency.vue: -------------------------------------------------------------------------------- 1 | 12 | 56 | 57 | 58 | 61 | -------------------------------------------------------------------------------- /src/components/v-list/novelty.vue: -------------------------------------------------------------------------------- 1 | 17 | 43 | 44 | 45 | 84 | -------------------------------------------------------------------------------- /src/vuexs/modules/api.js: -------------------------------------------------------------------------------- 1 | import * as types from 'VUEX/mutation-types' 2 | 3 | const state = { 4 | loading: false, 5 | showToast: false, 6 | leftNavStatus: false, 7 | showSuccess: true, 8 | showFail: false, 9 | toastMsg: '操作成功', 10 | showTimePicker: false, 11 | alertMsg: '退出登录', 12 | showAlert: false 13 | } 14 | 15 | const actions = { 16 | setLoadingState ({ commit }, status) { 17 | commit(types.COM_LOADING_STATUS, status) 18 | }, 19 | setNavState ({ commit }, status) { 20 | commit(types.COM_NAV_STATUS, status) 21 | }, 22 | showToast ({ commit }, status) { 23 | commit(types.COM_SHOW_TOAST, status) 24 | }, 25 | showSuccess ({ commit }, status) { 26 | commit(types.COM_SHOW_SUCCESS, status) 27 | }, 28 | showFail ({ commit }, status) { 29 | commit(types.COM_SHOW_FAIL, status) 30 | }, 31 | toastMsg ({ commit }, str) { 32 | commit(types.COM_TOAST_MSG, str) 33 | }, 34 | showAlert ({ commit }, status) { 35 | commit(types.COM_SHOW_ALERT, status) 36 | }, 37 | alertMsg ({ commit }, str) { 38 | commit(types.COM_ALERT_MSG, str) 39 | }, 40 | showTimePicker ({ commit }, status) { 41 | commit(types.COM_SHOW_TIME_PICKER, status) 42 | } 43 | } 44 | 45 | const getters = { 46 | loading: state => state.loading, 47 | showToast: state => state.showToast, 48 | showAlert: state => state.showAlert 49 | } 50 | 51 | const mutations = { 52 | [types.COM_LOADING_STATUS] (state, status) { 53 | state.loading = status 54 | }, 55 | 56 | [types.COM_SHOW_TOAST] (state, status) { 57 | state.showToast = status 58 | }, 59 | 60 | [types.COM_SHOW_SUCCESS] (state, status) { 61 | state.showSuccess = status 62 | }, 63 | 64 | [types.COM_SHOW_FAIL] (state, status) { 65 | state.showFail = status 66 | }, 67 | 68 | [types.COM_TOAST_MSG] (state, str) { 69 | state.toastMsg = str 70 | }, 71 | 72 | [types.COM_NAV_STATUS] (state, status) { 73 | state.leftNavStatus = status 74 | }, 75 | 76 | [types.COM_SHOW_TIME_PICKER] (state, status) { 77 | state.showTimePicker = status 78 | }, 79 | 80 | [types.COM_SHOW_ALERT] (state, status) { 81 | state.showAlert = status 82 | }, 83 | [types.COM_ALERT_MSG] (state, str) { 84 | state.alertMsg = str 85 | } 86 | } 87 | 88 | export default { 89 | state, 90 | actions, 91 | getters, 92 | mutations 93 | } 94 | -------------------------------------------------------------------------------- /src/components/p-jsdk/index.vue: -------------------------------------------------------------------------------- 1 | 3 | 74 | 75 | 76 | 79 | -------------------------------------------------------------------------------- /src/components/popup/dialog.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 47 | 48 | 49 | 88 | -------------------------------------------------------------------------------- /src/components/heads/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 51 | 52 | 53 | 80 | -------------------------------------------------------------------------------- /src/routers/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | import Index from 'VIEW/index' 4 | // import UserPage from 'VIEW/user/userpage' 5 | // import RepoList from 'VIEW/user/repos' 6 | // import RepoDetail from 'VIEW/user/detail' 7 | // import Github from 'VIEW/Index/github' 8 | // import Novelty from 'VIEW/github/novelty' 9 | // import Repos from 'VIEW/github/repos' 10 | // import Owner from 'VIEW/github/owner' 11 | // import Follow from 'VIEW/github/follow' 12 | import Error from 'VIEW/404/404' 13 | 14 | Vue.use(Router) 15 | 16 | export default new Router({ 17 | // mode: 'history', 18 | linkActiveClass: 'active', 19 | routes: [ 20 | { 21 | path: '/', 22 | redirect: '/Index' 23 | // redirect: '/User' 24 | }, 25 | { 26 | path: '/Index', 27 | name: 'Index', 28 | component: Index 29 | }, 30 | // { 31 | // path: '/Github', 32 | // name: 'Github', 33 | // component: Github, 34 | // children: [ 35 | // { 36 | // path: 'Novelty', 37 | // name: 'Novelty', 38 | // component: Novelty 39 | // }, 40 | // { 41 | // path: 'Repos', 42 | // name: 'Repos', 43 | // component: Repos 44 | // }, 45 | // { 46 | // path: 'Owner', 47 | // name: 'Owner', 48 | // component: Owner 49 | // }, 50 | // { 51 | // path: 'Follow', 52 | // name: 'Follow', 53 | // component: Follow 54 | // } 55 | // ] 56 | // }, 57 | // { 58 | // path: '/User', 59 | // name: 'User', 60 | // component: User, 61 | // redirect: { 62 | // name: 'UserDetail', 63 | // params: { 64 | // username: 'luuman' 65 | // } 66 | // }, 67 | // children: [ 68 | // { 69 | // path: ':username', 70 | // name: 'UserDetail', 71 | // component: UserPage 72 | // }, 73 | // { 74 | // path: ':username/repos', 75 | // name: 'RepoList', 76 | // component: RepoList 77 | // }, 78 | // { 79 | // path: ':username/repos/:reponame', 80 | // name: 'RepoDetail', 81 | // component: RepoDetail 82 | // } 83 | // ] 84 | // }, 85 | { 86 | path: '/404', 87 | name: 'Error', 88 | component: Error 89 | }, 90 | { 91 | path: '*', 92 | redirect: '/404' 93 | } 94 | ] 95 | }) 96 | -------------------------------------------------------------------------------- /src/apis/index.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | 3 | const TOKEN = '93a89eb491ce25f7cd243bd51fd8c68b38ae77cd' 4 | // const option = { 5 | // headers: { 6 | // 'Authorization': `token ${TOKEN}` 7 | // } 8 | // } 9 | // console.log('option' + option) 10 | 11 | import qs from 'qs' 12 | import * as Tool from 'UTIL/tool' 13 | // axios 配置 14 | axios.defaults.timeout = 5000 15 | axios.defaults.baseURL = 'https://api.github.com' 16 | axios.defaults.headers.common['Authorization'] = `token ${TOKEN}` 17 | axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded' 18 | 19 | // POST传参序列化 20 | axios.interceptors.request.use((config) => { 21 | if (config.method === 'post') { 22 | config.data = qs.stringify(config.data) 23 | } 24 | let URL = config.url.split(config.baseURL) 25 | Tool.open(URL[1]) 26 | return config 27 | }, (error) => { 28 | Tool.toast('错误的传参', 'fail') 29 | return Promise.reject(error) 30 | }) 31 | 32 | // 返回状态判断 33 | axios.interceptors.response.use((res) => { 34 | console.log(res) 35 | // 拦截器配置 36 | // if (res.data.success) { 37 | // Tool.toast(res.data.msg) 38 | // Tool.close() 39 | // return Promise.reject(res) 40 | // } 41 | Tool.close() 42 | return res 43 | }, (error) => { 44 | Tool.toast('网络异常', 'fail') 45 | Tool.close() 46 | return Promise.reject(error) 47 | }) 48 | 49 | export const oGet = (url, params) => { 50 | return new Promise((resolve, reject) => { 51 | axios.get(url, params) 52 | .then(res => { 53 | resolve(res.data) 54 | }, err => { 55 | reject(err) 56 | }) 57 | .catch(err => { 58 | reject(err) 59 | }) 60 | }) 61 | } 62 | 63 | export const oPost = (url, params) => { 64 | return new Promise((resolve, reject) => { 65 | axios.post(url, params) 66 | .then(res => { 67 | resolve(res.data) 68 | }, err => { 69 | reject(err) 70 | }) 71 | .catch(err => { 72 | reject(err) 73 | }) 74 | }) 75 | } 76 | 77 | // export default { 78 | // List () { 79 | // return oGet(`https://www.easy-mock.com/mock/5926ae2191470c0ac1fde242/api/frontendguide/list`) 80 | // }, 81 | // Get (link) { 82 | // return oGet(link) 83 | // } 84 | // } 85 | 86 | import * as repos from '../../static/FontEnd.json' 87 | export const setpromise = data => { 88 | return new Promise((resolve, reject) => { 89 | resolve(data) 90 | }) 91 | } 92 | var List = (username) => setpromise(repos) 93 | var Notifications = (username) => setpromise(repos) 94 | 95 | export default { 96 | List, 97 | Notifications 98 | } 99 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "demo", 3 | "version": "1.0.0", 4 | "description": "demo", 5 | "author": "luuman", 6 | "private": true, 7 | "scripts": { 8 | "dev": "node build/dev-server.js", 9 | "build": "node build/build.js", 10 | "lint": "eslint --ext .js,.vue src", 11 | "analyz": "NODE_ENV=production npm_config_report=true npm run build" 12 | }, 13 | "dependencies": { 14 | "vue": "^2.2.2", 15 | "vue-router": "^2.2.0", 16 | "vuex": "^2.3.1" 17 | }, 18 | "devDependencies": { 19 | "autoprefixer": "^6.7.2", 20 | "axios": "^0.16.1", 21 | "babel-core": "^6.22.1", 22 | "babel-eslint": "^7.1.1", 23 | "babel-loader": "^6.2.10", 24 | "babel-plugin-transform-runtime": "^6.22.0", 25 | "babel-preset-env": "^1.2.1", 26 | "babel-preset-stage-2": "^6.22.0", 27 | "babel-register": "^6.22.0", 28 | "chalk": "^1.1.3", 29 | "connect-history-api-fallback": "^1.3.0", 30 | "copy-webpack-plugin": "^4.0.1", 31 | "css-loader": "^0.26.1", 32 | "eslint": "^3.14.1", 33 | "eslint-config-standard": "^6.2.1", 34 | "eslint-friendly-formatter": "^2.0.7", 35 | "eslint-loader": "^1.6.1", 36 | "eslint-plugin-html": "^2.0.0", 37 | "eslint-plugin-promise": "^3.4.0", 38 | "eslint-plugin-standard": "^2.0.1", 39 | "eventsource-polyfill": "^0.9.6", 40 | "express": "^4.14.1", 41 | "extract-text-webpack-plugin": "^2.0.0", 42 | "file-loader": "^0.10.0", 43 | "friendly-errors-webpack-plugin": "^1.1.3", 44 | "function-bind": "^1.1.0", 45 | "html-webpack-plugin": "^2.28.0", 46 | "http-proxy-middleware": "^0.17.3", 47 | "navbar": "^1.0.1", 48 | "node-sass": "^4.5.1", 49 | "opn": "^4.0.2", 50 | "optimize-css-assets-webpack-plugin": "^1.3.0", 51 | "ora": "^1.1.0", 52 | "progressive-image": "^1.0.1", 53 | "rimraf": "^2.6.0", 54 | "sass-loader": "^6.0.3", 55 | "script-loader": "^0.7.0", 56 | "semver": "^5.3.0", 57 | "url-loader": "^0.5.7", 58 | "v-tap": "^3.0.1", 59 | "vue-lazyload": "^1.0.1", 60 | "vue-loader": "^11.1.4", 61 | "vue-navbar": "^1.0.4", 62 | "vue-scroller": "^2.2.0", 63 | "vue-style-loader": "^2.0.0", 64 | "vue-template-compiler": "^2.2.4", 65 | "vue-virtual-scroll-list": "^1.0.3", 66 | "webpack": "^2.2.1", 67 | "webpack-bundle-analyzer": "^2.2.1", 68 | "webpack-dev-middleware": "^1.10.0", 69 | "webpack-hot-middleware": "^2.16.1", 70 | "webpack-merge": "^2.6.1" 71 | }, 72 | "engines": { 73 | "node": ">= 4.0.0", 74 | "npm": ">= 3.0.0" 75 | }, 76 | "browserslist": [ 77 | "> 1%", 78 | "last 2 versions", 79 | "not ie <= 8" 80 | ] 81 | } 82 | -------------------------------------------------------------------------------- /src/components/popup/popup.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 56 | 57 | 58 | 97 | -------------------------------------------------------------------------------- /src/components/button/button.vue: -------------------------------------------------------------------------------- 1 | 7 | 37 | 38 | 39 | 86 | -------------------------------------------------------------------------------- /src/utils/common.js: -------------------------------------------------------------------------------- 1 | export const parseUA = () => { 2 | let u = navigator.userAgent.toLowerCase() || window.navigator.userAgent.toLowerCase() 3 | return { 4 | ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), 5 | android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, 6 | Mobile: /(Mobile)/i.test(u), 7 | MobileAll: u.indexOf('Android') > -1 || u.indexOf('iPhone') > -1 || u.indexOf('SymbianOS') > -1 || u.indexOf('Windows Phone') > -1 || u.indexOf('iPad') > -1 || u.indexOf('iPod') > -1, 8 | wPhone: /(Windows Phone|windows[\s+]phone)/i.test(u), 9 | PC: u.indexOf('Win') > -1 || u.indexOf('Mac') > -1 || u.indexOf('Linux') > -1, 10 | weixin: u.indexOf('MicroMessenger') > -1, 11 | ykly: u.indexOf('ykly') > -1, 12 | yIos: u.indexOf('ykly_ios_app') > -1, 13 | yAndroid: u.indexOf('ykly_android_app') > -1 14 | } 15 | } 16 | 17 | export const loadScript = (url, callback) => { 18 | let script = document.createElement('script') 19 | script.type = 'text/javascript' 20 | script.async = 'async' 21 | script.src = url 22 | document.body.appendChild(script) 23 | if (script.readyState) { 24 | script.onreadystatechange = function () { 25 | if (script.readyState === 'complete' || script.readyState === 'loaded') { 26 | script.onreadystatechange = null 27 | callback() 28 | } 29 | } 30 | } else { 31 | script.onload = function () { 32 | callback() 33 | } 34 | } 35 | } 36 | 37 | export const urlAuthWechat = (appid, link) => { 38 | return `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${encodeURIComponent(link)}&response_type=code&scope=snsapi_base#wechat_redirect` 39 | } 40 | 41 | export const authorize = () => { 42 | let secret = 'abcb4790d98c686e7656d28c756ebbaac5b89d3a' 43 | let id = '82c800a8b9db1cb2a145' 44 | return `https://github.com/login/oauth/authorize?redirect_uri=${window.location.href}&client_id=${id}&client_secret=${secret}` 45 | // return `https://github.com/login/oauth/authorize?scope=public_repo&redirect_uri=${window.location.href}/?error=redirect_uri_mismatch&error_description=The+redirect_uri+MUST+match+the+registered+callback+URL+for+this+application.&error_uri=https://developer.github.com/v3/oauth/%23redirect-uri-mismatch&client_id=${id}&client_secret=${secret}` 46 | } 47 | 48 | /* 获取url的一个参数值 */ 49 | export const getUrlObj = (name) => { 50 | var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)') 51 | let r = window.location.search.substr(1).match(reg) 52 | if (r !== null) return decodeURI(r[2]) 53 | return null 54 | } 55 | /* 获取url的参数对象 */ 56 | export const getUrlJson = () => { 57 | let json = {} 58 | let arr = window.location.search.substr(1).split('&') 59 | for (var i = 0; i < arr.length; i++) { 60 | let tempArr = arr[i].split('=') 61 | json[tempArr[0]] = tempArr[1] 62 | } 63 | return json 64 | } 65 | -------------------------------------------------------------------------------- /src/components/v-dialog/index.vue: -------------------------------------------------------------------------------- 1 | 13 | 79 | 80 | 81 | 117 | -------------------------------------------------------------------------------- /src/utils/flexible.js: -------------------------------------------------------------------------------- 1 | (function (win, lib) { 2 | var doc = win.document 3 | var docEl = doc.documentElement 4 | var metaEl = doc.querySelector('meta[name="viewport"]') 5 | var flexibleEl = doc.querySelector('meta[name="flexible"]') 6 | var dpr = 0 7 | var scale = 0 8 | var tid 9 | var flexible = lib.flexible || (lib.flexible = {}) 10 | if (metaEl) { 11 | console.warn('将根据已有的meta标签来设置缩放比例') 12 | var match = metaEl.getAttribute('content').match(/initial-scale=([\d.]+)/) 13 | if (match) { 14 | scale = parseFloat(match[1]) 15 | dpr = parseInt(1 / scale) 16 | } 17 | } else if (flexibleEl) { 18 | var content = flexibleEl.getAttribute('content') 19 | if (content) { 20 | var initialDpr = content.match(/initial-dpr=([\d.]+)/) 21 | var maximumDpr = content.match(/maximum-dpr=([\d.]+)/) 22 | if (initialDpr) { 23 | dpr = parseFloat(initialDpr[1]) 24 | scale = parseFloat((1 / dpr).toFixed(2)) 25 | } 26 | if (maximumDpr) { 27 | dpr = parseFloat(maximumDpr[1]) 28 | scale = parseFloat((1 / dpr).toFixed(2)) 29 | } 30 | } 31 | } 32 | if (!dpr && !scale) { 33 | // var isAndroid = win.navigator.appVersion.match(/android/gi) 34 | var isIPhone = win.navigator.appVersion.match(/iphone/gi) 35 | var isIPhone93 = isIPhone && win.navigator.appVersion.match(/OS 9_3/) 36 | var devicePixelRatio = win.devicePixelRatio 37 | if (isIPhone && !isIPhone93) { 38 | // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案 39 | if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) { 40 | dpr = 3 41 | } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)) { 42 | dpr = 2 43 | } else { 44 | dpr = 1 45 | } 46 | } else { 47 | // 其他设备下,仍旧使用1倍的方案 48 | dpr = 1 49 | } 50 | scale = 1 / dpr 51 | } 52 | docEl.setAttribute('data-dpr', dpr) 53 | if (!metaEl) { 54 | metaEl = doc.createElement('meta') 55 | metaEl.setAttribute('name', 'viewport') 56 | metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no') 57 | if (docEl.firstElementChild) { 58 | docEl.firstElementChild.appendChild(metaEl) 59 | } else { 60 | var wrap = doc.createElement('div') 61 | wrap.appendChild(metaEl) 62 | doc.write(wrap.innerHTML) 63 | } 64 | } 65 | function refreshRem () { 66 | var width = docEl.getBoundingClientRect().width 67 | if (width / dpr > 540) { 68 | width = 540 * dpr 69 | } 70 | var rem = width / 10 71 | docEl.style.fontSize = rem + 'px' 72 | flexible.rem = win.rem = rem 73 | } 74 | win.addEventListener('resize', function () { 75 | clearTimeout(tid) 76 | tid = setTimeout(refreshRem, 300) 77 | }, false) 78 | win.addEventListener('pageshow', function (e) { 79 | if (e.persisted) { 80 | clearTimeout(tid) 81 | tid = setTimeout(refreshRem, 300) 82 | } 83 | }, false) 84 | if (doc.readyState === 'complete') { 85 | doc.body.style.fontSize = 12 * dpr + 'px' 86 | } else { 87 | doc.addEventListener('DOMContentLoaded', function (e) { 88 | doc.body.style.fontSize = 12 * dpr + 'px' 89 | }, false) 90 | } 91 | refreshRem() 92 | flexible.dpr = win.dpr = dpr 93 | flexible.refreshRem = refreshRem 94 | flexible.rem2px = function (d) { 95 | var val = parseFloat(d) * this.rem 96 | if (typeof d === 'string' && d.match(/rem$/)) { 97 | val += 'px' 98 | } 99 | return val 100 | } 101 | flexible.px2rem = function (d) { 102 | var val = parseFloat(d) / this.rem 103 | if (typeof d === 'string' && d.match(/px$/)) { 104 | val += 'rem' 105 | } 106 | return val 107 | } 108 | })(window, window['lib'] || (window['lib'] = {})) 109 | -------------------------------------------------------------------------------- /src/assets/scss/index.scss: -------------------------------------------------------------------------------- 1 | @charset"utf-8"; 2 | // @import "public/Fonts.scss"; 3 | @import "public/MobileReset.scss"; 4 | @import "public/FlexibleSassMethod.scss"; 5 | @import "public/ClearSrollbar.scss"; 6 | @import "public/MobileWap.scss"; 7 | 8 | $bg-c-1: #FFF; 9 | $bg-c-2: #200c41; 10 | $bg-c-3: #cc9729; 11 | $bg-c-4: #8dd9db; 12 | $bg-c-5: #33d0bf; 13 | $font-c-1: #494949; 14 | $font-c-2: #a0a0a0; 15 | $font-c-3: #b2b2b2; 16 | $font-c-4: #33d0bf; 17 | $main-color: #91D4DA; 18 | $border-color: rgba(0,0,0,0.16); 19 | $border: size(2) solid $border-color; 20 | body{width: 100%;height: 100%;} 21 | h1{ 22 | @include font-size(14px); 23 | } 24 | h2{ 25 | @include font-size(14px); 26 | } 27 | .logo{ 28 | width: size(50); 29 | margin: auto; 30 | display: inline-block; 31 | } 32 | .header{ 33 | text-align: center; 34 | height: size(44); 35 | background: #b30818; 36 | color: #FFF; 37 | font-weight: bold; 38 | span{ 39 | @include font-size(18px); 40 | line-height: size(44); 41 | position: relative; 42 | &:after{ 43 | content: ''; 44 | background: url(../../assets/img/logo.png) 100% 100% no-repeat; 45 | background-size: 100%; 46 | width: size(20); 47 | height: size(20); 48 | position: absolute; 49 | left: 0; 50 | margin-left: size(-30); 51 | margin-top: size(10); 52 | } 53 | } 54 | } 55 | 56 | .tap{ 57 | @include font-size(16px); 58 | text-align: center; 59 | line-height: size(40); 60 | color: #4da577; 61 | } 62 | .loading{ 63 | width: size(200); 64 | height: size(200); 65 | margin: auto; 66 | overflow: hidden; 67 | } 68 | .github{ 69 | width: size(375); 70 | margin: auto; 71 | box-sizing: border-box; 72 | overflow: visible; 73 | ul{ 74 | padding-left: size(10); 75 | } 76 | li{ 77 | float: left; 78 | width: size(172.5); 79 | margin-right: size(10); 80 | margin-bottom: size(10); 81 | overflow: hidden; 82 | box-shadow: 4px 4px 18px rgba(0,0,0,0.46); 83 | .bg-box { 84 | height: 0; 85 | background-size: cover; 86 | // padding-bottom: 100%; 87 | width: size(172.5); 88 | height: size(172.5); 89 | overflow: hidden; 90 | background-image: url(../../assets/img/loading.gif); 91 | // border-radius: size(10); 92 | } 93 | .bg-box[lazy=loaded] { 94 | background-size: cover; 95 | -webkit-animation-duration: 1s; 96 | animation-duration: 1s; 97 | -webkit-animation-fill-mode: both; 98 | animation-fill-mode: both; 99 | -webkit-animation-name: fadeIn; 100 | animation-name: fadeIn; 101 | } 102 | h1{ 103 | line-height: size(30); 104 | color: #4da577; 105 | padding: 0 size(6); 106 | text-align: center; 107 | text-overflow: ellipsis; 108 | overflow: hidden; 109 | white-space: nowrap; 110 | @include font-size(14px); 111 | } 112 | h2{ 113 | line-height: size(16); 114 | @include font-size(12px); 115 | padding: 0 size(6); 116 | height: size(32); 117 | overflow: hidden; 118 | text-overflow: ellipsis; 119 | display: -webkit-box; 120 | -webkit-line-clamp: 2; 121 | -webkit-box-orient: vertical; 122 | } 123 | .star{ 124 | text-align: center; 125 | span{ 126 | line-height: size(40); 127 | @include font-size(14px); 128 | position: relative; 129 | color: #4da577; 130 | .octicon{ 131 | width: size(15); 132 | height: size(15); 133 | position: absolute; 134 | left: size(-18); 135 | top: size(-1); 136 | fill: currentColor; 137 | } 138 | } 139 | } 140 | .addstar{ 141 | width: size(80); 142 | height: size(30); 143 | border-radius: size(20); 144 | line-height: size(30); 145 | margin: size(10) auto; 146 | background: #e4071c; 147 | text-align: center; 148 | color: #FFF; 149 | @include font-size(16px); 150 | } 151 | .checked{ 152 | background: #666; 153 | } 154 | } 155 | } -------------------------------------------------------------------------------- /src/utils/tool.js: -------------------------------------------------------------------------------- 1 | import store from 'VUEX/store' 2 | 3 | export const toast = (str, icon) => { 4 | console.group('showToast') 5 | store.dispatch('showToast', true) 6 | if (icon === 'success') { 7 | store.dispatch('showSuccess', true) 8 | store.dispatch('showFail', false) 9 | } else { 10 | store.dispatch('showSuccess', false) 11 | store.dispatch('showFail', true) 12 | } 13 | store.dispatch('toastMsg', str) 14 | setTimeout(() => { 15 | store.dispatch('showToast', false) 16 | }, 1500) 17 | console.groupEnd() 18 | } 19 | 20 | export const alert = (str) => { 21 | console.group('showAlert') 22 | store.dispatch('showAlert', true) 23 | store.dispatch('alertMsg', str) 24 | setTimeout(() => { 25 | store.dispatch('showAlert', false) 26 | }, 1500) 27 | console.groupEnd() 28 | } 29 | 30 | export const open = (text) => { 31 | console.group('AXIOS ' + text) 32 | } 33 | 34 | export const close = () => { 35 | console.groupEnd() 36 | } 37 | 38 | export const formatDate = (today) => { 39 | let Times = new Date(today) 40 | let month = '' + (Times.getMonth() + 1) 41 | let day = '' + Times.getDate() 42 | let year = Times.getFullYear() 43 | 44 | if (month.length < 2) month = '0' + month 45 | if (day.length < 2) day = '0' + day 46 | let data = `${month} ${day} , ${year}` 47 | return data 48 | } 49 | 50 | export const formatType = (today) => { 51 | let Times = new Date(today) 52 | let month = '' + (Times.getMonth() + 1) 53 | let day = '' + Times.getDate() 54 | let year = Times.getFullYear() 55 | 56 | if (month.length < 2) month = '0' + month 57 | if (day.length < 2) day = '0' + day 58 | let data = `${month} ${day},${year}` 59 | return data 60 | } 61 | 62 | /* 63 | 存储 64 | */ 65 | 66 | /* 存储localStorage */ 67 | export const setLocal = (name, content) => { 68 | if (!name) return 69 | if (typeof content !== 'string') { 70 | content = JSON.stringify(content) 71 | } 72 | window.localStorage.setItem(name, content) 73 | } 74 | 75 | /* 获取localStorage */ 76 | export const getLocal = name => { 77 | if (!name) return 78 | return window.localStorage.getItem(name) 79 | } 80 | 81 | /* 删除localStorage */ 82 | export const removeLocal = name => { 83 | if (!name) return 84 | window.localStorage.removeItem(name) 85 | } 86 | 87 | /* 存储sessionStorage */ 88 | export const setSession = (name, content) => { 89 | if (!name) return 90 | if (typeof content !== 'string') { 91 | content = JSON.stringify(content) 92 | } 93 | window.sessionStorage.setItem(name, content) 94 | } 95 | 96 | /* 获取sessionStorage */ 97 | export const getSession = name => { 98 | if (!name) return 99 | return window.sessionStorage.getItem(name) 100 | } 101 | 102 | /* 删除sessionStorage */ 103 | export const removeSession = name => { 104 | if (!name) return 105 | window.sessionStorage.removeItem(name) 106 | } 107 | 108 | /* 存储cookie */ 109 | // 这是有设定过期时间的使用示例: 110 | // s20是代表20秒 111 | // h是指小时,如12小时则是:h12 112 | // d是天数,30天则:d30 113 | export const setCookie = (name, content, time) => { 114 | if (!name) return 115 | if (typeof content !== 'string') { 116 | content = JSON.stringify(content) 117 | } 118 | let exp = new Date() 119 | time = cookieTime(time) 120 | exp.setTime(exp.getTime() + time * 1) 121 | document.cookie = name + '=' + escape(content) + ';expires=' + exp.toGMTString() 122 | } 123 | export const cookieTime = time => { 124 | if (!name) return 125 | let sT1 = time.substring(1, time.length) * 1 126 | let sT2 = time.substring(0, 1) 127 | if (sT2 === 's') { 128 | return sT1 * 1000 129 | } else if (sT2 === 'h') { 130 | return sT1 * 60 * 60 * 1000 131 | } else if (sT2 === 'd') { 132 | return sT1 * 24 * 60 * 60 * 1000 133 | } 134 | } 135 | 136 | /* 获取cookie */ 137 | export const getCookie = name => { 138 | if (!name) return 139 | let arr 140 | let reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)') 141 | arr = document.cookie.match(reg) 142 | if (arr) { 143 | return unescape(arr[2]) 144 | } else { 145 | return null 146 | } 147 | } 148 | 149 | /* 删除cookie */ 150 | export const removeCookie = name => { 151 | if (!name) return 152 | window.sessionStorage.removeItem(name) 153 | let exp = new Date() 154 | exp.setTime(exp.getTime() - 1) 155 | let cVal = getCookie(name) 156 | if (cVal != null) { 157 | document.cookie = name + '=' + cVal + ';expires=' + exp.toGMTString() 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /src/components/popup/alert.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 51 | 52 | 53 | 161 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 9 | 45 | 46 | 47 | 179 | -------------------------------------------------------------------------------- /src/utils/navbar.js: -------------------------------------------------------------------------------- 1 | var selectedClass = 'navbar-active' 2 | 3 | // It'd be nicer to use the classList API, but I prefer to support more browsers. Remove a class 4 | // if it's found on the element. 5 | function removeClassIfNeeded (el) { 6 | // If the element has no classes then we can take a shortcut. 7 | if (!el.className) { 8 | return 9 | } 10 | 11 | var splitClassName = el.className.split(' ') 12 | var replacementClassName = '' 13 | 14 | // Assemble a string of other class names. 15 | for (var i = 0, len = splitClassName.length; i < len; i++) { 16 | var className = splitClassName[i] 17 | 18 | if (className !== selectedClass) { 19 | replacementClassName += replacementClassName === '' ? className : ' ' + className 20 | } 21 | } 22 | 23 | // If the length of the className differs, then it had an selected class in and needs to be 24 | // updated. 25 | if (replacementClassName.length !== el.className.length) { 26 | el.className = replacementClassName 27 | } 28 | } 29 | 30 | // Add a class to an element if it is not found. 31 | function addClassIfNeeded (el) { 32 | // If the element has no classes then we can take a shortcut. 33 | if (!el.className) { 34 | el.className = selectedClass 35 | return 36 | } 37 | 38 | var splitClassName = el.className.split(' ') 39 | 40 | // If any of the class names match the selected class then return. 41 | for (var i = 0, len = splitClassName.length; i < len; i++) { 42 | if (splitClassName[i] === selectedClass) { 43 | return 44 | } 45 | } 46 | 47 | // If we got here then the selected class needs to be added to an existing className. 48 | el.className += ' ' + selectedClass 49 | } 50 | 51 | function createAndAppendListItems (navList, elementList, makeNavListItem) { 52 | var pairs = [] 53 | var element 54 | var li 55 | 56 | // Create list elements 57 | for (var i = 0, len = elementList.length; i < len; i++) { 58 | element = elementList[i] 59 | // console.log(element) 60 | li = makeNavListItem(element) 61 | 62 | navList.appendChild(li) 63 | 64 | pairs.push({ element: element, navElement: li }) 65 | } 66 | 67 | return pairs 68 | } 69 | 70 | function makeHandleScroll (pairs, debounceTime) { 71 | function handleScroll () { 72 | var frontRunner = { navElement: {} } 73 | var closestDist = Infinity 74 | var pair, absDist 75 | 76 | for (var i = 0, len = pairs.length; i < len; i++) { 77 | pair = pairs[i] 78 | absDist = Math.abs(pair.element.getBoundingClientRect().top) 79 | 80 | // If this element is not the front runner for top, deactivate it. 81 | if (absDist > closestDist) { 82 | removeClassIfNeeded(pair.navElement) 83 | continue 84 | } 85 | 86 | // If this is a new front runner, deactivate the previous front runner. 87 | removeClassIfNeeded(frontRunner) 88 | 89 | frontRunner = pair.navElement 90 | closestDist = absDist 91 | } 92 | 93 | // All other elements have been deactivated, and now the top element is known and can be set 94 | // as active. 95 | addClassIfNeeded(frontRunner, selectedClass) 96 | } 97 | 98 | // The default behaviour is no debounce. 99 | if (typeof debounceTime !== 'number' || isNaN(debounceTime)) { 100 | return handleScroll 101 | } 102 | 103 | var timeout 104 | 105 | function nullifyTimeout () { 106 | timeout = null 107 | } 108 | 109 | return function debouncedHandleScroll () { 110 | if (timeout) { 111 | return 112 | } 113 | 114 | // Immediately use handleScroll to calculate. 115 | handleScroll() 116 | 117 | // No further calls to handleScroll until debounceTime has elapsed. 118 | timeout = setTimeout(nullifyTimeout, debounceTime) 119 | } 120 | } 121 | 122 | function addScrollListener (target, handleScroll) { 123 | function scrollHandleWrapper (evt) { 124 | if (evt.target === target) { 125 | handleScroll() 126 | } 127 | } 128 | 129 | if (target.addEventListener) { 130 | target.addEventListener('scroll', scrollHandleWrapper, false) 131 | } else if (target.attachEvent) { 132 | target.attachEvent('onscroll', scrollHandleWrapper) 133 | } else { 134 | throw new Error('This browser does not support addEventListener or attachEvent.') 135 | } 136 | 137 | // To calculate the initial active list element. 138 | handleScroll() 139 | } 140 | 141 | export default function makeNav (options) { 142 | // console.log(options.makeNavListItem) 143 | if (!options || !options.elementList || !options.makeNavListItem) { 144 | throw new Error('Options object with elementList and makeNavListItem must be provided.') 145 | } 146 | 147 | var nav = document.createElement(options.tagName || 'nav') 148 | var navList = document.createElement('ul') 149 | 150 | // The target defaults to window. 151 | var target = options.target || document 152 | 153 | // Create list elements 154 | var pairs = createAndAppendListItems(navList, options.elementList, options.makeNavListItem) 155 | 156 | // Whenever the window is scrolled, recalculate the active list element. Compatible with older 157 | // versions of IE. 158 | addScrollListener(target, makeHandleScroll(pairs, options.debounceTime)) 159 | 160 | nav.appendChild(navList) 161 | 162 | return nav 163 | } 164 | -------------------------------------------------------------------------------- /src/components/alert/index.vue: -------------------------------------------------------------------------------- 1 | 26 | 92 | 93 | 94 | 188 | -------------------------------------------------------------------------------- /src/components/vote/voteItem.vue: -------------------------------------------------------------------------------- 1 | 25 | 56 | 57 | 58 | 161 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Vue 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 46 | 47 | 48 |
49 |
50 |
51 |
52 | 53 |
54 |
55 |
56 |

极速加载中...

57 |
58 |
59 |
60 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /src/components/v-list/copy.vue: -------------------------------------------------------------------------------- 1 | 51 | 116 | 117 | 118 | 240 | -------------------------------------------------------------------------------- /src/views/index/index.vue: -------------------------------------------------------------------------------- 1 | 46 | 141 | 142 | 143 | 300 | -------------------------------------------------------------------------------- /src/assets/scss/animation.scss: -------------------------------------------------------------------------------- 1 | /* animation */ 2 | .a-bounce, .a-flip, .a-flash, .a-shake, .a-swing, .a-wobble, .a-ring { 3 | animation:1s ease; 4 | animation:1s ease; 5 | -ms-animation:1s ease; 6 | animation:1s ease; 7 | } 8 | .a-fadein, .a-fadeinT, .a-fadeinR, .a-fadeinB, .a-fadeinL, .a-bouncein, .a-bounceinT, .a-bounceinR, .a-bounceinB, .a-bounceinL, .a-rotatein, .a-rotateinLT, .a-rotateinLB, .a-rotateinRT, .a-rotateinRB, .a-flipin, .a-flipinX, .a-flipinY { 9 | animation:1s ease-out backwards; 10 | animation:1s ease-out backwards; 11 | -ms-animation:1s ease-out backwards; 12 | animation:1s ease-out backwards; 13 | } 14 | .a-fadeout, .a-fadeoutT, .a-fadeoutR, .a-fadeoutB, .a-fadeoutL, .a-bounceout, .a-bounceoutT, .a-bounceoutR, .a-bounceoutB, .a-bounceoutL, .a-rotateout, .a-rotateoutLT, .a-rotateoutLB, .a-rotateoutRT, .a-rotateoutRB, .a-flipout, .a-flipoutX, .a-flipoutY { 15 | animation:1s ease-in forwards; 16 | animation:1s ease-in forwards; 17 | -ms-animation:1s ease-in forwards; 18 | animation:1s ease-in forwards; 19 | } 20 | /* 淡入 */ 21 | .a-fadein { 22 | animation-name:fadein; 23 | } 24 | /* 淡入-从上 */ 25 | .a-fadeinT { 26 | animation-name:fadeinT; 27 | } 28 | /* 淡入-从右 */ 29 | .a-fadeinR { 30 | animation-name:fadeinR; 31 | } 32 | /* 淡入-从下 */ 33 | .a-fadeinB { 34 | animation-name:fadeinB; 35 | } 36 | /* 淡入-从左 */ 37 | .a-fadeinL { 38 | animation-name:fadeinL; 39 | } 40 | /* 淡出 */ 41 | .a-fadeout { 42 | animation-name:fadeout; 43 | } 44 | /* 淡出-向上 */ 45 | .a-fadeoutT { 46 | animation-name:fadeoutT; 47 | } 48 | /* 淡出-向右 */ 49 | .a-fadeoutR { 50 | animation-name:fadeoutR; 51 | } 52 | /* 淡出-向下 */ 53 | .a-fadeoutB { 54 | animation-name:fadeoutB; 55 | } 56 | /* 淡出-向左 */ 57 | .a-fadeoutL { 58 | animation-name:fadeoutL; 59 | } 60 | /* 弹跳 */ 61 | .a-bounce { 62 | animation-name:bounce; 63 | } 64 | /* 弹入 */ 65 | .a-bouncein { 66 | animation-name:bouncein; 67 | } 68 | /* 弹入-从上 */ 69 | .a-bounceinT { 70 | animation-name:bounceinT; 71 | } 72 | /* 弹入-从右 */ 73 | .a-bounceinR { 74 | animation-name:bounceinR; 75 | } 76 | /* 弹入-从下 */ 77 | .a-bounceinB { 78 | animation-name:bounceinB; 79 | } 80 | /* 弹入-从左 */ 81 | .a-bounceinL { 82 | animation-name:bounceinL; 83 | } 84 | /* 弹出 */ 85 | .a-bounceout { 86 | animation-name:bounceout; 87 | } 88 | /* 弹出-向上 */ 89 | .a-bounceoutT { 90 | animation-name:bounceoutT; 91 | } 92 | /* 弹出-向右 */ 93 | .a-bounceoutR { 94 | animation-name:bounceoutR; 95 | } 96 | /* 弹出-向下 */ 97 | .a-bounceoutB { 98 | animation-name:bounceoutB; 99 | } 100 | /* 弹出-向左 */ 101 | .a-bounceoutL { 102 | animation-name:bounceoutL; 103 | } 104 | /* 转入 */ 105 | .a-rotatein { 106 | animation-name:rotatein; 107 | } 108 | /* 转入-从左上 */ 109 | .a-rotateinLT { 110 | animation-name:rotateinLT; 111 | } 112 | /* 转入-从左下 */ 113 | .a-rotateinLB { 114 | animation-name:rotateinLB; 115 | } 116 | /* 转入-从右上 */ 117 | .a-rotateinRT { 118 | animation-name:rotateinRT; 119 | } 120 | /* 转入-从右下*/ 121 | .a-rotateinRB { 122 | animation-name:rotateinRB; 123 | } 124 | /* 转出 */ 125 | .a-rotateout { 126 | animation-name:rotateout; 127 | } 128 | /* 转出-向左上 */ 129 | .a-rotateoutLT { 130 | animation-name:rotateoutLT; 131 | } 132 | /* 转出-向左下 */ 133 | .a-rotateoutLB { 134 | animation-name:rotateoutLB; 135 | } 136 | /* 转出-向右上 */ 137 | .a-rotateoutRT { 138 | animation-name:rotateoutRT; 139 | } 140 | /* 转出-向右下 */ 141 | .a-rotateoutRB { 142 | animation-name:rotateoutRB; 143 | } 144 | /* 翻转 */ 145 | .a-flip { 146 | animation-name:flip; 147 | } 148 | /* 翻入-X轴 */ 149 | .a-flipinX { 150 | animation-name:flipinX; 151 | } 152 | /* 翻入-Y轴 */ 153 | .a-flipin, .a-flipinY { 154 | animation-name:flipinY; 155 | } 156 | /* 翻出-X轴 */ 157 | .a-flipoutX { 158 | animation-name:flipoutX; 159 | } 160 | /* 翻出-Y轴 */ 161 | .a-flipout, .a-flipoutY { 162 | animation-name:flipoutY; 163 | } 164 | /* 闪烁 */ 165 | .a-flash { 166 | animation-name:flash; 167 | } 168 | /* 震颤 */ 169 | .a-shake { 170 | animation-name:shake; 171 | } 172 | /* 摇摆 */ 173 | .a-swing { 174 | animation-name:swing; 175 | } 176 | /* 摇晃 */ 177 | .a-wobble { 178 | animation-name:wobble; 179 | } 180 | /* 震铃 */ 181 | .a-ring { 182 | animation-name:ring; 183 | } 184 | /* define */ 185 | /* 淡入 */ 186 | @keyframes fadein { 187 | 0% { 188 | opacity:0; 189 | } 190 | 100% { 191 | opacity:1; 192 | } 193 | } 194 | /* 淡入-从上 */ 195 | @keyframes fadeinT { 196 | 0% { 197 | opacity:0; 198 | transform:translateY(-100px); 199 | } 200 | 100% { 201 | opacity:1; 202 | transform:translateY(0); 203 | } 204 | } 205 | /* 淡入-从右 */ 206 | @keyframes fadeinR { 207 | 0% { 208 | opacity:0; 209 | transform:translateX(100px); 210 | } 211 | 100% { 212 | opacity:1; 213 | transform:translateX(0); 214 | } 215 | } 216 | /* 淡入-从下 */ 217 | @keyframes fadeinB { 218 | 0% { 219 | opacity:0; 220 | transform:translateY(100px); 221 | } 222 | 100% { 223 | opacity:1; 224 | transform:translateY(0); 225 | } 226 | } 227 | /* 淡入-从左 */ 228 | @keyframes fadeinL { 229 | 0% { 230 | opacity:0; 231 | transform:translateX(-100px); 232 | } 233 | 100% { 234 | opacity:1; 235 | transform:translateX(0); 236 | } 237 | } 238 | /* 淡出 */ 239 | @keyframes fadeout { 240 | 0% { 241 | opacity:1; 242 | } 243 | 100% { 244 | opacity:0; 245 | } 246 | } 247 | /* 淡出-向上 */ 248 | @keyframes fadeoutT { 249 | 0% { 250 | opacity:1; 251 | transform:translateY(0); 252 | } 253 | 100% { 254 | opacity:0; 255 | transform:translateY(-100px); 256 | } 257 | } 258 | /* 淡出-向右 */ 259 | @keyframes fadeoutR { 260 | 0% { 261 | opacity:1; 262 | transform:translateX(0); 263 | } 264 | 100% { 265 | opacity:0; 266 | transform:translateX(100px); 267 | } 268 | } 269 | /* 淡出-向下 */ 270 | @keyframes fadeoutB { 271 | 0% { 272 | opacity:1; 273 | transform:translateY(0); 274 | } 275 | 100% { 276 | opacity:0; 277 | transform:translateY(100px); 278 | } 279 | } 280 | /* 淡出-向左 */ 281 | @keyframes fadeoutL { 282 | 0% { 283 | opacity:1; 284 | transform:translateX(0); 285 | } 286 | 100% { 287 | opacity:0; 288 | transform:translateX(-100px); 289 | } 290 | } 291 | /* 弹跳 */ 292 | @keyframes bounce { 293 | 0%, 20%, 50%, 80%, 100% { 294 | transform:translateY(0); 295 | } 296 | 40% { 297 | transform:translateY(-30px); 298 | } 299 | 60% { 300 | transform:translateY(-15px); 301 | } 302 | } 303 | /* 弹入 */ 304 | @keyframes bouncein { 305 | 0% { 306 | opacity:0; 307 | transform:scale(0.3); 308 | } 309 | 50% { 310 | opacity:1; 311 | transform:scale(1.05); 312 | } 313 | 70% { 314 | transform:scale(0.9); 315 | } 316 | 100% { 317 | transform:scale(1); 318 | } 319 | } 320 | /* 弹入-从上 */ 321 | @keyframes bounceinT { 322 | 0% { 323 | opacity:0; 324 | transform:translateY(-100px); 325 | } 326 | 60% { 327 | opacity:1; 328 | transform:translateY(30px); 329 | } 330 | 80% { 331 | transform:translateY(-10px); 332 | } 333 | 100% { 334 | transform:translateY(0); 335 | } 336 | } 337 | /* 弹入-从右 */ 338 | @keyframes bounceinR { 339 | 0% { 340 | opacity:0; 341 | transform:translateX(100px); 342 | } 343 | 60% { 344 | opacity:1; 345 | transform:translateX(-30px); 346 | } 347 | 80% { 348 | transform:translateX(10px); 349 | } 350 | 100% { 351 | transform:translateX(0); 352 | } 353 | } 354 | /* 弹入-从下 */ 355 | @keyframes bounceinB { 356 | 0% { 357 | opacity:0; 358 | transform:translateY(100px); 359 | } 360 | 60% { 361 | opacity:1; 362 | transform:translateY(-30px); 363 | } 364 | 80% { 365 | transform:translateY(10px); 366 | } 367 | 100% { 368 | transform:translateY(0); 369 | } 370 | } 371 | /* 弹入-从左 */ 372 | @keyframes bounceinL { 373 | 0% { 374 | opacity:0; 375 | transform:translateX(-100px); 376 | } 377 | 60% { 378 | opacity:1; 379 | transform:translateX(30px); 380 | } 381 | 80% { 382 | transform:translateX(-10px); 383 | } 384 | 100% { 385 | transform:translateX(0); 386 | } 387 | } 388 | /* 弹出 */ 389 | @keyframes bounceout { 390 | 0% { 391 | transform:scale(1); 392 | } 393 | 25% { 394 | transform:scale(0.95); 395 | } 396 | 50% { 397 | opacity:1; 398 | transform:scale(1.1); 399 | } 400 | 100% { 401 | opacity:0; 402 | transform:scale(0.3); 403 | } 404 | } 405 | /* 弹出-向上*/ 406 | @keyframes bounceoutT { 407 | 0% { 408 | transform:translateY(0); 409 | } 410 | 20% { 411 | opacity:1; 412 | transform:translateY(20px); 413 | } 414 | 100% { 415 | opacity:0; 416 | transform:translateY(-100px); 417 | } 418 | } 419 | /* 弹出-向右*/ 420 | @keyframes bounceoutR { 421 | 0% { 422 | transform:translateX(0); 423 | } 424 | 20% { 425 | opacity:1; 426 | transform:translateX(-20px); 427 | } 428 | 100% { 429 | opacity:0; 430 | transform:translateX(100px); 431 | } 432 | } 433 | /* 弹出-向下 */ 434 | @keyframes bounceoutB { 435 | 0% { 436 | transform:translateY(0); 437 | } 438 | 20% { 439 | opacity:1; 440 | transform:translateY(-20px); 441 | } 442 | 100% { 443 | opacity:0; 444 | transform:translateY(100px); 445 | } 446 | } 447 | /* 弹出-向左 */ 448 | @keyframes bounceoutL { 449 | 0% { 450 | transform:translateX(0); 451 | } 452 | 20% { 453 | opacity:1; 454 | transform:translateX(20px); 455 | } 456 | 100% { 457 | opacity:0; 458 | transform:translateX(-200px); 459 | } 460 | } 461 | /* 转入 */ 462 | @keyframes rotatein { 463 | 0% { 464 | opacity:0; 465 | transform:rotate(-200deg); 466 | } 467 | 100% { 468 | opacity:1; 469 | transform:rotate(0); 470 | } 471 | } 472 | /* 转入-从左上 */ 473 | @keyframes rotateinLT { 474 | 0% { 475 | transform-origin:left bottom; 476 | transform:rotate(-90deg); 477 | opacity:0; 478 | } 479 | 100% { 480 | transform-origin:left bottom; 481 | transform:rotate(0); 482 | opacity:1; 483 | } 484 | } 485 | /* 转入-从左下 */ 486 | @keyframes rotateineftB { 487 | 0% { 488 | transform-origin:left bottom; 489 | transform:rotate(90deg); 490 | opacity:0; 491 | } 492 | 100% { 493 | transform-origin:left bottom; 494 | transform:rotate(0); 495 | opacity:1; 496 | } 497 | } 498 | /* 转入-从右上 */ 499 | @keyframes rotateinRT { 500 | 0% { 501 | transform-origin:right bottom; 502 | transform:rotate(90deg); 503 | opacity:0; 504 | } 505 | 100% { 506 | transform-origin:right bottom; 507 | transform:rotate(0); 508 | opacity:1; 509 | } 510 | } 511 | /* 转入-从右下*/ 512 | @keyframes rotateinRB { 513 | 0% { 514 | transform-origin:right bottom; 515 | transform:rotate(-90deg); 516 | opacity:0; 517 | } 518 | 100% { 519 | transform-origin:right bottom; 520 | transform:rotate(0); 521 | opacity:1; 522 | } 523 | } 524 | /* 转出 */ 525 | @keyframes rotateout { 526 | 0% { 527 | transform-origin:center center; 528 | transform:rotate(0); 529 | opacity:1; 530 | } 531 | 100% { 532 | transform-origin:center center; 533 | transform:rotate(200deg); 534 | opacity:0; 535 | } 536 | } 537 | /* 转出-向左上 */ 538 | @keyframes rotateoutLT { 539 | 0% { 540 | transform-origin:left bottom; 541 | transform:rotate(0); 542 | opacity:1; 543 | } 544 | 100% { 545 | transform-origin:left bottom; 546 | transform:rotate(-90deg); 547 | opacity:0; 548 | } 549 | } 550 | /* 转出-向左下 */ 551 | @keyframes rotateoutLB { 552 | 0% { 553 | transform-origin:left bottom; 554 | transform:rotate(0); 555 | opacity:1; 556 | } 557 | 100% { 558 | transform-origin:left bottom; 559 | transform:rotate(90deg); 560 | opacity:0; 561 | } 562 | } 563 | /* 转出-向右上 */ 564 | @keyframes rotateoutRT { 565 | 0% { 566 | transform-origin:right bottom; 567 | transform:rotate(0); 568 | opacity:1; 569 | } 570 | 100% { 571 | transform-origin:right bottom; 572 | transform:rotate(90deg); 573 | opacity:0; 574 | } 575 | } 576 | /* 转出-向右下 */ 577 | @keyframes rotateoutBR { 578 | 0% { 579 | transform-origin:right bottom; 580 | transform:rotate(0); 581 | opacity:1; 582 | } 583 | 100% { 584 | transform-origin:right bottom; 585 | transform:rotate(-90deg); 586 | opacity:0; 587 | } 588 | } 589 | /* 翻转 */ 590 | @keyframes flip { 591 | 0% { 592 | transform:perspective(400px) rotateY(0); 593 | animation-timing-function:ease-out; 594 | } 595 | 40% { 596 | transform:perspective(400px) translateZ(150px) rotateY(170deg); 597 | animation-timing-function:ease-out; 598 | } 599 | 50% { 600 | transform:perspective(400px) translateZ(150px) rotateY(190deg) scale(1); 601 | animation-timing-function:ease-in; 602 | } 603 | 80% { 604 | transform:perspective(400px) rotateY(360deg) scale(0.95); 605 | animation-timing-function:ease-in; 606 | } 607 | 100% { 608 | transform:perspective(400px) scale(1); 609 | animation-timing-function:ease-in; 610 | } 611 | } 612 | /* 翻入-X轴 */ 613 | @keyframes flipinX { 614 | 0% { 615 | transform:perspective(400px) rotateX(90deg); 616 | opacity:0; 617 | } 618 | 40% { 619 | transform:perspective(400px) rotateX(-10deg); 620 | } 621 | 70% { 622 | transform:perspective(400px) rotateX(10deg); 623 | } 624 | 100% { 625 | transform:perspective(400px) rotateX(0); 626 | opacity:1; 627 | } 628 | } 629 | /* 翻入-Y轴 */ 630 | @keyframes flipinY { 631 | 0% { 632 | transform:perspective(400px) rotateY(90deg); 633 | opacity:0; 634 | } 635 | 40% { 636 | transform:perspective(400px) rotateY(-10deg); 637 | } 638 | 70% { 639 | transform:perspective(400px) rotateY(10deg); 640 | } 641 | 100% { 642 | transform:perspective(400px) rotateY(0); 643 | opacity:1; 644 | } 645 | } 646 | /* 翻出-X轴 */ 647 | @keyframes flipoutX { 648 | 0% { 649 | transform:perspective(400px) rotateX(0); 650 | opacity:1; 651 | } 652 | 100% { 653 | transform:perspective(400px) rotateX(90deg); 654 | opacity:0; 655 | } 656 | } 657 | /* 翻出-Y轴 */ 658 | @keyframes flipoutY { 659 | 0% { 660 | transform:perspective(400px) rotateY(0); 661 | opacity:1; 662 | } 663 | 100% { 664 | transform:perspective(400px) rotateY(90deg); 665 | opacity:0; 666 | } 667 | } 668 | /* 闪烁 */ 669 | @keyframes flash { 670 | 0%, 50%, 100% { 671 | opacity:1; 672 | } 673 | 25%, 75% { 674 | opacity:0; 675 | } 676 | } 677 | /* 震颤 */ 678 | @keyframes shake { 679 | 0%, 100% { 680 | transform:translateX(0); 681 | } 682 | 10%, 30%, 50%, 70%, 90% { 683 | transform:translateX(-10px); 684 | } 685 | 20%, 40%, 60%, 80% { 686 | transform:translateX(10px); 687 | } 688 | } 689 | /* 摇摆 */ 690 | @keyframes swing { 691 | 20% { 692 | transform:rotate(15deg); 693 | } 694 | 40% { 695 | transform:rotate(-10deg); 696 | } 697 | 60% { 698 | transform:rotate(5deg); 699 | } 700 | 80% { 701 | transform:rotate(-5deg); 702 | } 703 | 100% { 704 | transform:rotate(0); 705 | } 706 | } 707 | /* 摇晃 */ 708 | @keyframes wobble { 709 | 0% { 710 | transform:translateX(0); 711 | } 712 | 15% { 713 | transform:translateX(-100px) rotate(-5deg); 714 | } 715 | 30% { 716 | transform:translateX(80px) rotate(3deg); 717 | } 718 | 45% { 719 | transform:translateX(-65px) rotate(-3deg); 720 | } 721 | 60% { 722 | transform:translateX(40px) rotate(2deg); 723 | } 724 | 75% { 725 | transform:translateX(-20px) rotate(-1deg); 726 | } 727 | 100% { 728 | transform:translateX(0); 729 | } 730 | } 731 | /* 震铃 */ 732 | @keyframes ring{ 733 | 0%{ 734 | transform:scale(1); 735 | } 736 | 10%,20%{ 737 | transform:scale(0.9) rotate(-3deg); 738 | } 739 | 30%,50%,70%,90%{ 740 | transform:scale(1.1) rotate(3deg); 741 | } 742 | 40%,60%,80%{ 743 | transform:scale(1.1) rotate(-3deg); 744 | } 745 | 100%{ 746 | transform:scale(1) rotate(0); 747 | } 748 | } 749 | /*从右变形淡入效果*/ 750 | @keyframes speedR { 751 | 0% { 752 | transform:translate3d(100%, 0, 0) skewX(-30deg); 753 | transform:translate3d(100%, 0, 0) skewX(-30deg); 754 | opacity:0 755 | } 756 | 60% { 757 | transform:skewX(20deg); 758 | transform:skewX(20deg); 759 | opacity:1 760 | } 761 | 80% { 762 | transform:skewX(-5deg); 763 | transform:skewX(-5deg); 764 | opacity:1 765 | } 766 | 100% { 767 | transform:none; 768 | transform:none; 769 | opacity:1 770 | } 771 | } 772 | /*水滴抖动*/ 773 | @keyframes waterDrops { 774 | 0% { 775 | -webkit-transform: scale(1.2, 0.8); 776 | transform: scale(1.2, 0.8); 777 | -ms-transform: scale(1.2, 0.8); 778 | transform: scale(1.2, 0.8); 779 | } 780 | 1% { 781 | -webkit-transform: scale(1.18, 0.82); 782 | transform: scale(1.18, 0.82); 783 | -ms-transform: scale(1.18, 0.82); 784 | transform: scale(1.18, 0.82); 785 | } 786 | 2% { 787 | -webkit-transform: scale(1.16, 0.84); 788 | transform: scale(1.16, 0.84); 789 | -ms-transform: scale(1.16, 0.84); 790 | transform: scale(1.16, 0.84); 791 | } 792 | 3% { 793 | -webkit-transform: scale(1.13, 0.87); 794 | transform: scale(1.13, 0.87); 795 | -ms-transform: scale(1.13, 0.87); 796 | transform: scale(1.13, 0.87); 797 | } 798 | 4% { 799 | -webkit-transform: scale(1.1, 0.9); 800 | transform: scale(1.1, 0.9); 801 | -ms-transform: scale(1.1, 0.9); 802 | transform: scale(1.1, 0.9); 803 | } 804 | 5% { 805 | -webkit-transform: scale(1.07, 0.93); 806 | transform: scale(1.07, 0.93); 807 | -ms-transform: scale(1.07, 0.93); 808 | transform: scale(1.07, 0.93); 809 | } 810 | 6% { 811 | -webkit-transform: scale(1.04, 0.96); 812 | transform: scale(1.04, 0.96); 813 | -ms-transform: scale(1.04, 0.96); 814 | transform: scale(1.04, 0.96); 815 | } 816 | 7% { 817 | -webkit-transform: scale(1.01, 0.99); 818 | transform: scale(1.01, 0.99); 819 | -ms-transform: scale(1.01, 0.99); 820 | transform: scale(1.01, 0.99); 821 | } 822 | 8% { 823 | -webkit-transform: scale(0.99, 1.01); 824 | transform: scale(0.99, 1.01); 825 | -ms-transform: scale(0.99, 1.01); 826 | transform: scale(0.99, 1.01); 827 | } 828 | 9% { 829 | -webkit-transform: scale(0.97, 1.03); 830 | transform: scale(0.97, 1.03); 831 | -ms-transform: scale(0.97, 1.03); 832 | transform: scale(0.97, 1.03); 833 | } 834 | 10% { 835 | -webkit-transform: scale(0.95, 1.05); 836 | transform: scale(0.95, 1.05); 837 | -ms-transform: scale(0.95, 1.05); 838 | transform: scale(0.95, 1.05); 839 | } 840 | 11% { 841 | -webkit-transform: scale(0.94, 1.06); 842 | transform: scale(0.94, 1.06); 843 | -ms-transform: scale(0.94, 1.06); 844 | transform: scale(0.94, 1.06); 845 | } 846 | 12% { 847 | -webkit-transform: scale(0.93, 1.07); 848 | transform: scale(0.93, 1.07); 849 | -ms-transform: scale(0.93, 1.07); 850 | transform: scale(0.93, 1.07); 851 | } 852 | 13% { 853 | -webkit-transform: scale(0.93, 1.07); 854 | transform: scale(0.93, 1.07); 855 | -ms-transform: scale(0.93, 1.07); 856 | transform: scale(0.93, 1.07); 857 | } 858 | 14% { 859 | -webkit-transform: scale(0.93, 1.07); 860 | transform: scale(0.93, 1.07); 861 | -ms-transform: scale(0.93, 1.07); 862 | transform: scale(0.93, 1.07); 863 | } 864 | 15% { 865 | -webkit-transform: scale(0.93, 1.07); 866 | transform: scale(0.93, 1.07); 867 | -ms-transform: scale(0.93, 1.07); 868 | transform: scale(0.93, 1.07); 869 | } 870 | 16% { 871 | -webkit-transform: scale(0.94, 1.06); 872 | transform: scale(0.94, 1.06); 873 | -ms-transform: scale(0.94, 1.06); 874 | transform: scale(0.94, 1.06); 875 | } 876 | 17% { 877 | -webkit-transform: scale(0.94, 1.06); 878 | transform: scale(0.94, 1.06); 879 | -ms-transform: scale(0.94, 1.06); 880 | transform: scale(0.94, 1.06); 881 | } 882 | 18% { 883 | -webkit-transform: scale(0.95, 1.05); 884 | transform: scale(0.95, 1.05); 885 | -ms-transform: scale(0.95, 1.05); 886 | transform: scale(0.95, 1.05); 887 | } 888 | 19% { 889 | -webkit-transform: scale(0.96, 1.04); 890 | transform: scale(0.96, 1.04); 891 | -ms-transform: scale(0.96, 1.04); 892 | transform: scale(0.96, 1.04); 893 | } 894 | 20% { 895 | -webkit-transform: scale(0.98, 1.02); 896 | transform: scale(0.98, 1.02); 897 | -ms-transform: scale(0.98, 1.02); 898 | transform: scale(0.98, 1.02); 899 | } 900 | 21% { 901 | -webkit-transform: scale(0.99, 1.01); 902 | transform: scale(0.99, 1.01); 903 | -ms-transform: scale(0.99, 1.01); 904 | transform: scale(0.99, 1.01); 905 | } 906 | 22% { 907 | -webkit-transform: scale(1, 1); 908 | transform: scale(1, 1); 909 | -ms-transform: scale(1, 1); 910 | transform: scale(1, 1); 911 | } 912 | 23% { 913 | -webkit-transform: scale(1, 1); 914 | transform: scale(1, 1); 915 | -ms-transform: scale(1, 1); 916 | transform: scale(1, 1); 917 | } 918 | 24% { 919 | -webkit-transform: scale(1.01, 0.99); 920 | transform: scale(1.01, 0.99); 921 | -ms-transform: scale(1.01, 0.99); 922 | transform: scale(1.01, 0.99); 923 | } 924 | 25% { 925 | -webkit-transform: scale(1.02, 0.98); 926 | transform: scale(1.02, 0.98); 927 | -ms-transform: scale(1.02, 0.98); 928 | transform: scale(1.02, 0.98); 929 | } 930 | 26% { 931 | -webkit-transform: scale(1.02, 0.98); 932 | transform: scale(1.02, 0.98); 933 | -ms-transform: scale(1.02, 0.98); 934 | transform: scale(1.02, 0.98); 935 | } 936 | 27% { 937 | -webkit-transform: scale(1.02, 0.98); 938 | transform: scale(1.02, 0.98); 939 | -ms-transform: scale(1.02, 0.98); 940 | transform: scale(1.02, 0.98); 941 | } 942 | 28% { 943 | -webkit-transform: scale(1.03, 0.97); 944 | transform: scale(1.03, 0.97); 945 | -ms-transform: scale(1.03, 0.97); 946 | transform: scale(1.03, 0.97); 947 | } 948 | 29% { 949 | -webkit-transform: scale(1.03, 0.97); 950 | transform: scale(1.03, 0.97); 951 | -ms-transform: scale(1.03, 0.97); 952 | transform: scale(1.03, 0.97); 953 | } 954 | 30% { 955 | -webkit-transform: scale(1.02, 0.98); 956 | transform: scale(1.02, 0.98); 957 | -ms-transform: scale(1.02, 0.98); 958 | transform: scale(1.02, 0.98); 959 | } 960 | 31% { 961 | -webkit-transform: scale(1.02, 0.98); 962 | transform: scale(1.02, 0.98); 963 | -ms-transform: scale(1.02, 0.98); 964 | transform: scale(1.02, 0.98); 965 | } 966 | 32% { 967 | -webkit-transform: scale(1.02, 0.98); 968 | transform: scale(1.02, 0.98); 969 | -ms-transform: scale(1.02, 0.98); 970 | transform: scale(1.02, 0.98); 971 | } 972 | 33% { 973 | -webkit-transform: scale(1.02, 0.98); 974 | transform: scale(1.02, 0.98); 975 | -ms-transform: scale(1.02, 0.98); 976 | transform: scale(1.02, 0.98); 977 | } 978 | 34% { 979 | -webkit-transform: scale(1.01, 0.99); 980 | transform: scale(1.01, 0.99); 981 | -ms-transform: scale(1.01, 0.99); 982 | transform: scale(1.01, 0.99); 983 | } 984 | 35% { 985 | -webkit-transform: scale(1.01, 0.99); 986 | transform: scale(1.01, 0.99); 987 | -ms-transform: scale(1.01, 0.99); 988 | transform: scale(1.01, 0.99); 989 | } 990 | 36% { 991 | -webkit-transform: scale(1.01, 0.99); 992 | transform: scale(1.01, 0.99); 993 | -ms-transform: scale(1.01, 0.99); 994 | transform: scale(1.01, 0.99); 995 | } 996 | 37% { 997 | -webkit-transform: scale(1, 1); 998 | transform: scale(1, 1); 999 | -ms-transform: scale(1, 1); 1000 | transform: scale(1, 1); 1001 | } 1002 | 38% { 1003 | -webkit-transform: scale(1, 1); 1004 | transform: scale(1, 1); 1005 | -ms-transform: scale(1, 1); 1006 | transform: scale(1, 1); 1007 | } 1008 | 39% { 1009 | -webkit-transform: scale(1, 1); 1010 | transform: scale(1, 1); 1011 | -ms-transform: scale(1, 1); 1012 | transform: scale(1, 1); 1013 | } 1014 | 40% { 1015 | -webkit-transform: scale(0.99, 1.01); 1016 | transform: scale(0.99, 1.01); 1017 | -ms-transform: scale(0.99, 1.01); 1018 | transform: scale(0.99, 1.01); 1019 | } 1020 | 41% { 1021 | -webkit-transform: scale(0.99, 1.01); 1022 | transform: scale(0.99, 1.01); 1023 | -ms-transform: scale(0.99, 1.01); 1024 | transform: scale(0.99, 1.01); 1025 | } 1026 | 42% { 1027 | -webkit-transform: scale(0.99, 1.01); 1028 | transform: scale(0.99, 1.01); 1029 | -ms-transform: scale(0.99, 1.01); 1030 | transform: scale(0.99, 1.01); 1031 | } 1032 | 43% { 1033 | -webkit-transform: scale(0.99, 1.01); 1034 | transform: scale(0.99, 1.01); 1035 | -ms-transform: scale(0.99, 1.01); 1036 | transform: scale(0.99, 1.01); 1037 | } 1038 | 44% { 1039 | -webkit-transform: scale(0.99, 1.01); 1040 | transform: scale(0.99, 1.01); 1041 | -ms-transform: scale(0.99, 1.01); 1042 | transform: scale(0.99, 1.01); 1043 | } 1044 | 45% { 1045 | -webkit-transform: scale(0.99, 1.01); 1046 | transform: scale(0.99, 1.01); 1047 | -ms-transform: scale(0.99, 1.01); 1048 | transform: scale(0.99, 1.01); 1049 | } 1050 | 46% { 1051 | -webkit-transform: scale(0.99, 1.01); 1052 | transform: scale(0.99, 1.01); 1053 | -ms-transform: scale(0.99, 1.01); 1054 | transform: scale(0.99, 1.01); 1055 | } 1056 | 47% { 1057 | -webkit-transform: scale(0.99, 1.01); 1058 | transform: scale(0.99, 1.01); 1059 | -ms-transform: scale(0.99, 1.01); 1060 | transform: scale(0.99, 1.01); 1061 | } 1062 | 48% { 1063 | -webkit-transform: scale(0.99, 1.01); 1064 | transform: scale(0.99, 1.01); 1065 | -ms-transform: scale(0.99, 1.01); 1066 | transform: scale(0.99, 1.01); 1067 | } 1068 | 49% { 1069 | -webkit-transform: scale(1, 1); 1070 | transform: scale(1, 1); 1071 | -ms-transform: scale(1, 1); 1072 | transform: scale(1, 1); 1073 | } 1074 | } -------------------------------------------------------------------------------- /src/assets/fonts/iconfont.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Created by FontForge 20120731 at Mon May 29 09:02:12 2017 6 | By admin 7 | 8 | 9 | 10 | 24 | 26 | 28 | 30 | 32 | 34 | 38 | 41 | 44 | 47 | 51 | 55 | 60 | 64 | 66 | 68 | 74 | 78 | 83 | 85 | 88 | 94 | 98 | 102 | 108 | 112 | 115 | 121 | 124 | 130 | 135 | 141 | 145 | 148 | 151 | 156 | 159 | 162 | 166 | 169 | 172 | 176 | 181 | 185 | 188 | 190 | 192 | 196 | 216 | 220 | 221 | 222 | --------------------------------------------------------------------------------