博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
有关组件的尝鲜-SAOUnit弹窗
阅读量:7247 次
发布时间:2019-06-29

本文共 3671 字,大约阅读时间需要 12 分钟。

只有动手去做的时候,才是距离成功最近的时候

最近开始学习了一个前端开发思维,在这里给和我一样的“童鞋”做下分享,大佬轻喷。

什么是组件

组件是对数据和方法进行封装,每个组件都有自己的属性和方法,是面向对象编程的核心。一个组件可以在许多地方进行使用,这样就不需要进行重复写代码。写代码讲究高内聚低耦合,组件很好的体现了这个思想。

前端的组件长啥样

现如今前端框架层出不穷,这些框架里面就是包含了许许多多的组件,它们有着自己的css样式和JS脚本。用我最近使用的Swiper举例吧。

先引入CSS样式表和JS脚本,再到<body></body>中创建好指定类名的标签们,最后再初始化一下,这个组件的功能就会被实现了。当然也有一些是纯CSS样式的组件,这里就不多推荐了。

在写过一次代码后,这些组件就可以到任意一个页面中使用了,无需重新写过一遍CSS样式或者JS脚本(初始化还是要再写一遍的)。

SAOUnit弹窗

好了,上面简单的介绍了一下组件。如今我正在着手几个项目,有学校课程需要、有参赛项目需要,还有个人爱好。

今天我就分享一个我个人项目(自嗨)的一个组件。不多说看图

很明显,这是一个弹窗组件,是刀剑神域风格的(非常SAO)。

我之所以做这么一个弹窗组件,是因为默认的弹窗alert()实在霸道,它一弹出来,你的页面就被暂停掉了。突然间的暂停让我很不爽,所以就有了这么一个东西。


来看看DOM结构吧

//弹窗标题
//弹窗内容
取消
//取消按钮
确定
//确定按钮
复制代码

CSS样式我就不放上来了(目前效果不太好),直接来看JS脚本部分,如何实现一个组件的功能。

首先我将这个组件的属性和方法封装在一个构造函数里面。

function MPBpopup(theNode, json) {    ···}复制代码
参数 必须
theNode String类型,选取当前组件的class或者id
json JSON格式的数据,可选值有title:'标题',text:'内容',okFunc:点击确定调用的函数,noFunc:点击取消调用的函数 可选

每个组件都有自己的属性和方法,下面是该弹窗组件的属性

var _node = document.querySelector(theNode);//获取组件节点var _content = { //默认弹窗内容    title: "Message", //标题    text: "Nothing in here", //内容    okFunc:()=>{}, //确定时调用的函数    noFunc:()=>{this.hiddenPopup()} //取消时调的用函数}复制代码
// 初始化设置var _frame = _node.getElementsByClassName('saopopup-frame')[0]; //弹窗主体_node.classList.add('saopopup-close'); // 添加隐藏样式_node.getElementsByClassName('saopopup-button-no')[0].onclick = function(){    _content.noFunc(); //绑定点击取消的方法}_node.getElementsByClassName('saopopup-button-ok')[0].onclick = function(){    _content.okFunc(); //绑定点击确定的方法}复制代码

以上这些属性都是私有的,前面用一个下划线表示。当使用构造函数创建对象时就会被生成。

组件就要有组件的样子,能够弹出展示内容和关闭就行。不过只有默认的属性值肯定是不行的,弹窗里显示什么内容就得我们自己输入了。

私有方法:将内容写入弹窗中

// 设置弹窗的标题以及内容function _setContent() {    _node.getElementsByClassName('saopopup-title')[0].innerHTML = _content.title;    _node.getElementsByClassName('saopopup-text')[0].innerHTML = _content.text;}复制代码

当然这只是填写了初始默认值,修改弹窗内容需要用到下面这个。

私有方法:修改属性

// 设置对象属性,包含数据合法性判断function _setData(json){    if(json){      if(json.title) _content.title = json.title;      if(json.text) _content.text = json.text;      if(json.okFunc) _content.okFunc = json.okFunc;      if(json.noFunc) _content.noFunc = json.noFunc;    } else {      return;    }}复制代码

私有方法:获取组件主体的高度

// 获取弹窗的高度,用于高度过渡效果function _getPopupHeight() {    return _frame.offsetHeight;}复制代码

当组件内部设置好了后,剩下的就是交给外部调用了。

对象方法:打开弹窗

this.showPopup = function (json) {    _setData(json); //设置弹窗的内容,如果没有传参进来就使用初始化值    _node.classList.remove('saopopup-close'); //移除 display:none    _node.classList.add('saopopup-open'); //添加 display:block 附带一段animation    _setContent(); //将弹窗的内容填入页面中     // 这里的延时非常有必要,不然会因为异步执行而取不到主体正确的高度    setTimeout(()=>{      _node.style.height = _getPopupHeight() + 'px'; // GIF图中高度展开的过渡    },300)}复制代码

对象方法:关闭弹窗

this.hiddenPopup = function () {    _node.classList.remove('saopopup-open'); // 移除 display:block    _node.style.height = '39px'; // 将主体收起    // 给主体一段时间过渡,再添加display:none    setTimeout(()=>{      _node.classList.add('saopopup-close');    },200)}复制代码

以上就是这个弹窗组件的主要内部逻辑啦~~

此组件放在了上,我会进行更新和维护,如果感兴趣的话就给个★吧。欢迎在回复区讨论和指教。

SAOUnit弹窗使用方式

  1. 首先引入css和js
    ...    
... ...复制代码
  1. HTML内容
取消
确定
复制代码
  1. 初始化一下,最好是挨着</body>标签
var myPopup = new MPBpopup('.saopopup-container',{    title:"测试用标题",    text:"测试用内容

第二行测试内容

第三行测试内容

", okFunc:()=>{myPopup.hiddenPopup()} // 这里设置了点击确认关闭弹窗。关还是不关,取决于你而不是组件。 noFunc是默认关闭弹窗的});复制代码
  1. 需要弹窗时使用
myPopup.showPopup(); //然后你就可以看见GIF图的效果了复制代码

转载于:https://juejin.im/post/5cc80f4de51d456e8b07ddee

你可能感兴趣的文章
anaconda python36 tensorflow virtualenv
查看>>
ActiveX Control在sdk中的几个例子
查看>>
六月第四周
查看>>
【Tree】迷宫生成算法
查看>>
python && java
查看>>
.net performance optimize your C# app 读书笔记
查看>>
关于相对布局RelativeLayout的各种属性介绍
查看>>
LOJ#2087 国王饮水记
查看>>
Shell编程中的变量作用域
查看>>
数位DP
查看>>
PLSQL Convert Object to String
查看>>
Linux 串口驱动设计二
查看>>
jQuery方法判断checkbox是否选中以及改变checkbox的选中状态
查看>>
CSS样式设置小技巧
查看>>
PDF 补丁丁 0.4.2.1063 测试版发布:新增检查新版本功能
查看>>
Module的加载实现
查看>>
统计学 学习第一季第一集《统计学习方法》第一章 统计学方法概论 简要概述...
查看>>
css学习_css补充知识
查看>>
python 08day--软件包的管理及ssh、samba、apache服务
查看>>
ThinkPPHP学习(一)生成图片验证码
查看>>