├── .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 | 6 | 7 | 18 | 19 | 29 | -------------------------------------------------------------------------------- /example/src/BackTopDemo.vue: -------------------------------------------------------------------------------- 1 | 157 | 195 | 280 | -------------------------------------------------------------------------------- /example/src/Demo.vue: -------------------------------------------------------------------------------- 1 | 25 | 58 | -------------------------------------------------------------------------------- /example/src/fonts/icomoon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Generated by IcoMoon 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /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 = ` 4 | ` 9 | 10 | export const sourcecodeB = ` 15 | 20 | ` 29 | 30 | export const sourcecodeC = ` 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 | 4 | 5 | Created by FontForge 20120731 at Wed Jul 19 15:04:19 2017 6 | By admin 7 | 8 | 9 | 10 | 24 | 26 | 28 | 30 | 32 | 34 | 38 | 40 | 41 | 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 | 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 | 4 | 5 | Created by FontForge 20120731 at Wed Jul 19 15:04:19 2017 6 | By admin 7 | 8 | 9 | 10 | 24 | 26 | 28 | 30 | 32 | 34 | 38 | 40 | 41 | 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 | --------------------------------------------------------------------------------