微信小程序自定义全屏遮罩弹窗showLoading、showModal组件(可以加载gif图片)

链接: https://pan.baidu.com/s/1PZFCQFMmOWq50moOZAM9gQ   (提取码: f774 )

组件一:

  • wxml.wxml:

<!-- 弹框 -->

<!-- pathImg显示图片 -->

<showLoading showloadingMask='{{showloadingMask}}' pathImg='{{pathImg_xsw}}' showloadingTitle='{{showloadingTitle}}'>

</showLoading>

  • wxml.json:

{

"usingComponents": {

"showLoading": "/component/showloading"

},

"navigationBarBackgroundColor": "#fbe8b9",

"navigationBarTitleText": "组件备注"

}

  • wxml.js:

var app = getApp();

Page({

/**

* 页面的初始数据

*/

data: {

},

/**

* 生命周期函数--监听页面加载

*/

onLoad: function (options) {

     

/*********加载动作显示***************/

app.showloadingMask({

showloadingMask: 'true',

showloadingTitle: '加载中...',//显示文字

// pathImg_xsw:'/component/img/loading_one.gif',//图片路径

duration: 1000,//自动关闭

success: function (res) {

// console.log(res.path)//当前页面路径

}

})

// 手动关闭

// setTimeout(function(){

// app.showloadingMask({

// showloadingMask: 'false'//隐藏

// })

// },3000)

},

/**

* 生命周期函数--监听页面初次渲染完成

*/

onReady: function () {

},

/**

* 生命周期函数--监听页面显示

*/

onShow: function () {

},

/**

* 生命周期函数--监听页面隐藏

*/

onHide: function () {

},

/**

* 生命周期函数--监听页面卸载

*/

onUnload: function () {

clearInterval(setIntervalC)

},

/**

* 页面相关事件处理函数--监听用户下拉动作

*/

onPullDownRefresh: function () {

},

/**

* 页面上拉触底事件的处理函数

*/

onReachBottom: function () {

},

/**

* 用户点击右上角分享

*/

onShareAppMessage: function () {

}

})

  • app.js:

App({

   

showloadingMask: function (obj) {

var that = this

if (obj) {

var showloadingMask;

var showloadingTitle = '';

var pathImg_xsw = '/component/img/loading_one.gif';//默认图片路径

var path = '';

var duration = null;

if (obj.showloadingMask)

showloadingMask = obj.showloadingMask

if (obj.showloadingTitle)

showloadingTitle = obj.showloadingTitle

if (obj.success)

var success = obj.success

if (obj.path)

path = obj.path

if (obj.pathImg_xsw)

pathImg_xsw = obj.pathImg_xsw

if (obj.duration)

duration = obj.duration

// console.log(showloadingMask)

var pages = getCurrentPages();

if (path == '') {

var thisPage = pages[pages.length - 1]

}

else {

thisPage = path

}

if (thisPage) {

thisPage.setData({

showloadingMask: showloadingMask,

showloadingTitle: showloadingTitle,

pathImg_xsw: pathImg_xsw

})

if (duration != null) {

setTimeout(function () {

thisPage.setData({

showloadingMask: 'false'

})

if (success) {

return success({ path: thisPage, showloadingMask: 'OK' })

}

}, duration)

}

else {

if (success) {

return success({ path: thisPage, showloadingMask: 'OK' })

}

}

}

}

},

})

  • component组件内容:

    1.component.wxml:

<view class='showloadingMaskZ' style="display:{{showloadingMask=='true'?'block':'none'}}">

<view class='showloading'>

<view direction="all" class='showloading_k'>

<image src='{{pathImg}}'></image>

<view>{{showloadingTitle}}</view>

</view>

</view >

</view>

    2.component.js:

Component({

/**

* 组件的属性列表

*/

properties: {

showloadingMask: { // 属性名

type: String, // 类型(必填),目前接受的类型包括:String, Number, Boolean, Object, Array, null(表示任意类型)

value: 'false', // 属性初始值(可选),如果未指定则会根据类型选择一个

},

showloadingTitle:{

type:String,

value: '',

},

pathImg:{

type:String,

value:'/pages/img/loading_one.gif'

}

},

/**

* 组件的初始数据

*/

data: {

},

/**

* 组件的方法列表

*/

ready:function(){

// console.log(this.data.showloadingMask)

var that=this

var showloadingTitle = that.data.showloadingTitle

var pathImg = that.data.pathImg

if (pathImg==''){

pathImg='/pages/img/loading_one.gif'

}

if (showloadingTitle!=''){

showloadingTitle = showloadingTitle.substring(0, 7)

}

that.setData({

pathImg: pathImg,

showloadingTitle: showloadingTitle

})

},

methods: {

showloading:function(){

this.setData({

mask:true

})

},

hideloading: function () {

this.setData({

mask: false

})

},

}

})

   3. component.wxss:

.showloadingMaskZ{

position: fixed;

top: 0;

left: 0;

width: 100vw;

height: 100vh;

z-index: 99999999999;

}

.showloading{

width: 100%;

height: 100%;

display: flex;

align-items: center;

justify-content: center;

background-color: rgba(0, 0, 0, 0);

}

.showloading_k{

margin-top: -100rpx;

width: 200rpx;

height: 200rpx;

background-color: rgba(0, 0, 0, 0.6);

border-radius: 10rpx;

color: #fff;

font-size: 24rpx;

display: flex;

flex-direction: column;

align-items: center;

justify-content: center;

}

.showloading_k image{

width: 120rpx;

height: 120rpx;

}

.showloading_k view{

margin-top: 20rpx;

color: #fff;

font-size: 24rpx;

}

组件二:

  • wxml.wxml:

<!--

title 弹框title,默认值 ‘提示’ 类型String

content 弹框content,默认值 ‘’ 类型String

showNoCancel 是否不显示取消按钮,默认值 false 类型Boolean

pageNoBind 是否不要页面点击关闭事件,默认值 false 类型Boolean

transparent 是否背景透明,默认值 false 类型Boolean

frontColor 顶部文字颜色,默认值 ‘’ 类型String

backgroundColor 顶部背景色,默认值 ‘’ 类型String

-->

<showModal title='{{xsw_title}}' content='{{xsw_content}}' showNoCancel='{{xsw_showNoCancel}}' pageNoBind='{{xsw_pageNoBind}}' transparent='{{xsw_transparent}}' frontColor='{{xsw_frontColor}}' backgroundColor='{{xsw_backgroundColor}}' showModal='{{xsw_showModal}}'></showModal>

  • wxml.json:

{

"usingComponents": {

"showModal": "/component/showModal"

},

"navigationBarBackgroundColor": "#fbe8b9",

"navigationBarTitleText": "组件备注"

}

  • wxml.js:

// pages/ceshi.js

var app = getApp();

Page({

/**

* 页面的初始数据

*/

data: {

},

onLoad: function (options) {

  

// 自定义showModal弹框

app.showModal({

title: '说明',

content: '自定义的组件showModal自定义的组件showModal自定义的组件showModal自定义的组件showModal自定义的组件showModal自定义的组件showModal自定义的组件showModal自定义的组件showModal自定义的组件showModal自定义的组件showModal自定义的组件showModal自定义的组件showModal自定义的组件showModal自定义的组件showModal自定义的组件showModal自定义的组件showModal自定义的组件showModal自定义的组件showModal自定义的组件showModal自定义的组件showModal自定义的组件showModal',

// showNoCancel:true,//是否不显示 取消按钮

// pageNoBind:true,//是否不要页面点击关闭事件

// transparent: true,// 是否背景透明

frontColor: '#000000',//顶部文字颜色

backgroundColor: '#fbe8b9',//顶部背景色

success: function (res) {

// console.log(res);

if (res.confirm) {

console.log('用户点击确定')

} else if (res.cancel) {

console.log('用户点击取消')

} else if (res.change) {

console.log('用户点击页面')

}

}

})

},

/**

* 生命周期函数--监听页面初次渲染完成

*/

onReady: function () {

},

/**

* 生命周期函数--监听页面显示

*/

onShow: function () {

},

/**

* 生命周期函数--监听页面隐藏

*/

onHide: function () {

},

/**

* 生命周期函数--监听页面卸载

*/

onUnload: function () {

clearInterval(setIntervalC)

},

/**

* 页面相关事件处理函数--监听用户下拉动作

*/

onPullDownRefresh: function () {

},

/**

* 页面上拉触底事件的处理函数

*/

onReachBottom: function () {

},

/**

* 用户点击右上角分享

*/

onShareAppMessage: function () {

}

})

  • app.js:

//app.js

var successObj = null

App({

onLaunch: function () {

},

showModal: function (obj) {

var that = this

if (obj) {

var title = '提示';

var content = '';

var showNoCancel = false;

var pageNoBind = false;

var transparent = false;

var success

var frontColor = ''

var backgroundColor = '';

if (obj.frontColor)

frontColor = obj.frontColor

if (obj.backgroundColor)

backgroundColor = obj.backgroundColor

if (obj.title)

title = obj.title

if (obj.content)

content = obj.content

if (obj.showNoCancel) {

showNoCancel = obj.showNoCancel

}

if (obj.pageNoBind)

pageNoBind = obj.pageNoBind

if (obj.transparent)

transparent = obj.transparent

if (obj.success)

success = obj.success

var pages = getCurrentPages();

var thisPage = pages[pages.length - 1]

if (thisPage) {

thisPage.setData({

xsw_title: title,

xsw_content: content,

xsw_showModal: true,

xsw_showNoCancel: showNoCancel,

xsw_pageNoBind: pageNoBind,

xsw_transparent: transparent,

xsw_frontColor: frontColor,

xsw_backgroundColor: backgroundColor

})

if (success) {

successObj = success

}

}

}

},

callback: function (res) {

return successObj(res)

},

globalData: {

userInfo: null

}

})

  • 组件部分:

   1.component.wxml:

<view class='warp' style="background-color:{{transparent==false?'rgba(0,0,0,0.7)':'rgba(0,0,0,0)'}};" wx:if='{{showModal==true}}'>

<view class='mask_one' data-pan='0' bindtap="{{pageNoBind==false?'colse':''}}"></view>

<view class='bubble' direction="all">

<view class='tishi'>{{title}}</view>

<scroll-view scroll-y class='bubble_one'>

{{content}}

</scroll-view >

<view class='border'></view>

<view class='bFooter'>

<view wx:if='{{showNoCancel==false}}' data-pan='1' bindtap='colse' class='bFooter_z1'>取消</view>

<view wx:if='{{showNoCancel==false}}' class='bFooter_z_B'></view>

<view wx:if='{{showNoCancel==false}}' data-pan='2' bindtap='colse' class='bFooter_z2'>确定</view>

<view wx:if='{{showNoCancel==true}}' data-pan='2' bindtap='colse' class='bFooter_z'>确定</view>

</view>

</view>

</view>

    2.component.js:

// component/showModal.js

var colorRgb = function (sColor) {

sColor = sColor.toLowerCase();

//十六进制颜色值的正则表达式

var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;

// 如果是16进制颜色

if (sColor && reg.test(sColor)) {

if (sColor.length === 4) {

var sColorNew = "#";

for (var i = 1; i < 4; i += 1) {

sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1));

}

sColor = sColorNew;

}

//处理六位的颜色值

var sColorChange = [];

for (var i = 1; i < 7; i += 2) {

sColorChange.push(parseInt("0x" + sColor.slice(i, i + 2)));

}

return "RGB(" + sColorChange.join(",") + ")";

}

return sColor;

};


 

var colorHex = function (color) {

var that = color;

//十六进制颜色值的正则表达式

var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;

// 如果是rgb颜色表示

if (/^(rgb|RGB)/.test(that)) {

var aColor = that.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(",");

var strHex = "#";

for (var i = 0; i < aColor.length; i++) {

var hex = Number(aColor[i]).toString(16);

if (hex.length < 2) {

hex = '0' + hex;

}

strHex += hex;

}

if (strHex.length !== 7) {

strHex = that;

}

return strHex;

} else if (reg.test(that)) {

var aNum = that.replace(/#/, "").split("");

if (aNum.length === 6) {

return that;

} else if (aNum.length === 3) {

var numHex = "#";

for (var i = 0; i < aNum.length; i += 1) {

numHex += (aNum[i] + aNum[i]);

}

return numHex;

}

}

return that;

};

var colorHunHe = function (color) {

var zhi = colorRgb(color)

var rgb = zhi.substr(4, zhi.length - 5)

var rgbArr = rgb.split(',')

// 两种颜色混合后,混色的色值计算,RGB分别用这个公式计算:颜色A - (颜色A - 颜色B) * (1 - 颜色A的百分比)

// 例如:绿和白混合,绿(192, 229, 112)70 %,白(255, 255, 255)30 %R: 192-(192-255)*(1-0.7) = 210.9

// G: 229 - (229 - 255) * (1 - 0.7) = 234.8

// B: 112 - (112 - 255) * (1 - 0.7) = 154.9

// 四舍五入后得到混合色值:(211, 235, 155)

var R = Math.round(0 - (0 - parseInt(rgbArr[0])) * (1 - 0.7))

var G = Math.round(0 - (0 - parseInt(rgbArr[1])) * (1 - 0.7))

var B = Math.round(0 - (0 - parseInt(rgbArr[2])) * (1 - 0.7))

return colorHex('rgb(' + R + ',' + G + ',' + B + ')')

}

var app = getApp()

Component({

/**

* 组件的属性列表

*/

properties: {

title: {

type: String,

value: '提示',

},

content:{

type: String,

value: '',

},

showModal: {

type: Boolean,

value: false,

},

showNoCancel:{

type: Boolean,

value: false,

},

pageNoBind: {

type: Boolean,

value: false,

},

transparent: {

type: Boolean,

value: false,

},

frontColor: {

type: String,

value: '',

},

backgroundColor: {

type: String,

value: '',

},

},

created: function () {


 

},

ready: function () {

},

/**

* 组件的初始数据

*/

data: {

},

/**

* 组件的方法列表

*/

ready: function () {

var that = this

if (that.data.frontColor != '' && that.data.backgroundColor != '') {

var yanSe = colorHunHe(that.data.backgroundColor)

wx.setNavigationBarColor({

frontColor: that.data.frontColor,

backgroundColor: yanSe,

})

wx.hideTabBar({ animation: true })

}

},

methods: {

colse: function (e) {

var that = this

if (that.data.frontColor != '' && that.data.backgroundColor != '') {

wx.setNavigationBarColor({

frontColor: that.data.frontColor,

backgroundColor: that.data.backgroundColor,

})

wx.showTabBar({ animation: true })

}

var change = false, cancel = false, confirm = false;

if (e.currentTarget.dataset.pan==0){

change=true

}

else if (e.currentTarget.dataset.pan == 1){

cancel = true

}

else if (e.currentTarget.dataset.pan == 2){

confirm = true

}

var that = this

that.setData({

showModal: false

})

return app.callback({ confirm: confirm, cancel: cancel, change: change })

},

}

})

   3.component.wxss:

.warp{

position:fixed;

z-index: 999999999;

top:0;

left:0;

right:0;

bottom:0;

display: flex;

flex-direction:row;

align-items: center;

justify-content: center;

height:100vh;

width: 100vw;

}

.allow{

position: absolute;

left: 0;

right: 0;

width: 100%;

height: 100%;

opacity: 0;

}

.mask_one{

position: absolute;

z-index: 8;

width: 100%;

height: 100%;

top: 0;

left: 0;

}

.bubble{

margin-top: -70rpx;

position: relative;

width:490rpx;

background:rgba(255,255,255,1);

box-shadow:0rpx 4rpx 12rpx 0rpx rgba(205,164,61,0.36);

border-radius:10rpx;

z-index: 9;

}

.logo{

width: 83rpx;

height: 90rpx;

margin: 53rpx 0 0 199rpx;

}

.bubble_one{

width: calc(100% - 100rpx);

max-height:400rpx;

margin: 0 auto;

font-size:28rpx;

font-family:MicrosoftYaHei;

font-weight:400;

color:rgba(156,156,156,1);

line-height: 1.5;

overflow-y:hidden;

}


 

.tishi{

width: 100%;

height: 100rpx;

display: flex;

align-items: center;

justify-content: center;

font-size: 30rpx;

}

.border{

width:460rpx;

height:2rpx;

background:rgba(255,227,194,1);

margin: 25rpx auto 0 auto;

}

.bFooter{

width: 100%;

height: 84rpx;

display: flex;

align-items: center;

justify-content: flex-start;

}

.bFooter_z1{

position: relative;

height: 100%;

width: 49%;

font-size:26rpx;

font-family:MicrosoftYaHei;

font-weight:400;

color:rgba(255,228,209,1);

display: flex;

align-items: center;

justify-content: center;

}

.bFooter_z_B{

width:1rpx;

height:40rpx;

background:rgba(255,227,194,1);

}

.bFooter_z2{

position: relative;

height: 100%;

width: 49%;

font-size:26rpx;

font-family:MicrosoftYaHei;

font-weight:400;

color:rgba(247,150,82,1);

display: flex;

align-items: center;

justify-content: center;

}

.bFooter_z{

position: relative;

height: 100%;

width: 100%;

font-size:26rpx;

font-family:MicrosoftYaHei;

font-weight:400;

color:rgba(247,150,82,1);

display: flex;

align-items: center;

justify-content: center;

}

.colse{

position: absolute;

width: 59rpx;

height: 59rpx;

right: -12rpx;

top: -12rpx;

}

猜你喜欢

转载自blog.csdn.net/qq_40591925/article/details/86630695
今日推荐