基于Vue的文字跑马灯组件(npm 组件包)


Posted in Javascript onMay 24, 2017

一、前言

总结下最近工作上在移动端实现的一个跑马灯效果,最终效果如下:

基于Vue的文字跑马灯组件(npm 组件包)

印象中好像HTML标签的‘marquee'的直接可以实现这个效果,不过 HTML标准中已经废弃了‘marquee'标签
既然HTML标准已经废弃了这个标签,现在工作上用的是Vue,所以想着能不能自己也发布一个基于Vue的文字跑马灯组件包,这样别人可以通过npm install ...就可以用,想想还有点激动,于是开始我的第一个npm组件之旅!

二、用npm发布一个包

有点惭愧,之前通过npm install ...安装package包时,我是不知道package包存在哪里,在github上?折腾一番才知道是在npm上发布的。

2.1 npm发布包流程

进入官网,注册帐号

基于Vue的文字跑马灯组件(npm 组件包)

进入已经写好的组件, 登录npm帐号

基于Vue的文字跑马灯组件(npm 组件包)

执行npm publish,最先遇到问题好像是这个

基于Vue的文字跑马灯组件(npm 组件包)

这里注意的是因为国内网络问题,许多小伙伴把npm的镜像代理到淘宝或者别的地方了,这里要设置回原来的镜像。npm config set registry=http://registry.npmjs.org

后面又遇到

基于Vue的文字跑马灯组件(npm 组件包)

这里我还特意查了下ENEEDAUTH错误,可是却没看后面的提示:You need to authorize this machine using 'npm adduser'

所以这里需要npm adduser

基于Vue的文字跑马灯组件(npm 组件包)

(发布的包的名字也要注意,有可能会有重名问题,像我这个组件包本来取名为vue-marquee,后面在npm上搜到已经有这个包了,不过他做的是垂直方向的跑马灯。所以我把这个为了区分这个组件包是水平方向的,改名为vue-marquee-ho)

三、基于Vue的文字跑马灯组件

大致了解怎么发组件包以后,我们再来看看需要发布出去的组件包怎么写的。

3.1初始化组件

这里我还是用到vue-cli,虽然有很多东西不需要,因为对这个比较熟悉,所以还是按照这个步骤来,初始化该组件

vue init webpack vue-marquee-ho
cd vue-marquee-ho
cnpm install // 安装依赖包
npm run dev // 启动服务

3.2修改配置文件

首先看package.json

"name": "vue-marquee-ho",
 "version": "1.2.1",
 "description": "A Vue component to marquee",
 "author": "wangjuan",
 "private": false,
 "license": "MIT",
 "main": "dist/vue-marquee.min.js",
 "scripts": {
 "dev": "node build/dev-server.js",
 "start": "node build/dev-server.js",
 "build": "node build/build.js",
 "test": "node build/test.js"
 },
 "dependencies": {
 "vue": "^2.2.6"
 },
 "repository": {
 "type": "git",
 "url": "git+https://github.com/wj704/vue-marquee-ho.git"
 },

因为这个组件包是能公用的,所以"private": false,

然后 "main": "dist/vue-marquee.min.js", 这里的配置意思是,别人用这个包 import VueMarquee from 'vue-marquee-ho'; 时,引入的文件。

可以看出,这个vue-marquee-ho最终需要打包出一个js文件,所以我们需要webpack.prod.config.js文件

var webpackConfig = merge(baseWebpackConfig, {
 module: {
 rules: utils.styleLoaders({
  sourceMap: config.build.productionSourceMap,
  extract: true
 })
 },
 devtool: config.build.productionSourceMap ? '#source-map' : false,
 // output: {
 // path: config.build.assetsRoot,
 // filename: utils.assetsPath('js/[name].[chunkhash].js'),
 // chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
 // },
 output: {
 path: config.bundle.assetsRoot,
 publicPath: config.bundle.assetsPublicPath,
 filename: 'vue-marquee.min.js',
 library: 'VueMarquee',
 libraryTarget: 'umd'
 },
 plugins: [
 // http://vuejs.github.io/vue-loader/en/workflow/production.html
 new webpack.DefinePlugin({
  'process.env': env
 }),
 new webpack.optimize.UglifyJsPlugin({
  compress: {
  warnings: false
  },
  sourceMap: true
 }),
 // extract css into its own file
 new ExtractTextPlugin({
  // filename: utils.assetsPath('css/[name].[contenthash].css')
  filename: 'vue-marquee.min.css'
 }),
 new OptimizeCSSPlugin()
 ]
})
module.exports = webpackConfig

可以看到我的output输出配置改了下,然后有很多webpack.prod.config.js之前不需要的代码去掉了,再看下对应的config配置,文件是config/index.js

bundle: {
 env: require('./prod.env'),
 assetsRoot: path.resolve(__dirname, '../dist'),
 assetsPublicPath: '/',
 assetsSubDirectory: '/',
 productionSourceMap: true,
 productionGzip: false,
 productionGzipExtensions: ['js', 'css'],
 bundleAnalyzerReport: process.env.npm_config_report
 },

至此配置差不多修改好了。接下来我们看看实现关键功能的Marquee组件

3.3 Marquee组件

思路:标签里的文字所占的宽度超过外面的div宽度时,增加一个内容相同的标签。这里span标签设置为display: inline-block;,可以计算其宽度,把span标签外面的父元素设置为font-size: 0;display: inline-block;,父级元素的宽度即为两者宽度之和,也就是一个span标签宽度的两倍,然后将其父级元素通过CSS3动画设置:

@keyframes marquee {
 0% { transform: translateX(0); }
 100% { transform: translateX(-50%);}
}

即可完美实现跑马灯效果。

具体代码:

<template>
 <div class="marquee-box">
 <div class="marquee-content" ref="out">
  <p :class="run?speed:''">
  <span class="text1" ref="in" >{{content}}</span>
  <span class="text2" v-if="showtwo||run">{{content}}</span>
  </p>
 </div>
 </div>
</template>

js:

<script>
 export default {
 name: 'VueMarquee',
 data (){
  return{
  run: false,
  pWidth: '',
  }
 },
 props: {
  content: {
  default: "暂无内容",
  type: String
  },
  speed: {
  default: 'middle',
  type: String
  },
  showtwo: {
  default: true
  }
 },
 mounted (){
  // let out = document.getElementById(this.pid.out).clientWidth;
  // let _in = document.getElementById(this.pid.in).clientWidth;
  var _this = this;
  this.$nextTick(()=>{
  let out = _this.$refs.out.clientWidth;
  let _in = _this.$refs.in.clientWidth;
  _this.run=_in>out?true:false;
  });
 }
 }
</script>

css:

<style>
 .marquee-box {
 height: 50px;
 line-height: 50px;
 color: #000;
 font-size: 24px;
 background-size: 24px 24px;
 }
 .marquee-content{
 overflow: hidden;
 width:100%
 }
 .marquee-content p{
 display: inline-block;
 white-space: nowrap;
 margin: 0;
 font-size: 0;
 }
 .marquee-content span{
 display: inline-block;
 white-space: nowrap;
 padding-right: 40px;
 font-size: 24px;
 }
 .quick{
 -webkit-animation: marquee 5s linear infinite;
 animation: marquee 5s linear infinite;
 }
 .middle{
 -webkit-animation: marquee 8s linear infinite;
 animation: marquee 8s linear infinite;
 }
 .slow{
 -webkit-animation: marquee 25s linear infinite;
 animation: marquee 25s linear infinite;
 }
 @-webkit-keyframes marquee {
 0% { -webkit-transform: translate3d(0,0,0); }
 100% { -webkit-transform: translate3d(-50%,0,0); }
 }
 @keyframes marquee {
 0% { transform: translateX(0); }
 100% { transform: translateX(-50%);}
 }
</style>

我们知道 webpack.base.conf.js 中入口文件默认指定为:

entry: {
 app: './src/main.js'
 },

所以,我们只需要将main.js引入Marquee.vue组件就可以。有两种方式引入:

import VueMarquee from './Marquee.vue'
export default VueMarquee;
// var VueMarquee = require('./Marquee.vue');
// module.exports = VueMarquee

注意import 和module.exports不要一起用,github看到其他人提交的组件是这两个一起用的,这样在windows下会报错,好像mac不会有问题。

3.4 打包生成dist/vue-marquee.min.js

通过npm run build 即可看到目录下生成了dist文件,dist文件里有四个文件,分别是:

vue-marquee.min.js
vue-marquee.min.js.map
vue-marquee.min.css
vue-marquee.min.css.map

我们知道有一个这样的文件.gitignore,里面包含npm install时,不会安装的东西,因为这里要用到dist文件,于是我把.gitignore 里的dist/去掉了。

.DS_Store
node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*

打包好了后,通过npm publish 提交到npm上

基于Vue的文字跑马灯组件(npm 组件包)

需要多次提交时注意修改package.json中的"version": "1.2.1", 我这里已经提交了21次了(捂脸哭(┬_┬))

四、使用组件

通过npm install vue-marquee-ho -s 安装到相应的项目下,安装成功如下图所示:

基于Vue的文字跑马灯组件(npm 组件包)

到项目中的node_modules/目录下将可以看到:

基于Vue的文字跑马灯组件(npm 组件包)

需要用到该组件时可以这样引入(注意引入样式)

import VueMarquee from 'vue-marquee-ho';
import Css from 'vue-marquee-ho/dist/vue-marquee.min.css'
export default {
 name: 'app',
 components:{
  "vue-marquee": VueMarquee
 },
}

看一个demo:

<template>
 <div id="app">
 <div class="marquee-wrap" style="width: 100px;"><vue-marquee content="33333" class="two" :showtwo="false"></vue-marquee></div>
 <div class="marquee-wrap" style="width: 100px;"><vue-marquee content="22222" class="two" :showtwo="false"></vue-marquee></div>
 <div class="marquee-wrap" style="width: 100px;"><vue-marquee content="1" class="two" :showtwo="false"></vue-marquee></div>
 <router-view></router-view>
 </div>
</template>
<script>
import VueMarquee from 'vue-marquee-ho';
import Css from 'vue-marquee-ho/dist/vue-marquee.min.css'
export default {
 name: 'app',
 components:{
  "vue-marquee": VueMarquee
 },
}
</script>

效果:

基于Vue的文字跑马灯组件(npm 组件包)

五、总结

总算发布出去,能正常使用了!花了挺多时间的,虽然这个组件思路比较简单,但是说不定别人能用上呢。这个组件的雏形代码比现在多,不过之前在项目中直接引用也能正常使用。但是把他打包发布出去再使用的过程,出了很多问题,反复修改代码,精简代码,最终终于成功了!21次的提交记录,不容易呀,源代码地址:

vue-marquee-ho

以上所述是小编给大家介绍的基于Vue的文字跑马灯组件(npm 组件包),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
HTTP状态代码以及定义(解释)
Feb 02 Javascript
JS 如果改变span标签的是否隐藏属性
Oct 06 Javascript
计算新浪Weibo消息长度(还可以输入119字)
Jul 02 Javascript
js(jQuery)获取时间的方法及常用时间类搜集
Oct 23 Javascript
jQuery 过滤方法filter()选择具有特殊属性的元素
Jun 15 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
Sep 28 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
Dec 17 Javascript
js 原型对象和原型链理解
Feb 09 Javascript
详解vue项目优化之按需加载组件-使用webpack require.ensure
Jun 13 Javascript
关于使用axios的一些心得技巧分享
Jul 02 Javascript
通过npm或yarn自动生成vue组件的方法示例
Feb 12 Javascript
让Vue响应Map或Set的变化操作
Nov 11 Javascript
React简单介绍
May 24 #Javascript
bootstrap3使用bootstrap datetimepicker日期插件
May 24 #Javascript
微信小程序本地缓存数据增删改查实例详解
May 24 #Javascript
详解微信小程序 通过控制CSS实现view隐藏与显示
May 24 #Javascript
jquery Form轻松实现文件上传
May 24 #jQuery
微信小程序封装http访问网络库实例代码
May 24 #Javascript
Bootstrap下拉菜单更改为悬停(hover)触发的方法
May 24 #Javascript
You might like
在DC的漫画和电影中,蝙蝠侠的宿敌,小丑的真名是什么?
2020/04/09 欧美动漫
php开发留言板的CRUD(增,删,改,查)操作
2012/04/19 PHP
php实现用手机关闭计算机(电脑)的方法
2015/04/22 PHP
php之static静态属性与静态方法实例分析
2015/07/30 PHP
PHP连接MYSQL数据库实例代码
2016/01/20 PHP
PHP实现支付宝即时到账功能
2016/12/21 PHP
php使用flock阻塞写入文件和非阻塞写入文件的实例讲解
2017/07/10 PHP
PHP Swoole异步读取、写入文件操作示例
2019/10/24 PHP
写得不错的jquery table鼠标经过变色代码
2013/09/27 Javascript
IE浏览器不支持getElementsByClassName的解决方法
2014/08/27 Javascript
JS动态修改图片的URL(src)的方法
2015/04/01 Javascript
JavaScript中的toLocaleLowerCase()方法使用详解
2015/06/06 Javascript
Bootstrap Table的使用总结
2016/10/08 Javascript
微信小程序实现随机验证码功能
2018/12/20 Javascript
three.js 如何制作魔方
2020/07/31 Javascript
vue 中的动态传参和query传参操作
2020/11/09 Javascript
[02:36]DOTA2上海特锦赛 回忆电竞生涯的重要瞬间
2016/03/25 DOTA
在Python中处理XML的教程
2015/04/29 Python
详解python中requirements.txt的一切
2017/03/03 Python
python合并同类型excel表格的方法
2018/04/01 Python
python中实现数组和列表读取一列的方法
2018/04/03 Python
python write无法写入文件的解决方法
2019/01/23 Python
Keras load_model 导入错误的解决方式
2020/06/09 Python
用python实现名片管理系统
2020/06/18 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
2020/06/24 Python
HTML5 History API 实现无刷新跳转
2016/01/11 HTML / CSS
基于canvas使用贝塞尔曲线平滑拟合折线段的方法
2018/01/10 HTML / CSS
IWOOT美国:新奇的小玩意
2018/04/27 全球购物
商务英语毕业生自荐信范文
2013/11/08 职场文书
英语专业毕业生求职信
2014/05/24 职场文书
党员个人剖析材料
2014/09/30 职场文书
离婚财产分隔协议书
2014/10/23 职场文书
2015年社区矫正工作总结
2015/04/21 职场文书
公司奖励通知
2015/04/21 职场文书
创业开店,这样方式更合理
2019/08/26 职场文书
zabbix agent2 监控oracle数据库的方法
2021/05/13 Oracle