├── .babelrc
├── .gitattributes
├── .gitignore
├── LICENSE
├── README.md
├── build
├── gh-pages.sh
├── webpack.config.js
├── webpack.example.base.conf.js
├── webpack.example.dev.conf.js
└── webpack.example.prod.conf.js
├── example
├── index.html
└── src
│ ├── App.vue
│ ├── BackTopDemo.vue
│ ├── Demo.vue
│ ├── fonts
│ ├── icomoon.svg
│ ├── icomoon.ttf
│ └── icomoon.woff
│ ├── main.js
│ ├── styles
│ └── less
│ │ ├── style.less
│ │ └── variables.less
│ └── template.js
├── lib
├── back-top.js
└── vm-font.svg
├── package.json
└── src
├── components
└── back-top.vue
├── fonts
├── vm-font.eot
├── vm-font.svg
├── vm-font.ttf
└── vm-font.woff
├── index.js
├── styles
└── less
│ ├── back-top.less
│ ├── base.less
│ ├── font.less
│ └── index.less
└── utils
├── assist.js
└── dom.js
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | ["env", { "modules": false }]
4 | ]
5 | }
6 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | **/*.js linguist-language=Vue
2 | **/*.less linguist-language=Vue
3 | **/*.css linguist-language=Vue
4 | **/*.html linguist-language=Vue
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | .idea
4 | example/dist
5 | gh-pages
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 vue-multiple
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # back-top
2 |
3 | > Vue-based back-top component
4 |
5 | ## Install
6 |
7 | ```bash
8 | npm install vue-multiple-back-top -S
9 | ```
10 |
11 | ## Quick Start
12 |
13 | ```bash
14 | import Vue from 'vue'
15 | import VmBackTop from 'vue-multiple-back-top'
16 |
17 | Vue.component(VmBackTop.name, VmBackTop)
18 | ```
19 |
20 | For more information, please refer to [back-top](http://vue-multiple.github.io/back-top) in our documentation.
21 |
22 | ## Build Setup
23 |
24 | ``` bash
25 | # install dependencies
26 | npm install
27 |
28 | # serve with hot reload at localhost:8080
29 | npm run demo:dev
30 |
31 | # build for demo with minification
32 | npm run demo:build
33 |
34 | # build for gh-pages with minification
35 | npm run demo:prepublish
36 |
37 | # build for production with minification
38 | npm run build
39 | ```
40 |
41 | ## LICENSE
42 |
43 | [MIT](http://opensource.org/licenses/MIT)
44 |
--------------------------------------------------------------------------------
/build/gh-pages.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | npm run demo:prepublish
3 | cd gh-pages
4 | git init
5 | git add -A
6 | git commit -m 'update gh-pages'
7 | git push -f git@github.com:vue-multiple/back-top.git master:gh-pages
--------------------------------------------------------------------------------
/build/webpack.config.js:
--------------------------------------------------------------------------------
1 | var path = require('path')
2 | var webpack = require('webpack')
3 | var ExtractTextPlugin = require('extract-text-webpack-plugin')
4 |
5 | module.exports = {
6 | entry: './src/index.js',
7 | output: {
8 | path: path.resolve(__dirname, '..', './lib'),
9 | filename: 'back-top.js',
10 | library: 'back-top',
11 | libraryTarget: 'umd'
12 | },
13 | externals: {
14 | vue: {
15 | root: 'Vue',
16 | commonjs: 'vue',
17 | commonjs2: 'vue',
18 | amd: 'vue'
19 | }
20 | },
21 | module: {
22 | rules: [
23 | {
24 | test: /\.vue$/,
25 | loader: 'vue-loader',
26 | options: {
27 | loaders: {
28 | css: 'vue-style-loader!css-loader',
29 | less: 'vue-style-loader!css-loader!less-loader',
30 | }
31 | // other vue-loader options go here
32 | }
33 | },
34 | {
35 | test: /\.css$/,
36 | use: [
37 | { loader: 'style-loader' },
38 | { loader: 'css-loader' }
39 | ]
40 | },
41 | {
42 | test: /\.less$/,
43 | use: [
44 | { loader: 'style-loader' },
45 | { loader: 'css-loader' },
46 | { loader: 'less-loader' }
47 | ]
48 | },
49 | {
50 | test: /\.js$/,
51 | loader: 'babel-loader',
52 | exclude: /node_modules/
53 | },
54 | {
55 | test: /\.(png|jpg|gif|svg)$/,
56 | loader: 'file-loader',
57 | options: {
58 | name: '[name].[ext]?[hash]'
59 | }
60 | },
61 | {
62 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
63 | loader: 'url-loader',
64 | query: {
65 | limit: 10000,
66 | name: path.posix.join('static', 'fonts/[name].[hash:7].[ext]')
67 | }
68 | }
69 | ]
70 | },
71 | resolve: {
72 | extensions: ['.js', '.vue', '.json']
73 | },
74 | plugins: [
75 | new webpack.optimize.UglifyJsPlugin({
76 | sourceMap: true,
77 | compress: {
78 | warnings: false
79 | }
80 | })
81 | ]
82 | }
--------------------------------------------------------------------------------
/build/webpack.example.base.conf.js:
--------------------------------------------------------------------------------
1 | var path = require('path')
2 | var ExtractTextPlugin = require('extract-text-webpack-plugin')
3 | var isProduction = process.env.NODE_ENV === 'production'
4 |
5 | module.exports = {
6 | entry: {
7 | app: './example/src/main.js'
8 | },
9 | output: {
10 | path: '/example',
11 | filename: '[name].js',
12 | publicPath: '/'
13 | },
14 | module: {
15 | rules: [
16 | {
17 | test: /\.vue$/,
18 | loader: 'vue-loader',
19 | options: {
20 | // other vue-loader options go here
21 | loaders: {
22 | css: isProduction ? ExtractTextPlugin.extract({
23 | fallback: 'vue-style-loader',
24 | use: 'css-loader'
25 | }) : 'vue-style-loader!css-loader',
26 | less: isProduction ? ExtractTextPlugin.extract({
27 | fallback: 'vue-style-loader',
28 | use: ['css-loader', 'less-loader']
29 | }) : 'vue-style-loader!css-loader!less-loader'
30 | }
31 | }
32 | },
33 | {
34 | test: /\.js$/,
35 | loader: 'babel-loader',
36 | exclude: /node_modules/
37 | },
38 | {
39 | test: /\.(png|jpg|gif|svg)$/,
40 | loader: 'file-loader',
41 | options: {
42 | name: '[name].[ext]?[hash]'
43 | }
44 | },
45 | {
46 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
47 | loader: 'url-loader',
48 | query: {
49 | limit: 10000,
50 | name: path.posix.join('static', 'fonts/[name].[hash:7].[ext]')
51 | }
52 | }
53 | ]
54 | }
55 | }
--------------------------------------------------------------------------------
/build/webpack.example.dev.conf.js:
--------------------------------------------------------------------------------
1 | var webpack = require('webpack')
2 | var merge = require('webpack-merge')
3 | var baseWebpackConfig = require('./webpack.example.base.conf')
4 | var HtmlWebpackPlugin = require('html-webpack-plugin')
5 | var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
6 |
7 | module.exports = merge(baseWebpackConfig, {
8 | module: {
9 | rules: [
10 | {
11 | test: /\.css$/,
12 | loader: 'vue-style-loader!css-loader'
13 | },
14 | {
15 | test: /\.less$/,
16 | loader: 'vue-style-loader!css-loader!less-loader'
17 | }
18 | ]
19 | },
20 | // cheap-module-eval-source-map is faster for development
21 | devtool: '#cheap-module-eval-source-map',
22 | plugins: [
23 | new webpack.DefinePlugin({
24 | 'process.env': {
25 | NODE_ENV: '"development"'
26 | }
27 | }),
28 | new webpack.NoEmitOnErrorsPlugin(),
29 | new HtmlWebpackPlugin({
30 | filename: 'index.html',
31 | template: 'example/index.html',
32 | inject: true
33 | }),
34 | new FriendlyErrorsPlugin()
35 | ]
36 | })
--------------------------------------------------------------------------------
/build/webpack.example.prod.conf.js:
--------------------------------------------------------------------------------
1 | var path = require('path')
2 | var webpack = require('webpack')
3 | var merge = require('webpack-merge')
4 | var baseWebpackConfig = require('./webpack.example.base.conf')
5 | var HtmlWebpackPlugin = require('html-webpack-plugin')
6 | var ExtractTextPlugin = require('extract-text-webpack-plugin')
7 | var isProduction = process.env.NODE_ENV === 'production'
8 |
9 | module.exports = merge(baseWebpackConfig, {
10 | module: {
11 | rules: [
12 | {
13 | test: /\.css$/,
14 | loader: ExtractTextPlugin.extract({
15 | fallback: "vue-style-loader",
16 | use: "css-loader"
17 | })
18 | },
19 | {
20 | test: /\.less/,
21 | loader: ExtractTextPlugin.extract({
22 | fallback: "vue-style-loader",
23 | use: ["css-loader", "less-loader"]
24 | })
25 | }
26 | ]
27 | },
28 | devtool: '#source-map',
29 | output: {
30 | path: path.resolve(__dirname, '..', `${isProduction ? './example/dist' : 'gh-pages'}`),
31 | publicPath: isProduction ? '/' : '/back-top',
32 | filename: 'js/[name].[chunkhash].js'
33 | },
34 | plugins: [
35 | new webpack.DefinePlugin({
36 | 'process.env': {
37 | NODE_ENV: '"production"'
38 | }
39 | }),
40 | new webpack.optimize.UglifyJsPlugin({
41 | sourceMap: true,
42 | compress: {
43 | warnings: false
44 | }
45 | }),
46 | new ExtractTextPlugin({
47 | filename: 'css/[name].[contenthash].css',
48 | allChunks: true
49 | }),
50 | new HtmlWebpackPlugin({
51 | filename: 'index.html',
52 | template: 'example/index.html',
53 | inject: true,
54 | minify: {
55 | removeComments: true,
56 | collapseWhitespace: true,
57 | removeAttributeQuotes: true
58 | // more options:
59 | // https://github.com/kangax/html-minifier#options-quick-reference
60 | },
61 | // necessary to consistently work with multiple chunks via CommonsChunkPlugin
62 | chunksSortMode: 'dependency'
63 | })
64 | ]
65 | })
66 |
--------------------------------------------------------------------------------
/example/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
7 |
8 | back-top
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/example/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
18 |
19 |
29 |
--------------------------------------------------------------------------------
/example/src/BackTopDemo.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | BackTop 回到顶部
7 |
8 |
9 |
10 | 概述
11 |
12 |
当页面内容冗长,需要快捷返回顶部时使用,一般放置在页面右下角位置。
13 |
14 |
15 |
16 |
17 | 代码示例
18 |
19 |
20 |
21 | 基础用法
22 |
23 |
24 |
25 |
26 |
27 |
28 | 向下滚动页面,灰色的按钮为默认效果。
29 | 默认位置距离页面右部和底部 30px,滚动至距顶端 400px 时显示。
30 |
31 |
32 |
33 |
34 | 自定义样式
35 |
36 | 返回顶端
37 |
38 |
39 |
40 |
41 |
42 |
43 | 向下滚动页面,蓝色的按钮为自定义效果。
44 | 自定义了位置在页面底部 200px,滚动至距顶端 100px 时显示。
45 | 过渡效果为ease,逐渐变慢
46 |
47 |
48 |
49 |
50 | 带导航
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 | 增加了导航配置
59 | 鼠标移到组件上时显示导航
60 | 点击导航页面滚动到该对应位置
61 |
62 |
63 |
64 |
65 |
66 |
67 | Attributes
68 |
69 |
70 |
71 | 参数 |
72 | 说明 |
73 | 类型 |
74 | 可选值 |
75 | 默认值 |
76 |
77 |
78 |
79 | height |
80 | 页面滚动高度达到该值时才显示BackTop组件 |
81 | number |
82 | — |
83 | 400 |
84 |
85 |
86 | bottom |
87 | 组件距离底部的距离 |
88 | number |
89 | — |
90 | 30 |
91 |
92 |
93 | right |
94 | 组件距离右部的距离 |
95 | number |
96 | — |
97 | 30 |
98 |
99 |
100 | duration |
101 | 滚动动画持续时间,单位 毫秒 |
102 | number |
103 | — |
104 | 1000 |
105 |
106 |
107 | timing |
108 | 滚动动画速率变化 |
109 | string |
110 | linear/ease |
111 | linear |
112 |
113 |
114 | options |
115 | 显示导航的配置,每一项需要传显示的label和元素的id |
116 | array |
117 | — |
118 | — |
119 |
120 |
121 | navItemClass |
122 | 导航里每一项的类名 |
123 | string |
124 | — |
125 | — |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 | Events
134 |
135 |
136 |
137 | 事件名称 |
138 | 说明 |
139 | 回调参数 |
140 |
141 |
142 |
143 | click |
144 | 点击按钮时触发 |
145 | 无 |
146 |
147 |
148 | navClick |
149 | 点击导航时触发 |
150 | 点击该项的id |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
195 |
280 |
--------------------------------------------------------------------------------
/example/src/Demo.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
14 |
18 |
19 |
20 | {{ showMeta ? '隐藏代码' : '显示代码' }}
21 |
22 |
23 |
24 |
25 |
58 |
--------------------------------------------------------------------------------
/example/src/fonts/icomoon.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/example/src/fonts/icomoon.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vue-multiple/back-top/e3a194f39aa33d4242d3b76ce7bdaef75f6283c1/example/src/fonts/icomoon.ttf
--------------------------------------------------------------------------------
/example/src/fonts/icomoon.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vue-multiple/back-top/e3a194f39aa33d4242d3b76ce7bdaef75f6283c1/example/src/fonts/icomoon.woff
--------------------------------------------------------------------------------
/example/src/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import App from './App.vue'
3 |
4 | import VueHighlightJS from 'vue-highlightjs'
5 | Vue.use(VueHighlightJS)
6 |
7 | import BackTop from '../../src/index.js'
8 | Vue.component(BackTop.name, BackTop)
9 |
10 | new Vue({
11 | el: '#app',
12 | render: h => h(App)
13 | })
14 |
--------------------------------------------------------------------------------
/example/src/styles/less/style.less:
--------------------------------------------------------------------------------
1 | @import "variables";
2 |
3 | @font-face {
4 | font-family: 'icomoon';
5 | src:
6 | url('@{icomoon-font-path}/icomoon.ttf?tgex06') format('truetype'),
7 | url('@{icomoon-font-path}/icomoon.woff?tgex06') format('woff'),
8 | url('@{icomoon-font-path}/icomoon.svg?tgex06#icomoon') format('svg');
9 | font-weight: normal;
10 | font-style: normal;
11 | }
12 |
13 | [class^="icon-"], [class*=" icon-"] {
14 | /* use !important to prevent issues with browser extensions that change fonts */
15 | font-family: 'icomoon' !important;
16 | speak: none;
17 | font-style: normal;
18 | font-weight: normal;
19 | font-variant: normal;
20 | text-transform: none;
21 | line-height: 1;
22 |
23 | /* Better Font Rendering =========== */
24 | -webkit-font-smoothing: antialiased;
25 | -moz-osx-font-smoothing: grayscale;
26 | }
27 |
28 | .icon-circle-up {
29 | &:before {
30 | content: @icon-circle-up;
31 | }
32 | }
33 | .icon-circle-down {
34 | &:before {
35 | content: @icon-circle-down;
36 | }
37 | }
38 | .icon-embed2 {
39 | &:before {
40 | content: @icon-embed2;
41 | }
42 | }
43 | .icon-embed {
44 | &:before {
45 | content: @icon-embed;
46 | }
47 | }
48 |
49 |
--------------------------------------------------------------------------------
/example/src/styles/less/variables.less:
--------------------------------------------------------------------------------
1 | @icomoon-font-path: "../../fonts";
2 |
3 | @icon-circle-up: "\ea41";
4 | @icon-circle-down: "\ea43";
5 | @icon-embed2: "\ea7f";
6 | @icon-embed: "\ea80";
7 |
8 |
--------------------------------------------------------------------------------
/example/src/template.js:
--------------------------------------------------------------------------------
1 | export const sourcecodeA = `
2 |
3 |
4 | `
9 |
10 | export const sourcecodeB = `
11 |
12 | 返回顶端
13 |
14 |
15 |
20 | `
29 |
30 | export const sourcecodeC = `
31 |
32 |
33 |
34 | `
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/lib/back-top.js:
--------------------------------------------------------------------------------
1 | !function(A,s){"object"==typeof exports&&"object"==typeof module?module.exports=s(require("vue")):"function"==typeof define&&define.amd?define(["vue"],s):"object"==typeof exports?exports["back-top"]=s(require("vue")):A["back-top"]=s(A.Vue)}(this,function(A){return function(A){function s(n){if(t[n])return t[n].exports;var e=t[n]={i:n,l:!1,exports:{}};return A[n].call(e.exports,e,e.exports,s),e.l=!0,e.exports}var t={};return s.m=A,s.c=t,s.i=function(A){return A},s.d=function(A,t,n){s.o(A,t)||Object.defineProperty(A,t,{configurable:!1,enumerable:!0,get:n})},s.n=function(A){var t=A&&A.__esModule?function(){return A.default}:function(){return A};return s.d(t,"a",t),t},s.o=function(A,s){return Object.prototype.hasOwnProperty.call(A,s)},s.p="",s(s.s=4)}([function(A,s){A.exports="data:application/vnd.ms-fontobject;base64,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"},function(A,s,t){var n=t(7);"string"==typeof n&&(n=[[A.i,n,""]]);var e={};e.transform=void 0;t(10)(n,e);n.locals&&(A.exports=n.locals)},function(A,s,t){var n=t(14)(t(3),t(15),null,null,null);n.options.__file="F:\\github-workspace\\back-top\\src\\components\\back-top.vue",n.esModule&&Object.keys(n.esModule).some(function(A){return"default"!==A&&"__"!==A.substr(0,2)})&&console.error("named exports are not supported in *.vue files."),n.options.functional&&console.error("[vue-loader] back-top.vue: functional components are not supported with templates, they should use render functions."),A.exports=n.exports},function(A,s,t){"use strict";function n(A,s,t){return s in A?Object.defineProperty(A,s,{value:t,enumerable:!0,configurable:!0,writable:!0}):A[s]=t,A}Object.defineProperty(s,"__esModule",{value:!0});var e=t(5),i=t(6);s.default={name:"VmBackTop",componentName:"VmBackTop",data:function(){return{backTop:!1,navShow:!1}},props:{height:{type:Number,default:400},bottom:{type:Number,default:30},right:{type:Number,default:30},duration:{type:Number,default:1e3},timing:{type:String,default:"linear"},options:{type:Array,default:function(){return[]}},navItemClass:{type:String,default:""}},mounted:function(){t.i(i.a)(window,"scroll",this.handleScroll),t.i(i.a)(window,"resize",this.handleScroll)},beforeDestroy:function(){t.i(i.b)(window,"scroll",this.handleScroll),t.i(i.b)(window,"resize",this.handleScroll)},computed:{classes:function(){return["vm-back-top",n({},"vm-back-top-show",this.backTop)]},styles:function(){return{bottom:this.bottom+"px",right:this.right+"px"}},innerClasses:function(){return"vm-back-top-inner"},nav:function(){return["vm-back-top-nav"]},navItem:function(){return["vm-back-top-nav-item",""+this.navItemClass]}},methods:{handleScroll:function(){this.backTop=window.pageYOffset>=this.height},back:function(){var A=document.documentElement.scrollTop||document.body.scrollTop;t.i(e.a)(window,A,0,this.duration,this.timing),this.$emit("click")},showNav:function(){this.navShow=!0},hideNav:function(){this.navShow=!1},handleNavClick:function(A){var s=document.documentElement.scrollTop||document.body.scrollTop,n=t.i(i.c)(document.getElementById(A)).y;t.i(e.a)(window,s,n,this.duration,this.timing),this.$emit("navClick",A)}}}},function(A,s,t){"use strict";Object.defineProperty(s,"__esModule",{value:!0});var n=t(2),e=t.n(n),i=t(1);t.n(i);s.default=e.a},function(A,s,t){"use strict";function n(A){function s(t,n,e){if(t!==n){var i=t+e>n?n:t+e;t>n&&(i=t-e0?Math.ceil(e):Math.floor(e);var i=s+e>n?n:s+e;s>n&&(i=s-e1&&void 0!==arguments[1]?arguments[1]:0,e=arguments[2],i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:500,o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"linear";window.requestAnimationFrame||(window.requestAnimationFrame=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.msRequestAnimationFrame||function(A){return window.setTimeout(A,1e3/60)});var r=Math.abs(n-e),B=Math.ceil(r/(60*i/1e3)),w=1/(1-Math.pow(10/r,1/(60*i/1e3-10)));"ease"===o?t(n,e):s(n,e,B)}s.a=n},function(A,s,t){"use strict";t.d(s,"a",function(){return o}),t.d(s,"b",function(){return r}),t.d(s,"c",function(){return B});var n=t(16),e=t.n(n),i=e.a.prototype.$isServer,o=function(){return!i&&document.addEventListener?function(A,s,t){A&&s&&t&&A.addEventListener(s,t,!1)}:function(A,s,t){A&&s&&t&&A.attachEvent("on"+s,t)}}(),r=function(){return!i&&document.removeEventListener?function(A,s,t){A&&s&&A.removeEventListener(s,t,!1)}:function(A,s,t){A&&s&&A.detachEvent("on"+s,t)}}(),B=function(A){for(var s=A.offsetLeft,t=A.offsetTop;A=A.offsetParent;)s+=A.offsetLeft,t+=A.offsetTop;return{x:s,y:t}}},function(A,s,t){s=A.exports=t(8)(void 0),s.push([A.i,'@font-face {\n font-family: "vm-backtop-font";\n src: url('+t(0)+");\n /* IE9*/\n src: url("+t(0)+"#iefix) format('embedded-opentype'), url("+t(13)+") format('woff'), url("+t(12)+") format('truetype'), url("+t(9)+'#iconfont) format(\'svg\');\n /* iOS 4.1- */\n}\n.vm-backtop-icon-een {\n display: inline-block;\n font-family: "vm-backtop-font" !important;\n font-size: 16px;\n font-style: normal;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.vm-backtop-icon-een:before {\n content: "\\E607";\n}\n.vm-back-top {\n z-index: 10;\n position: fixed;\n cursor: pointer;\n display: none;\n}\n.vm-back-top.vm-back-top-show {\n display: block;\n}\n.vm-back-top-inner {\n background-color: rgba(0, 0, 0, 0.6);\n border-radius: 2px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n transition: all 0.2s ease-in-out;\n}\n.vm-back-top-inner:hover {\n background-color: rgba(0, 0, 0, 0.7);\n}\n.vm-back-top i {\n color: #fff;\n font-size: 24px;\n padding: 8.5px 10px;\n}\n.vm-back-top-nav {\n position: absolute;\n right: 100%;\n bottom: 0;\n border-radius: 3px;\n overflow: hidden;\n}\n.vm-back-top-nav-item {\n height: 30px;\n line-height: 30px;\n text-align: left;\n background-color: rgba(0, 0, 0, 0.6);\n color: #fff;\n padding: 2px 10px;\n white-space: nowrap;\n}\n.vm-back-top-nav-item:hover {\n background-color: rgba(0, 0, 0, 0.7);\n}\n',""])},function(A,s){function t(A,s){var t=A[1]||"",e=A[3];if(!e)return t;if(s&&"function"==typeof btoa){var i=n(e);return[t].concat(e.sources.map(function(A){return"/*# sourceURL="+e.sourceRoot+A+" */"})).concat([i]).join("\n")}return[t].join("\n")}function n(A){return"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(A))))+" */"}A.exports=function(A){var s=[];return s.toString=function(){return this.map(function(s){var n=t(s,A);return s[2]?"@media "+s[2]+"{"+n+"}":n}).join("")},s.i=function(A,t){"string"==typeof A&&(A=[[null,A,""]]);for(var n={},e=0;e=0&&I.splice(s,1)}function r(A){var s=document.createElement("style");return A.attrs.type="text/css",w(s,A.attrs),i(A,s),s}function B(A){var s=document.createElement("link");return A.attrs.type="text/css",A.attrs.rel="stylesheet",w(s,A.attrs),i(A,s),s}function w(A,s){Object.keys(s).forEach(function(t){A.setAttribute(t,s[t])})}function g(A,s){var t,n,e,i;if(s.transform&&A.css){if(!(i=s.transform(A.css)))return function(){};A.css=i}if(s.singleton){var w=l++;t=u||(u=r(s)),n=C.bind(null,t,w,!1),e=C.bind(null,t,w,!0)}else A.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(t=B(s),n=Q.bind(null,t,s),e=function(){o(t),t.href&&URL.revokeObjectURL(t.href)}):(t=r(s),n=c.bind(null,t),e=function(){o(t)});return n(A),function(s){if(s){if(s.css===A.css&&s.media===A.media&&s.sourceMap===A.sourceMap)return;n(A=s)}else e()}}function C(A,s,t,n){var e=t?"":n.css;if(A.styleSheet)A.styleSheet.cssText=f(s,e);else{var i=document.createTextNode(e),o=A.childNodes;o[s]&&A.removeChild(o[s]),o.length?A.insertBefore(i,o[s]):A.appendChild(i)}}function c(A,s){var t=s.css,n=s.media;if(n&&A.setAttribute("media",n),A.styleSheet)A.styleSheet.cssText=t;else{for(;A.firstChild;)A.removeChild(A.firstChild);A.appendChild(document.createTextNode(t))}}function Q(A,s,t){var n=t.css,e=t.sourceMap,i=void 0===s.convertToAbsoluteUrls&&e;(s.convertToAbsoluteUrls||i)&&(n=L(n)),e&&(n+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(e))))+" */");var o=new Blob([n],{type:"text/css"}),r=A.href;A.href=URL.createObjectURL(o),r&&URL.revokeObjectURL(r)}var a={},y=function(A){var s;return function(){return void 0===s&&(s=A.apply(this,arguments)),s}}(function(){return window&&document&&document.all&&!window.atob}),E=function(A){var s={};return function(t){return void 0===s[t]&&(s[t]=A.call(this,t)),s[t]}}(function(A){return document.querySelector(A)}),u=null,l=0,I=[],L=t(11);A.exports=function(A,s){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");s=s||{},s.attrs="object"==typeof s.attrs?s.attrs:{},s.singleton||(s.singleton=y()),s.insertInto||(s.insertInto="head"),s.insertAt||(s.insertAt="bottom");var t=e(A,s);return n(t,s),function(A){for(var i=[],o=0;o
2 |
3 |
42 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vue-multiple-back-top",
3 | "description": "Vue-based back-top component",
4 | "version": "1.0.2",
5 | "author": "vue-multiple",
6 | "main": "lib/back-top.js",
7 | "files": [
8 | "lib",
9 | "build",
10 | "example",
11 | "src"
12 | ],
13 | "scripts": {
14 | "build": "rm -rf ./lib && webpack --config ./build/webpack.config.js --progress --hide-modules",
15 | "demo:dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot --config ./build/webpack.example.dev.conf.js",
16 | "demo:build": "rm -rf ./example/dist && cross-env NODE_ENV=production webpack --config ./build/webpack.example.prod.conf.js",
17 | "demo:prepublish": "rm -rf ./gh-pages && cross-env NODE_ENV=prepublish webpack --config ./build/webpack.example.prod.conf.js",
18 | "deploy": "bash ./build/gh-pages.sh"
19 | },
20 | "repository": {
21 | "type": "git",
22 | "url": "git@github.com:vue-multiple/back-top.git"
23 | },
24 | "keywords": [
25 | "vue",
26 | "back-top",
27 | "backtop",
28 | "back-to-top",
29 | "components"
30 | ],
31 | "license": "MIT",
32 | "bugs": {
33 | "url": "https://github.com/vue-multiple/back-top/issues"
34 | },
35 | "unpkg": "lib/back-top.js",
36 | "dependencies": {
37 | "vue": "^2.3.3"
38 | },
39 | "devDependencies": {
40 | "autoprefixer-loader": "^3.2.0",
41 | "babel-core": "^6.0.0",
42 | "babel-loader": "^6.0.0",
43 | "babel-plugin-component": "^0.9.1",
44 | "babel-preset-env": "^1.5.1",
45 | "cross-env": "^5.0.0",
46 | "css-loader": "^0.28.4",
47 | "extract-text-webpack-plugin": "^2.1.0",
48 | "file-loader": "^0.9.0",
49 | "friendly-errors-webpack-plugin": "^1.6.1",
50 | "html-webpack-plugin": "^2.28.0",
51 | "less": "^2.7.2",
52 | "less-loader": "^4.0.5",
53 | "style-loader": "^0.18.2",
54 | "url-loader": "^0.5.8",
55 | "vue-highlightjs": "^1.3.3",
56 | "vue-loader": "^12.1.0",
57 | "vue-style-loader": "^3.0.1",
58 | "vue-template-compiler": "^2.3.3",
59 | "webpack": "^2.6.1",
60 | "webpack-dev-server": "^2.4.5",
61 | "webpack-hot-middleware": "^2.18.0",
62 | "webpack-merge": "^4.1.0"
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/src/components/back-top.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
{{ item.label }}
10 |
11 |
12 |
13 |
14 |
122 |
123 |
--------------------------------------------------------------------------------
/src/fonts/vm-font.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vue-multiple/back-top/e3a194f39aa33d4242d3b76ce7bdaef75f6283c1/src/fonts/vm-font.eot
--------------------------------------------------------------------------------
/src/fonts/vm-font.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
42 |
--------------------------------------------------------------------------------
/src/fonts/vm-font.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vue-multiple/back-top/e3a194f39aa33d4242d3b76ce7bdaef75f6283c1/src/fonts/vm-font.ttf
--------------------------------------------------------------------------------
/src/fonts/vm-font.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vue-multiple/back-top/e3a194f39aa33d4242d3b76ce7bdaef75f6283c1/src/fonts/vm-font.woff
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import BackTop from './components/back-top.vue'
2 | import './styles/less/index.less'
3 |
4 | export default BackTop
--------------------------------------------------------------------------------
/src/styles/less/back-top.less:
--------------------------------------------------------------------------------
1 | @backtop-prefix-cls: ~"@{vm-prefix}back-top";
2 |
3 | .@{backtop-prefix-cls} {
4 | z-index: @zindex-back-top;
5 | position: fixed;
6 | cursor: pointer;
7 | display: none;
8 |
9 | &.@{backtop-prefix-cls}-show {
10 | display: block;
11 | }
12 |
13 | &-inner {
14 | background-color: rgba(0,0,0,.6);
15 | border-radius: 2px;
16 | box-shadow: 0 1px 3px rgba(0,0,0,.2);
17 | transition: all @transition-time @ease-in-out;
18 |
19 | &:hover {
20 | background-color: rgba(0,0,0,.7);
21 | }
22 | }
23 |
24 | i{
25 | color: #fff;
26 | font-size: 24px;
27 | padding: 8.5px 10px;
28 | }
29 | &-nav {
30 | position: absolute;
31 | right: 100%;
32 | bottom:0;
33 | border-radius: 3px;
34 | overflow: hidden;
35 | &-item{
36 | height: 30px;
37 | line-height: 30px;
38 | text-align: left;
39 | background-color: rgba(0,0,0,.6);
40 | color: #fff;
41 | padding: 2px 10px;
42 | white-space: nowrap;
43 | &:hover {
44 | background-color: rgba(0,0,0,.7);
45 | }
46 | }
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/src/styles/less/base.less:
--------------------------------------------------------------------------------
1 | // Prefix
2 | @vm-prefix: "vm-";
3 | @icomoon-font-path: "../../fonts";
4 |
5 | // Z-index
6 | @zindex-back-top: 10;
7 |
8 | // Animation
9 | @animation-time: .3s;
10 | @transition-time: .2s;
11 | @ease-in-out: ease-in-out;
--------------------------------------------------------------------------------
/src/styles/less/font.less:
--------------------------------------------------------------------------------
1 | @font-face {font-family: "vm-backtop-font";
2 | src: url('@{icomoon-font-path}/vm-font.eot?t=1500447860026'); /* IE9*/
3 | src: url('@{icomoon-font-path}/vm-font.eot?t=1500447860026#iefix') format('embedded-opentype'), /* IE6-IE8 */
4 | url('@{icomoon-font-path}/vm-font.woff?t=1500447860026') format('woff'), /* chrome, firefox */
5 | url('@{icomoon-font-path}/vm-font.ttf?t=1500447860026') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
6 | url('@{icomoon-font-path}/vm-font.svg?t=1500447860026#iconfont') format('svg'); /* iOS 4.1- */
7 | }
8 |
9 | .vm-backtop-icon-een {
10 | display: inline-block;
11 | font-family:"vm-backtop-font" !important;
12 | font-size:16px;
13 | font-style:normal;
14 | -webkit-font-smoothing: antialiased;
15 | -moz-osx-font-smoothing: grayscale;
16 | }
17 |
18 | .vm-backtop-icon-een:before { content: "\e607"; }
19 |
--------------------------------------------------------------------------------
/src/styles/less/index.less:
--------------------------------------------------------------------------------
1 | @import "./base.less";
2 | @import "./font.less";
3 | @import "./back-top.less";
--------------------------------------------------------------------------------
/src/utils/assist.js:
--------------------------------------------------------------------------------
1 | // scrollTop animation
2 | export function scrollTop(el, from = 0, to, duration = 500, timing = 'linear') {
3 | if (!window.requestAnimationFrame) {
4 | window.requestAnimationFrame = (
5 | window.webkitRequestAnimationFrame ||
6 | window.mozRequestAnimationFrame ||
7 | window.msRequestAnimationFrame ||
8 | function (callback) {
9 | return window.setTimeout(callback, 1000 / 60);
10 | }
11 | );
12 | }
13 | const difference = Math.abs(from - to);
14 | const step = Math.ceil(difference / (duration*60 / 1000));
15 | const scale = 1/(1 - Math.pow(10/difference,1/(60*duration/1000 -10)));
16 |
17 | function scrollLinear(start, end, step) {
18 | if (start === end) return;
19 | let d = (start + step > end) ? end : start + step;
20 |
21 | if (start > end) {
22 | d = (start - step < end) ? end : start - step;
23 | }
24 |
25 | if (el === window) {
26 | window.scrollTo(d, d);
27 | } else {
28 | el.scrollTop = d;
29 | }
30 | window.requestAnimationFrame(() => scrollLinear(d, end, step));
31 | }
32 |
33 | function scrollEase(start, end) {
34 | if (start === end) return;
35 | let stepNum = Math.ceil(Math.abs(start - end) / scale);
36 | stepNum = stepNum > 0 ? Math.ceil(stepNum) : Math.floor(stepNum);
37 |
38 | let d = (start + stepNum > end) ? end : start + stepNum;
39 |
40 | if (start > end) {
41 | d = (start - stepNum < end) ? end : start - stepNum;
42 | }
43 | if (el === window) {
44 | window.scrollTo(d, d);
45 | } else {
46 | el.scrollTop = d;
47 | }
48 | window.requestAnimationFrame(() => scrollEase(d, end));
49 | }
50 |
51 | if (timing === 'ease') {
52 | scrollEase(from, to)
53 | } else {
54 | scrollLinear(from, to, step);
55 | }
56 |
57 | }
--------------------------------------------------------------------------------
/src/utils/dom.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | const isServer = Vue.prototype.$isServer;
3 |
4 | export const on = (function() {
5 | if (!isServer && document.addEventListener) {
6 | return function(element, event, handler) {
7 | if (element && event && handler) {
8 | element.addEventListener(event, handler, false);
9 | }
10 | };
11 | } else {
12 | return function(element, event, handler) {
13 | if (element && event && handler) {
14 | element.attachEvent('on' + event, handler);
15 | }
16 | };
17 | }
18 | })();
19 |
20 | export const off = (function() {
21 | if (!isServer && document.removeEventListener) {
22 | return function(element, event, handler) {
23 | if (element && event) {
24 | element.removeEventListener(event, handler, false);
25 | }
26 | };
27 | } else {
28 | return function(element, event, handler) {
29 | if (element && event) {
30 | element.detachEvent('on' + event, handler);
31 | }
32 | };
33 | }
34 | })();
35 |
36 | export const getAbsPoint = e => {
37 | var x = e.offsetLeft;
38 | var y = e.offsetTop;
39 | while(e = e.offsetParent)
40 | {
41 | x += e.offsetLeft;
42 | y += e.offsetTop;
43 | }
44 | return {'x': x, 'y': y};
45 | };
46 |
--------------------------------------------------------------------------------