一分钟教你自定义弹框组件(vue、小程序、uniapp)

导读:本篇文章讲解 一分钟教你自定义弹框组件(vue、小程序、uniapp),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

前言

弹框大家都知道,它是一个因点击或其他情景触发产生的信息的一个承载框,在各个平台的开发中,弹框组件也是五花八门,数不胜数,那你有没有想过自己写一个弹框的组件呢,本章就带大家用不同的框架实现自定义的弹框。


实现思路

其实弹框是一个非常基础且简单的组件,要想实现这个功能核心就是通过一个标识去控制弹框出现的时机,再用事件绑定控制其动态的显隐即可。话不多说,下面直接实战。


vue 实现代码

<template>
  <div>
    <div class="vueDemo">
      <button @click="vueToMdel">点击打开弹窗</button>
      <!-- 弹框内容 -->
      <div class="vueMdelBox">
        <div :hidden="!vueShowModel" class="vueContant">
          <div class="vueTitle">标题</div>
          <div class="vueDetail">内容可能过于基础,但对于刚入门的人来说或许是一个窗口</div>
          <!-- 确定取消按钮 -->
          <div class="vueBtn">
            <p @click="vueShowModel = false">取消</p>
            <p @click="confirm">确定</p>
          </div>
        </div>
        <!-- 背景黑色蒙版 -->
        <div class="vueBgdCol" :hidden="!vueShowModel" @click="vueShowModel = false"></div>
      </div>
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      vueShowModel: false, //默认不显示
    };
  },
  methods: {
    // 点击按钮打开弹框
    vueToMdel() {
      this.vueShowModel = true;
    },
    // 点击确定按钮模态框消失
    confirm() {
      this.vueShowModel = false;
    },
  },
};
</script>
<style scoped>
.vueBgdCol {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: black;
  z-index: 99;
  -moz-opacity: 0.6;
  opacity: 0.6;
  filter: alpha(opacity=88);
}

.vueContant {
  padding: 10px 0px 0px 0px;
  position: fixed;
  top: 36%;
  left: 50%;
  width: 80%;
  margin-left: -40%;
  background-color: white;
  z-index: 100;
  overflow: auto;
  border-radius: 10px;
}

.vueTitle {
  display: flex;
  justify-content: center;
  font-weight: bold;
}

.vueDetail {
  font-size: 14px;
  color: #646566;
  display: flex;
  justify-content: center;
  padding: 16px;
}

.vueBtn {
  display: flex;
}

.vueBtn p {
  width: 50%;
  padding: 5% 0%;
  font-weight: bold;
  text-align: center;
  border-top: 1px solid #ebedf0;
}

.vueBtn p:last-child {
  color: #ee0a24;
  border-left: 1px solid #ebedf0;
}
</style>

vue 实现效果

在这里插入图片描述


小程序

wxml

<button bindtap="miniToMdel">点击打开弹窗</button>
<!-- 黑色背景蒙版 -->
<view class="miniBgdCol" bindtap="miniHideModal" wx:if="{{miniShowModal}}"></view>
<!-- 弹框内容 -->
<view class="modalDialog" wx:if="{{miniShowModal}}">
    <view class="miniTitle">确认退款</view>
    <view class="miniWhether">是否确认申请退款?</view>
    <!-- 取消确定按钮 -->
    <view class="miniBtn">
        <button class="cancel" bindtap="cancel">取消</button>
        <button class="confirm" bindtap="confirm">确定</button>
    </view>
</view>

js

Page({
    data: {
        miniShowModal: false, //默认隐藏弹框
    },
    //点击按钮弹出弹框
    miniToMdel() {
        this.setData({
            miniShowModal: true
        })
    },
    // 点击确定按钮时关闭弹框
    confirm() {
        this.closeOn()
    },
    //点击蒙版时关闭按钮
    miniHideModal: function () {
        this.closeOn()
    },
    //点击取消按钮时关闭弹框
    cancel() {
        this.closeOn()
    },
    // 关闭事件方法
    closeOn() {
        this.setData({
            miniShowModal: false
        })
    },
})

wxss

.miniBgdCol {
    width: 100%;
    height: 100%;
    position: fixed;
    top: 0;
    left: 0;
    background: #000;
    opacity: 0.6;
    overflow: hidden;
    z-index: 0;
}

.modalDialog {
    width: 80%;
    position: fixed;
    top: 32%;
    left: 50%;
    z-index: 9;
    margin-left: -40%;
    background: #f9f9f9;
    border-radius: 20rpx;
}

.miniTitle {
    font-size: 32rpx;
    font-weight: 600;
    color: #252525;
    padding: 24rpx 0rpx;
    border-bottom: 2rpx solid #EEEEEE;
    display: flex;
    justify-content: center;
}

.miniWhether {
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 28rpx;
    color: #252525;
    padding: 40rpx 0rpx;
}

.miniBtn {
    display: flex;
    justify-content: center;
    padding: 10px 0rpx 30rpx 0rpx;
}

button::after {
    border-width: 0
}

.miniBtn button {
    padding: 0rpx 100rpx;
    border-radius: 36rpx;
    font-size: 28rpx;
}

.miniBtn button:first-child {
    border: 2rpx solid #979797;
    color: #5e5e5e;
}

.miniBtn button:last-child {
    background: #FED10A;
}

小程序实现效果

在这里插入图片描述


uniapp

uniapp 实现这个操作只需要将上面 vue 与小程序的代码结合起来即可,因为 uniapp 是基于小程序的标签和 vue 的语法。

<template>
	<view class="uniappDemo">
		<button @tap="uniappModel">点击打开弹窗</button>
		<!-- 弹框内容 -->
		<view class="uniappBox">
			<view :hidden="!uniappShowModel" class="uniappContant">
				<view class="uniappTitle">完善地址</view>
				<view class="uniappNotice">请完善收货地址!</view>
				<!-- 确定取消按钮 -->
				<view class="uniappBtn">
					<view @tap="uniappShowModel = false">取消</view>
					<view @tap="confirm()">确定</view>
				</view>
			</view>
			<!-- 背景黑色蒙版 -->
			<view class="uniappBgdCol" :hidden="!uniappShowModel" @tap="uniappShowModel = false"></view>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				uniappShowModel: false, //默认不显示
			};
		},
		methods: {
			uniappModel() {
				this.uniappShowModel = true
			},
			// 点击确定按钮模态框消失
			confirm() {
				this.uniappShowModel = false
			}
		},
	}
</script>

<style scoped>
	.uniappBgdCol {
		position: fixed;
		top: 0%;
		left: 0%;
		width: 100%;
		height: 100%;
		background-color: black;
		z-index: 99;
		-moz-opacity: 0.6;
		opacity: .6;
		filter: alpha(opacity=88);
	}

	.uniappContant {
		position: fixed;
		top: 36%;
		left: 50%;
		width: 80%;
		margin-left: -40%;
		background-color: white;
		z-index: 100;
		border-radius: 10rpx;
	}

	.uniappTitle {
		display: flex;
		justify-content: center;
		font-size: 32rpx;
		font-weight: bold;
		color: #161303;
		font-size: 28rpx;
		padding: 20rpx 0rpx;
		border-bottom: 2rpx solid #EEEEEE;
		;
	}

	.uniappNotice {
		font-size: 28rpx;
		color: #121212;
		display: flex;
		justify-content: center;
		padding: 40rpx 0rpx;
	}

	.uniappBtn {
		display: flex;
		justify-content: space-between;
	}

	.uniappBtn view {
		width: 50%;
		display: flex;
		justify-content: center;
		align-items: center;
		padding: 4% 0%;
		font-size: 28rpx;
	}

	.uniappBtn view:first-child {
		background-color: rgb(254, 250, 230);
		border-radius: 0rpx 0rpx 0rpx 10rpx;
	}

	.uniappBtn view:last-child {
		background-color: rgb(254, 209, 10);
		border-radius: 0rpx 0rpx 10rpx 0rpx;
	}
</style>

uniapp 实现效果

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/79443.html

(1)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!