2023年2月

在一个和微信相关的业务管理系统,我们有时候需要和用户的微信账号信息进行绑定,如对公众号、企业微信等账号绑定特定的系统用户,可以进行扫码登录、微信信息发送等操作,用户的绑定主要就是记录公众号用户的openid或者企业微信的userid,那样可以通过微信API接口,发送系统消息或业务消息。

1、系统用户界面的绑定处理

1)公众号和系统用户绑定

我们绑定用户,可以在系统用户管理界面中绑定相关的信息,也可以在查看当前用户界面中提供入口绑定。

在用户管理界面中的列表界面中绑定,界面如下所示。

上面的绑定操作,我们根据条件判断展示即可,其中公众号的绑定操作代码如下所示。

  <el-table-columnalign="center"label="绑定公众号"width="120">
    <templatescope="scope">
      <el-row>
        <el-button-groupv-if="scope.row.openId != ''">{{scope.row.subscribeWechat}}<el-tooltipeffect="light"content="点击取消绑定"placement="top-start">
            <el-buttonicon="el-icon-remove-outline"type="warning"size="mini"@click="CancelBindWechat(scope.row.id)">
            </el-button>
          </el-tooltip>
        </el-button-group>
        <el-button-groupv-else>
          <el-tooltipeffect="light"content="点击绑定二维码"placement="top-start">
            <el-buttontype="success"circle size="mini"@click="BindQRCode(scope.row.id)">
              <v-iconname="qrcode"style="color:#409EFF;" />
            </el-button>
          </el-tooltip>
          <el-tooltipeffect="light"content="点击绑定公众号"placement="top-start">
            <el-buttontype="primary"circle size="mini"@click="BindWechat(scope.row.id)">
              <v-iconname="user-tag"style="color:#2A3036;" />
            </el-button>
          </el-tooltip>
        </el-button-group>
      </el-row>
    </template>
  </el-table-column>

我们通过判断 scope.row.openId 是否非空,判断是否需要绑定还是展示取消的按钮即可。而绑定的操作,就是展示公众号用户的界面操作了。

BindWechat (id) { //绑定微信账号
  this.bindForm.id =idthis.bindForm.type = 0
  //var param = { id: id, openid: openid, nickname: nickname }
  var tags =[]this.$refs.tagUserSelect.show(tags)
},

企业微信绑定的处理也是类似代码。

  <el-table-columnalign="center"label="绑定企业微信"width="140">
    <templatescope="scope">
      <el-row>
        <el-button-groupv-if="scope.row.corpUserId != ''">{{scope.row.corpUserId}}<el-tooltipeffect="light"content="点击取消绑定"placement="top-start">
            <el-buttonicon="el-icon-remove-outline"type="warning"size="mini"@click="UnBindCorpUser(scope.row.id)">
            </el-button>
          </el-tooltip>
        </el-button-group>
        <el-button-groupv-else>
          <el-tooltipeffect="light"content="点击绑定企业微信"placement="top-start">
            <el-buttonicon="el-icon-user-solid"type="primary"circle size="mini"@click="BindCorpUser(scope.row.id)" />
          </el-tooltip>
        </el-button-group>
      </el-row>
    </template>
  </el-table-column> 

上面提供了微信公众号的绑定/取消绑定,或者公众号的扫码绑定;企业微信的绑定/取消绑定操作。

公众号绑定界面如下所示。

以上的操作就是调用代码   this.$refs.tagUserSelect.show(tags) 实现的,由于公众号的用户选择,我们需要在很多地方用到,这里定义为用户界面组件的方式使用的。如公众号和企业微信,都是使用可重用的用户组件方式处理。

上图选择公众号用户的界面是根据系统公众号,获取对应的订阅用户信息,以便绑定到对应的系统用户中,建立一一对应的关系。

如果选择具体订阅用户并确认后,系统就记录他们之间的关系,然后展示在列表中。

对于绑定的用户,我们当然也可以取消一一对应关系。取消前我们需要确认一下用户的选择为佳。

2)系统扫码绑定

在现今很多网站里面,都使用了微信开放平台的扫码登录认证处理,这样做相当于把身份认证交给较为权威的第三方进行认证,在应用网站里面可以不需要存储用户的密码了。

在用户列表的二维码连接上,单击可以对用户进行微信扫码绑定,这样用户可以在扫码登录处直接扫码登录,不需要输入账号密码。扫码绑定如下界面所示。

扫码绑定的处理代码如下所示,就是展示二维码,二维码是一个URL连接的

<el-dialogtitle="微信扫码绑定":visible="isBindCode"width="400px":modal-append-to-body="false"@close="closeDialog">
  <div>
    <!--<el-image style="width: 100px; height: 100px" :src="url" fit="fill"></el-image>-->
    <!--<barcode v-if="viewForm.BarCode" :value="viewForm.BarCode"
:options="{ width:100,height:50,background:'rgba(255,255,255,.0)'}" />
--> <qrcodev-if="qrcode":value="qrcode":options="{ width:300,background:'rgba(255,255,255,.0)'}" /> </div> <divslot="footer"class="dialog-footer"> <el-buttontype="success"@click="closeDialog">关闭</el-button> </div> </el-dialog>

如对于条码和二维码,我使用 @chenfengyuan/vue-barcode和 @chenfengyuan/vue-qrcode,一般在Github上搜索下关键字,总能找到一些很受欢迎的第三方组件。

安装这些组件都有具体的说明,如下所示(
如果卸载,直接修改install为uninstall即可
)。

npm install @chenfengyuan/vue-barcode vue

以及

npm install @chenfengyuan/vue-qrcode vue

条码和二维码的展示效果如下所示

因此,展示二维码对话框的操作,只需要复制给对应属性,并展示对话框即可。

    BindQRCode (id) { //绑定二维码,用于扫码登陆
      this.qrcode = `http://www.iqidi.com/h5/BindWechat?id=${id}`
      this.isBindCode = true},

一旦成功绑定用户微信,在微信端会定位到一个绑定成功的页面(自定义的H5页面),如下所示。

如果用户已经绑定了其中的一个用户而再去扫码绑定其他用户,那么会提示用户避免无法重复绑定账号即可。

如果用户已经进行了二维码绑定,则可以在管理界面进行取消绑定,这样可以解绑用户账号和微信之间的关联。

取消绑定的Vue脚本处理代码如下所示,就是调用后端API进行数据处理即可。

    CancelBindWechat (id) {//取消绑定微信账号
      var tips = "您确认取消绑定微信账号吗?"
      this.msgConfirm(tips).then(() =>{var param ={
id: id
}
user.CancelBindWechat(param).then(data
=> { //公众号绑定 //console.log(data.result) if(data.success) {//提示信息 this.msgSuccess('操作成功!')this.getlist()
}
else{this.msgError('取消绑定失败:' +data.error)
}
})
})
},

3)企业微信绑定

有时候,我们可以通过企业微信进行消息发送,或者处理相关的业务信息,如之前随笔《
在微信框架模块中,基于Vue&Element前端,通过动态构建投票选项,实现单选、复选的投票操作
》中说到的发送投票信息,就可以同时向公众号、企业微信发送投票信息,推送到具体的用户。

那么同时记录企业微信账号的信息就很有必要。

在系统用户列表界面中,我们同时也提供了绑定企业微信账户的操作。

和前面公众号绑定一样,我们这个弹出对话框也是作为一个用户组件的方式来实现的

调用展示的时候处理一下即可。

    BindCorpUser (id) {//绑定企业微信
      this.bindForm.id =idthis.bindForm.type = 1
      var tags =[]this.$refs.corpTagUserSelect.show(tags)
},

如果绑定后,需要取消绑定,确认一下用户选择即可。

操作代码如下所示。

    UnBindCorpUser (id) { //取消绑定企业微信
      var tips = "您确认取消绑定企业微信吗?"
      this.msgConfirm(tips).then(() =>{var param ={
id: id,
corpUserId:
''}
user.BindCorpUser(param).then(data
=>{//console.log(data.result) if(data.success) {//提示信息 this.msgSuccess('操作成功!')this.getlist()
}
else{this.msgError('取消绑定失败:' +data.error)
}
})
})
},

以上就是我们在后端管理界面中,基于Vue&Element前端的微信公众号和企业微信的用户绑定操作过程。

我们一般的应用系统,菜单是很多功能界面的入口,菜单为了更好体现功能点的设置,一般都是动态从数据库生成的,而且还需要根据用户角色的不同,过滤掉部分没有权限的菜单;在Vue&Element的纯前端框架中,还引入了路由的概念,路由是对应具体的页面视图和布局的相关信息集合,是用户可访问的页面连接集合。本篇随笔介绍Vue+Element 前端应用开发之菜单和路由的关系。

1、菜单和路由的关系

前面介绍到,菜单是展现在界面上的功能入口,路由是我们前端可以访问的连接,两者结合才能正常访问某个页面。有些系统把路由定义作为菜单的来源,那样也可以呈现菜单,不过这样他们的关系就耦合起来,而且不好实现动态的处理。

我们的菜单作为一个数据库记录,可以通过系统进行维护,从而动态生成的,它的键值对应路由即可。

我们做法是以本地配置好的路由列表为基准,而菜单我们采用在后端配置方式,前端通过接口动态获取菜单列表,通过菜单的名称和路由名称的对应关系,我们以菜单集合为对照,然后过滤本地所有静态路由的列表,然后获得用户可以访问的路由列表,设置动态路由给前端,从而实现了界面根据用户角色/权限的不同,而变化用户的菜单界面和可访问路由集合。

菜单的编辑界面如下所示,可以在图标列表中选择合适的图标

菜单路由处理的大概的操作过程如下所示

通过数据库配置的菜单数据,最终返回到前端的时候,是一个JSON集合。 对于ABP框架的后端,我们可以查看到菜单部分的API接口

菜单的JSON是根据角色进行动态获取的,不同的角色对应不同的菜单集合,并且菜单是一个多层次的树列表,可以定义无穷多级的展示,JSON格式化视图如下所示。

菜单包含路由的键,我们在前端JS变量中存储所有的路由信息,我们根据菜单的键来过滤系统路由,作为前端可用的路由信息,路由JS定义如下所示。

为了有效管理系统路由的集合定义,我们把它们按分类分为细粒度的模块文件进行管理,如下所示。

大概分类用文字表示如下所示。

其中的index.js就是集合所有模块的路由文件,如下所示。

用户在经过登录界面处理后,首先获得对应用户角色的可用菜单。

根据角色的菜单列表,就会通过对应的Action获取动态路由信息(注意,这里是先获取动态菜单,然后过滤本地路由,即为动态路由信息),获得动态路由后,就设置前端所能访问的路由集合即可,如下代码所示。

有了这些新的路由允许,前端系统的菜单才能够正常运转起来,否则即使界面展示了菜单,也不能访问特定的视图页面而跳到了404页面,因为路由没有。

在前端界面处理中,我们通过Element界面组件的方式展示动态菜单信息,并结合菜单和路由的关系,实现菜单跳转到对应视图的处理过程。

基于Vue的前端框架有很多,Element算一个,而BootstrapVue也可以非常不错的一个,毕竟Bootstrap也是CSS中的大佬级别的,它和Vue的整合,使得开发起来更加方便了。BootstrapVue 是基于 Bootstrap v4 + Vue.js 的前端 UI 框架。它是流行的
Bootstrap 框架
与 Vue.js 的集成。这个包称为
BootstrapVue
。它允许我们使用与 Bootstrap(v4)集成的自定义组件。

使用 BootstrapVue,任何人都可以从 Vanilla.js 或 jQuery 切换到 Vue.js,而无需担心 Bootstrap 对 jQuery 的严重依赖,甚至无法找到解决方法。这就是 BootstrapVue 的救援方式。它有助于弥补这一差距,并允许 Vue 开发人员能够轻松地在他们的项目中使用 Bootstrap。
BootstrapVue不依赖Jquery。

1、BootstrapVue的安装使用

我们假设你已经有Vue的项目环境,那么BootstrapVue的安装使用介绍就很容易了,直接使用npm安装即可。

npm install bootstrap-vue bootstrap

上面的命令将会安装BootstrapVue和Bootstrap包。 BoostrapVue包中包含所有BootstrapVue组件,常规Bootstrap包含CSS文件。

接下来,让我们设置刚刚安装的BootstrapVue包。转到你的main.js文件并将这行代码添加到合适的位置,另外还需要将Bootstrap CSS文件导入到项目中。

import BootstrapVue from 'bootstrap-vue'Vue.use(BootstrapVue)

import
'bootstrap/dist/css/bootstrap.css'import'bootstrap-vue/dist/bootstrap-vue.css'

那么一般简单的main.js文件内容如下所示。

//src/main.js
import Vue from 'vue'import App from'./App.vue'import BootstrapVue from'bootstrap-vue'import'bootstrap/dist/css/bootstrap.css'import'bootstrap-vue/dist/bootstrap-vue.css'Vue.use(BootstrapVue)
Vue.config.productionTip
= false newVue({
render: h
=>h(App),
}).$mount(
'#app')

如果我们项目中使用了其他组件模块,那么这些可能会有所不同。

2、BootstrapVue的组件使用

学习一项新东西,我们一般先了解一下相关的文档。

GitHub库的地址:
https://github.com/topics/bootstrapvue

BootstrapVue的官网地址(可能受限无法访问):
https://bootstrap-vue.js.org/

BootstrapVue的中文网站地址如下:
https://code.z01.com/bootstrap-vue/

通过在Vue项目中引入对应的 BootstrapVue,那么它的相关组件使用就参考官网的介绍了解即可。BootstrapVue中有很多和Bootstrap一样的组件,不过标签前缀需要加上b-

例如对于常用的按钮界面代码处理,如下所示。

<div>
  <b-button>Button</b-button>
  <b-buttonvariant="danger">Button</b-button>
  <b-buttonvariant="success">Button</b-button>
  <b-buttonvariant="outline-primary">Button</b-button>
</div>

界面如下所示,很有Bootstrap的风格!我们可以看到原先Bootstrap上的html的button加多了一个前缀b-,变为了b-button了。

卡片Card控件使用代码如下所示

<div>
  <b-cardtitle="Card Title"img-src="https://picsum.photos/600/300/?image=25"img-alt="Image"img-top
tag
="article"style="max-width: 20rem;"class="mb-2" > <b-card-text>Some quick example text to build on the card title and make up the bulk of the card's content.</b-card-text> <b-buttonhref="#"variant="primary">Go somewhere</b-button> </b-card> </div>

其中类class中的mb-2就是边距的定义,参考说明如下所示。

另外可能还有接触到 p-2,pt-2,py-2,px-2 等类似的定义,后面小节再行说明。

另外Flex的布局也需了解下。

      <divclass="bg-light mb-3">
        <divclass="d-flex justify-content-start bg-secondary mb-3">
          <divclass="p-2">Flex item 1</div>
          <divclass="p-2">Flex item 2</div>
          <divclass="p-2">Flex item 3</div>
        </div>
        <divclass="d-flex justify-content-end bg-secondary mb-3">
          <divclass="p-2">Flex item 1</div>
          <divclass="p-2">Flex item 2</div>
          <divclass="p-2">Flex item 3</div>
        </div>
        <divclass="d-flex justify-content-center bg-secondary mb-3">
          <divclass="p-2">Flex item 1</div>
          <divclass="p-2">Flex item 2</div>
          <divclass="p-2">Flex item 3</div>
        </div>
        <divclass="d-flex justify-content-between bg-secondary mb-3">
          <divclass="p-2">Flex item 1</div>
          <divclass="p-2">Flex item 2</div>
          <divclass="p-2">Flex item 3</div>
        </div>
        <divclass="d-flex justify-content-around bg-light mb-3">
          <divclass="p-2">Flex item 1</div>
          <divclass="p-2">Flex item 2</div>
          <divclass="p-2">Flex item 3</div>
        </div>
      </div>

界面效果如下所示。

我们来一个展示栅格的例子,显示卡片中图片,文字等信息。


    <b-container>
<divv-if="list.length">
<b-row>
<templatev-for="data in list">
<b-colsm="4"v-bind:key="data.index">
<b-cardv-bind:title="data.strCategory"v-bind:img-src="data.strCategoryThumb"img-alt="Image"img-top tag="article"style="max-width: 20rem;"class="mb-2">
<b-card-text>{{ `${data.strCategoryDescription.slice(0,100)}...` }}</b-card-text>
<b-buttonhref="#"variant="primary">View food</b-button>
</b-card>
</b-col>
</template>
</b-row>
</div>
<divv-else>
<h5>No meals available yet

在前面随笔《
使用BootstrapVue相关组件,构建Vue项目界面
》概括性的介绍了BootstrapVue的使用过程,其实选用这个主要就是希望能够用来构建一些公司门户网站的内容,毕竟基于Bootstrap的样式界面很多,而且可以在很多模板网站上找到相关的Bootstrap页面模板,由于Vue开发组件的便利性,我们可以提取部分样式和HTML代码,组成我们所需要的界面效果,本篇随笔介绍如何基于Bootstrap网站模板构建组件界面。

1、Bootstrap的样式模板

Bootstrap的CSS已经广泛应用了很多年了,有着很成熟的技术体系,因此Bootstrap的页面资源也非常的多。

我们在网上搜一下Bootstrap,就可以找到很多相关Bootstrap的模板提供网站,从中我们可以下载或者借鉴很多设计良好的界面,从而利用来开发属于自己的公司门户网站内容。

如下面这个我看了一下,就有非常多的公司门户网站模板,大多数都是基于Bootstrap样式的。

http://www.templatesy.com/

我从上面下载了很多网站界面进行参考,并逐步提取一些喜欢的界面整合到页面中去。

当然还有很多类似的网站,不过有些就需要充值下载,不过免费下载的也有很多的,毕竟Bootstrap的网站页面已经很多很多的了。

一般基于Bootstrap网站模板,都会使用一些除了Bootstrap样式外,还会增加一些自定义的CSS文件,如果不复杂的,我们提取出来,整合到后面开发的Vue组件中即可正常了。

如查看一些界面后,可以看到CSS样式应用文件如下所示。

前面一个是标准的Bootstrap样式,如果我们引入BootstrapVue以及导入Bootstrap样式就会有了,font-awesome是图标的内容,我们如果需要使用Bootstrap很多图标,可能就需要用到,使用npm 安装font-awesome组件并加入样式即可。

npm install vue bootstrap-vue bootstrap

然后在main.js中引入

//BootstrapVue所需
import BootstrapVue from 'bootstrap-vue'Vue.use(BootstrapVue)
import
'bootstrap/dist/css/bootstrap.css'import'bootstrap-vue/dist/bootstrap-vue.css'

图标组件font-awesome安装

npm install font-awesome --save

然后引入

//引入font-awesome 图标
import 'font-awesome/css/font-awesome.min.css'

至于自定义样式,我们在组件里面根据需要使用即可。

2、基于Bootstrap静态页面构建的组件界面

前面小节介绍了引入Bootstrap和所需的一些组件,不过一般我们用BootstrapVue的内置组件就可以了,它的相关组件使用就参考官网的介绍了解即可。BootstrapVue中有很多和Bootstrap一样的组件,不过标签前缀需要加上b-

一般的公司门户网站,都可能包含一些相关的产品、解决方案、客户或合作伙伴、图片展示、公司介绍、公司新闻等等。首页里面可能放置一些简略的综合内容,如下所示

那么首页面的组件界面代码如下所示,各个模块分别维护导入整合即可。

<template>
  <div>
    <Product/>
    <Business/>
    <About/>
    <Partner/>
    <Client/>
  </div>
</template>

<script>import About from'./outline/about'import Product from'./outline/product'import Business from'./outline/business'import Partner from'./outline/partner'import Client from'./outline/client'
......

如果我们需要把下面这个模块放到页面中去,那么定义一个独立的组件模块,加入HTML和CSS样式即可。

在组件界面中,我们可以使用b-row的组件方式定义行列,也可以使用div的class="row" 来定义对应的行列,可以达到同样的效果,如下代码所示。

最后把组件模块整合起来使用即可。

类似这样的界面展示服务或者产品的特性效果。

或者图片展示产品效果

都是非常方便的,只要摘取页面中的部分内容以及CSS样式,然后通过网站接口动态的获取数据进行展示即可实现后台的管理和前端的展示了。

系列文章如下所示:


循序渐进BootstrapVue,开发公司门户网站(1)---基于Bootstrap网站模板构建组件界面

循序渐进BootstrapVue,开发公司门户网站(2)--- 使用wow.js动画组件以及自定义的CSS样式处理动态效果

循序渐进BootstrapVue,开发公司门户网站(3)--- 结合邮件发送,收集用户反馈信息

循序渐进BootstrapVue,开发公司门户网站(4)--- 使用b-carousel-slide组件实现图片轮播以及vue-awesome-swiper实现图片滑动展示


循序渐进BootstrapVue,开发公司门户网站(5)--- 使用实际数据接口代替本地Mock数据

循序渐进BootstrapVue,开发公司门户网站(6)--- 门户网站后端内容管理

在我们开发的页面中,让页面有一些动画效果,可以让页面更加有吸引力,只要不是处理太过,一般人还是希望有一些动态效果,如滚动动画加载,悬停处理变化等效果,本篇随笔介绍使用wow.js动画组件以及自定义的CSS样式处理动态效果,增加公司门户网站页面的动画效果。

1、使用wow.js动画组件

WOW.js 是一款帮助你实现滚动页面时触发CSS 动画效果的插件。
WOW.js 依赖
animate.css
,所以它支持 animate.css 多达 60 多种的动画效果,你可以改变动画设置喜欢的风格、延迟、长度、偏移和迭代等,能满足您的各种需求。
WOW.js的github网址:
https://github.com/matthieua/WOW
WOW的Demo效果页面:
https://www.delac.io/wow/

我们使用的时候,使用npm安装它,并导入相应的动画样式文件即可。

npm install wowjs --save-dev

安装后,在vue项目的main.js中全局引入样式文件

//引入wowjs所需
import 'wowjs/css/libs/animate.css' //此处就是wowjs中自带的animate的位置

HTML页面代码使用动画的时候,添加对应的类属性即可,如下所示。

  <sectionclass="wow slideInLeft"></section>
  <sectionclass="wow slideInRight"></section>

如我们实际很多页面都用了动画效果,代码如下所示,红框部分就是WOW动画所需的一些属性设置。

类名前面的wow是每一个带动画的元素都要加的,slideInLeft就是说明动画样式。后面的data-wow-duration(动画持续时间)、data-wow-delay(动画延迟时间)、data-wow-offset(元素的位置露出后距离底部多少像素执行)和data-wow-iteration(动画执行次数)这四个属性可选可不选。

data-wow-duration:
更改动画持续时间
data-wow-delay:
动画开始前的延迟
data-wow-offset:
开始动画的距离(与浏览器底部相关)
data-wow-iteration:
动画的次数重复(无限次:infinite)

wow rollIn 从左到右、顺时针滚动、透明度从100%变化至设定值
wow bounceIn 从原位置出现,由小变大超出设定值,再变小小于设定值,再回归设定值、透明度从100%变化至设定值
wow bounceInUp 从下往上、窜上来以后会向上超出一部分然后弹回去、透明度为设定值不变
wow bounceInDown 从上往下、掉下来以后会向下超出一部分然后弹跳一下、透明度为设定值不变
wow bounceInLeft 从左往右、移过来以后会向右超出一部分然后往左弹一下、透明度为设定值不变
wow bounceInRight 从右往左、移过来以后会向左超出一部分然后往右弹一下、透明度为设定值不变
wow slideInUp 从下往上、上来后固定到设定位置、透明度为设定值不变(up是从下往上)(如果元素在最下面,会撑开盒子高度)
wow slideInDown 从上往下、上来后固定到设定位置、透明度为设定值不变
wow slideInLeft 从左往右、上来后固定到设定位置、透明度为设定值不变(left却是从左往右)
wow slideInRight 从右往左、上来后固定到设定位置、透明度为设定值不变
wow lightSpeedIn 从右往左、头部先向右倾斜,又向左倾斜,最后变为原来的形状、透明度从100%变化至设定值
wow pulse 原位置放大一点点在缩小至原本大小、透明度为设定值不变(配合动画执行次数属性效果更佳)
wow flipInX 原位置后仰前栽、透明度从100%变化至设定值
wow flipInY 原位置左右旋动、透明度从100%变化至设定值
wow bounce 上下抖动、透明度为设定值不变(配合动画执行次数和动画持续时间属性可以实现剧烈抖动亦或是慢慢抖)
wow shake 左右抖动、透明度为设定值不变(配合动画执行次数和动画持续时间属性可以实现剧烈抖动亦或是慢慢抖)
wow swing 从右往左、头部先向右倾斜,又向左倾斜,最后变为原来的形状、透明度为设定值不变
wow bounceInU 原位置不变、直接从不显示到显示(无过过渡效果)
wow wobble 原位置不变、类似于一个人站在那左右晃头、透明度为设定值不变

WOW的脚本初始化,有些人放在了main.js里面定义WOW变量,也有些人在具体页面中定义WOW变量,并初始化,都可以实现效果。

WOW可以用import也可以用require进行导入定义使用。

if (process.browser) { //在这里根据环境引入wow.js
  var { WOW } = require('wowjs')
}

或者

 import {WOW} from 'wowjs'   

如果需要自定义配置,可如下使用:

var wow = newWOW({
boxClass:
'wow',
animateClass:
'animated',
offset:
0,
mobile:
true,
live:
true});

要页面出现动画效果,那么就必须初始化WOW

一般的初始化代码如下所示,这个放在mounted函数里面,就是需要等待所有页面组件完成加载后出现动画,或者鼠标滚动到指定的模块,也出现相应的动画效果。

mounted () {//为了避免异步无法刷新,使用了同步方式await
    this.$nextTick(() =>{if(process.browser) {new WOW({ live: false}).init()
}
})
},

图片动画效果如下所示

2、自定义的CSS样式处理动态效果

除了借助类似WOW的第三方动画组件外,有时候我们在CSS样式里面,也可以定义一些动画效果,这个我们不深入探讨,毕竟CSS也是一门深奥的学问,我们借助一些hove的处理达到选择悬停的效果处理即可,这个Hover的处理也是比较常见的方式的。

1)悬停的时候,蒙版效果

其中HTML代码如下所示

        <b-cardclass="overflow-hidden my-2">
          <b-rowno-gutters>
            <b-colcols="4"class="px-2">
              <b-card-img:src="item.icon"class="rounded-circle"></b-card-img>
            </b-col>
            <b-colcols="8">
              <b-card-bodyclass="p-2">
                <b-card-titleclass="text-truncate">{{item.title}}</b-card-title>
                <b-card-textclass="card-body-text text-muted text-justify">{{item.desc}}</b-card-text>
              </b-card-body>
            </b-col>
          </b-row>
          <!--蒙版-->
          <divclass="mask">
            <b-buttonvariant="outline-info"class="mx-auto d-block my-btn"@click="handleDetail(item.id)">了解更多</b-button>
          </div>
        </b-card>

CSS定义代码如下所示,悬停的时候,显示class=“mask”中的蒙版内容,移开则隐藏。

.card{position:relative;.mask {
position
:absolute;top:0;left:0;right:0;bottom:0;display:none;align-items:center;text-align:center;background:rgba(0, 0, 0, 0.8); }}
.card:hover
{box-shadow:0 0 10px #ccc;.mask {
display
:flex !important; }}

2)悬停的时候,增加边框

边框增加影子效果,如下所示

CSS 效果定义,hover的时候,box-shadow增加10px的边框

.card{border:none;
}.card:hover{// background:#F1F1F1;box-shadow:0 0 10px #ccc;
}

或者下面效果

其中hover的CSS代码如下

.single_about:hover{box-shadow:0 3px 45px 0 rgba(0, 0, 0, 0.2);z-index:999;
}

3、图片变换(比例放大)

CSS效果代码如下

<style scoped>
.card img
{width:100%;-webkit-transform:scaleY(1);-moz-transform:scaleY(1);-o-transform:scaleY(1);-ms-transform:scaleY(1);transform:scaleY(1);-webkit-transition:all 0.7s ease-in-out;-moz-transition:all 0.7s ease-in-out;-o-transition:all 0.7s ease-in-out;-ms-transition:all 0.7s ease-in-out;transition:all 0.7s ease-in-out; }.card img:hover{-webkit-transform:scale(1.5);-moz-transform:scale(1.5);-o-transform:scale(1.5);-ms-transform:scale(1.5);transform:scale(1.5); }</style>

当然还有很多其他的效果,如渐变等,下面这样一张图片,叠加上一个从透明到黑色的渐变,

应用了 mask 之后,就会变成这样:

mask: linear-gradient(90deg, transparent, #fff);

以上就是使用wow.js动画组件以及自定义的CSS样式处理动态效果,两者配合使用,可以实现比较活跃的页面效果,使得页面内容展示更加丰富多彩。

系列文章如下所示:

循序渐进BootstrapVue,开发公司门户网站(1)---基于Bootstrap网站模板构建组件界面

循序渐进BootstrapVue,开发公司门户网站(2)--- 使用wow.js动画组件以及自定义的CSS样式处理动态效果

循序渐进BootstrapVue,开发公司门户网站(3)--- 结合邮件发送,收集用户反馈信息

循序渐进BootstrapVue,开发公司门户网站(4)--- 使用b-carousel-slide组件实现图片轮播以及vue-awesome-swiper实现图片滑动展示

循序渐进BootstrapVue,开发公司门户网站(5)--- 使用实际数据接口代替本地Mock数据

循序渐进BootstrapVue,开发公司门户网站(6)--- 门户网站后端内容管理