使用Vue组件实现一个简单弹窗效果

最近在使用element-ui框架,用到了Dialog对话框组件,大致实现的效果,跟我之前自己在移动端项目里面弄的一个弹窗组件差不太多。然后就想着把这种弹窗组件的实现方式与大家分享一下,下面本文会带着大家手摸手实现一个弹窗组件。

本文主要内容会涉及到弹窗遮罩的实现, slot 插槽的使用方式, props 、 $emit 传参,具体组件代码也传上去了。如果喜欢的话可以点波赞/关注,支持一下,希望大家看完本文可以有所收获。

组件最后实现的效果

使用Vue组件实现一个简单弹窗效果

 

实现步骤

先搭建组件的html和css样式,遮罩层和内容层。

定制弹窗内容:弹窗组件通过 slot 插槽接受从父组件那里传过来弹窗内容。

定制弹窗样式:弹窗组件通过 props 接收从父组件传过来的弹窗宽度,上下左右的位置。

组件开关:通过父组件传进来的 props 控制组件的显示与隐藏,子组件关闭时通过事件 $emit 触发父组件改变值。

1.搭建组件的html和css样式。

html结构:一层遮罩层,一层内容层,内容层里面又有一个头部title和主体内容和一个关闭按钮。

下面是组件中的html结构,里面有一些后面才要加进去的东西,如果看不懂的话可以先跳过,

<template> <div> <!--外层的遮罩 点击事件用来关闭弹窗,isShow控制弹窗显示 隐藏的props--> <div v-if="isShow" @click="closeMyself"></div> <!-- transition 这里可以加一些简单的动画效果 --> <transition> <!--style 通过props 控制内容的样式 --> <div :style="{top:topDistance+'%',width:widNum+'%',left:leftSite+'%'}" v-if="isShow"> <div> <!--弹窗头部 title--> <slot>提示信息</slot> </div> <div :style="{paddingTop:pdt+'px',paddingBottom:pdb+'px'}"> <!--弹窗的内容--> <slot>弹窗内容</slot> </div> <!--弹窗关闭按钮--> <div @click="closeMyself"> <div></div> </div> </div> </transition> </div> </template>

下面是组件中的主要的css样式,里面都做了充分的注释,主要通过 z-index 和 background 达到遮罩的效果,具体内容的css可以根据自己的需求来设置。

<style lang="scss" scoped> // 最外层 设置position定位 .dialog { position: relative; color: #2e2c2d; font-size: 16px; } // 遮罩 设置背景层,z-index值要足够大确保能覆盖,高度 宽度设置满 做到全屏遮罩 .dialog-cover { background: rgba(0,0,0, 0.8); position: fixed; z-index: 200; top: 0; left: 0; width: 100%; height: 100%; } // 内容层 z-index要比遮罩大,否则会被遮盖, .dialog-content{ position: fixed; top: 35%; // 移动端使用felx布局 display: flex; flex-direction: column; justify-content: center; align-items: center; z-index: 300; } </style>

2. 通过 slot 定制弹窗内容

这一步,只要理解了 slot 的作用以及用法,就没有问题了。

单个插槽:

<slot>这是在没有slot传进来的时候,才显示的弹窗内容</slot>
上面是单个插槽也叫默认插槽,在父组件中使用插槽的正确姿势:

<my-component> <!--在my-component里面的所有内容片段都将插入到slot所在的DOM位置,并且会替换掉slot标签--> <!--这两个p标签,将替换整个slot标签里面的内容--> <p>这是一些初始内容</p> <p>这是更多的初始内容</p> </my-component>

ps:如果子组件里面包含 slot 插槽,那么上面的p标签的内容将会被丢弃。

具名插槽:

所谓的具名插槽,即为 slot 标签赋一个 name 属性,具名插槽可以父组件中不同的内容片段放到子组件的不同地方,具名插槽还是可以拥有一个默认插槽。下面可以看一下弹窗组件插槽的使用方式:

<div> <!--弹窗头部 title--> <slot>提示信息</slot> </div> <div :style="{paddingTop:pdt+'px',paddingBottom:pdb+'px'}"> <!--弹窗的内容--> <slot>弹窗内容</slot> </div>

在父组件中的使用方式:

将弹窗组件引入要使用的组件中,并通过 components 注册成为组件。
父组件中弹窗组件插槽的使用方法如下。

<dialogComponent> <div slot="header">插入到name为header的slot标签里面</div> <div slot="main"> 这里是内容插入到子组件的slot的name为main里面,可以在父组件中添加class定义样式,事件类型等各种操作 </div> </dialogComponent>

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/21456945b08af05999dfa642cb992530.html