├── 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 |
2 |
3 |
4 |
5 |
6 |
13 |
14 |
15 |
18 |
--------------------------------------------------------------------------------
/src/components/item/item.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | Item # {{ index }}
4 |
5 |
6 |
7 |
12 |
13 |
14 |
23 |
--------------------------------------------------------------------------------
/src/views/404/404.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
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 |
2 |
3 |
4 |
5 |
6 |
{{title}}
7 |
8 |
9 |
49 |
50 |
51 |
80 |
--------------------------------------------------------------------------------
/src/components/v-input/currency.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | {{ label }}
4 |
10 |
11 |
12 |
56 |
57 |
58 |
61 |
--------------------------------------------------------------------------------
/src/components/v-list/novelty.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | {{type}}
9 |
10 | {{times}}
11 | {{repoName}}
12 |
13 |
{{title}}
14 |
15 |
16 |
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 |
2 |
3 |
74 |
75 |
76 |
79 |
--------------------------------------------------------------------------------
/src/components/popup/dialog.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
47 |
48 |
49 |
88 |
--------------------------------------------------------------------------------
/src/components/heads/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
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 |
2 |
11 |
12 |
13 |
56 |
57 |
58 |
97 |
--------------------------------------------------------------------------------
/src/components/button/button.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
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 |
2 |
3 |
5 |
6 |
7 |
8 |
{{name.title || title_text}}
9 |
{{name.dec || title_dec}}
10 |
13 |
14 |
15 |
16 |
17 |
51 |
52 |
53 |
161 |
--------------------------------------------------------------------------------
/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
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 |
2 |
7 |
8 |
9 |
{{title}}
10 |
11 |
12 |
13 |
23 |
24 |
25 |
26 |
92 |
93 |
94 |
188 |
--------------------------------------------------------------------------------
/src/components/vote/voteItem.vue:
--------------------------------------------------------------------------------
1 |
2 | {{popups}}
3 |
4 |
5 |
9 |
10 |
11 |
12 | {{dVote.full_name}}
13 | {{dVote.description}}
14 |
15 |
16 | {{dVote.forks_count}}
17 |
18 | 关注
19 |
20 |
21 |
22 |
23 |
24 |
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 |
55 |
56 |
极速加载中...
57 |
58 |
59 |
60 |
63 |
64 |
65 |
--------------------------------------------------------------------------------
/src/components/v-list/copy.vue:
--------------------------------------------------------------------------------
1 |
2 |
7 |
49 |
50 |
51 |
116 |
117 |
118 |
240 |
--------------------------------------------------------------------------------
/src/views/index/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
11 |
12 |
{{T1.pageT1}}
13 |
14 |
{{T2.pageT2}}
15 |
16 |
17 |
18 |
19 |
20 |
21 |
24 |
25 |
26 | {{List.Name.charAt(0)}}
27 |
28 |
29 |
30 |
{{List.Name}}
31 |
32 |
{{List.Title}}
33 |
34 |
35 |
36 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
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 |
--------------------------------------------------------------------------------