js弹出框自定义(js实现弹出框的插件)

2022-07-22 21:38:34  浏览:325  作者:管理员
  • js弹出框自定义(js实现弹出框的插件)

  • 【商户信息】

  • 类目:知识大全


  • 联系人:


  • 微信号:

  • Q Q 号:

  • 手机号:

  • 浏览量:

    325


【货源详情】


今天,我要和朋友们分享一下新开发的React自定义对话框中最近的RLayer。

基于33558www.Sina.com/react.js开发的PC桌面端交互式弹出组件。 融合了诊断、消息、通知、操作表、状态、电源、电源确认等多种功能。

一看到名称就会联想到前端界有名的弹匣layer.js,实际上在设计开发之初就以layer插件为参考实现了思想。

功能

提供函数表达式调用方法rlayer({…} )

rlayer弹框类型(toast|footer|actionsheetpicker|Android/IOs|context menu|drawer|ifration )

12+弹匣动画(fade in ) )。

引入组件

在需要组件的页面上引入rlayer组件。

//导入弹框单元RLayer

importrlayerfrom './components/rlayer '

快速使用

导入后可以用函数rlayer({…} )调用。

7+种个以上的参数可以自由组合,快速实现各种各样的个性化效果。

//msg消息

const showMsg=() ) )。

Rlayer({

content: '这是msg消息提示',

shade close :假,

xclose: false,

time: 2

() )

}

//confirm询问框

const showConfirm=()={

let $el=rlayer({ (

标题: '问题标题',

content : ' div style=' color : # 0070 F3; padding:30px; '确认框(这里是确认框提示信息,这里是确认框提示信息,这里是确认框提示信息(/div ),

shade close :假,

zIndex: 1001,

锁定滚动:假,

结果:真,

拖动输出:真,

btns: [

{

文本: '取消',

时钟: (() )。

$el.close (

}

(,

{

文本:“确定”、

style : { color : ' # 61 dafb ' }为,

时钟: (() )。

handleInfo () )

}

}

]

() )

}

30+

classrlayercomponentextendsreact.com ponent {

//.

render ()。

let opt=this.state

return (

div class name={ DOM utils.class names (Rui _ layer ),{rui_layer-closed ) : opt.close cls } id={ ' block ' 3330 }

{}

{ opt.shadedivclass name=' rlayer _ _ overlay ' onclick={ this.shade clicked } style={ opacity 3360 opt.opacity }

{}

div class name={ DOM utils.class names } ' rlayer _ _ wrap ',opt.anim'anim-' opt.anim,opt.type ' popui _ ' opop

{ opt.titledivclassname=' rlayer _ _ wrap-tit ' dangerouslysetinnerhtml={ _ _ html 3360 opt.title }/div }

{ opt.type=='toast' opt.icon? div class name={ DOM utils.class names (rlayer _ _ toast-icon ),' rlayer__toast-' opt.icon ) } dangerouslysesessesesessesese

div class name=' rlayer _ _ wrap-CNT box '

{ opt.content?

{

opt.type=='iframe '?

iframe scrolling=' auto ' allow transparency=' true ' frameborder='0' src={ opt.content }/iframe

:

(opt.type==' message '|opt.type==' notify '|opt.type==' popover '?)

div className='rlayer__wrap-cnt '

{ opt.iconiclass name={ DOM utils.class names } ' rlayer-msg _ icon ',opt.icon } dangerouslysetinnerhtml={ }

div class name=' rlayer-msg _ _ group '

{ opt.titledivclassname=' rlayer-msg _ title ' dangerouslysetinnerhtml={ _ _ html 3360 opt.title }/div }

{ typeof opt.content=='string '?

div class name=' rlayer-msg _ content ' dangerouslysetinnerhtml={ _ _ html 3360 opt.content }/div

:

div class name=' rlayer-msg _ _ content ' { opt.content }/div

() ) ) ) )。

/div

/div

) )

:

typeof opt.content=='string '?

(div class name=' rlayer _ _ wrap-CNT ' dangerouslysetinnerhtml={ _ _ html 3360 opt.content } }/div )

:

opt.content

) )

() ) ) ) )。

//

:

空值

() ) ) ) )。

/div

{}

{ opt.btnsdivclassname=' rlayer _ _ wrap-btns '

{

opt.btns.map () BTN,index )={

returnspan class name={ DOM utils.class names (' BTN ),{ ' BTN-disabled ' : BTN.disabled } } key={ index } style=

() )

() ) ) ) )。

/div

() ) ) ) )。

{ opt.xclosespanclass name={ DOM utils.class names } ' rlayer _ _ x close '! opt.maximize opt.x position } style={ { color : opt.xcolor } } onclick={ this.close }/span }

{ opt.maximizespan class name=' rlayer _ _ maximize ' onclick={ this.maximize clicked }/span }

{ opt.resizespan class name=' rlayer _ _ resize '/span }

/div

{}

div class name=' rlayer _ _ drag fix '/div

/div

//

) )

() ) ) ) )。

() ) ) ) )。

RLayer弹框模板

classrlayercomponentextendsreact.com ponent {

静态默认属性={

//参数

id: ',//{string}控制弹层唯一标识,相同id共享一个实例

title: ',//{string}标题

content: ',//{字符串| element }内容(字符串或组件支持) ) ) ) ) ) ) ) )。

type: ',//{string}弹框型

层样式: ',//{object}自定义框的样式

icon: ',//{string} Toast图标(loading|success|fail ) ) ) ) ) ) ) ) ) )。

遮罩层是否显示在shade: true,//{bool}中

shadeClose: true,//{bool}是否单击遮罩层关闭弹匣

lockScroll: true,//{bool}弹出框显示时是否锁定body滚动

opacity: ',//{ number }遮罩层的透明度

xclose: true,//{bool}中是否显示关闭图标

xposition: 'right ',//{string}关闭图标的位置(top|right|bottom|left ) () ) ) ) ) ) )的位置

xcolor: '#333 ',//{string}关闭图标的颜色

anim: 'scaleIn ',//{string}弹框动画

position: 'auto ',//{string|array}弹框位置

drawer: ',//{string}抽屉组合(top|right|bottom|left ) () ) ) ) ) ) ) ) ) ) )。)

follow: null,//{string|array}跟随定位弹框

time: 0,//{number}弹匣自动关闭的秒数(1|2|3. )

zIndex: 8090,//{number}弹框层叠

topmost: false,//{bool}是否击中当前弹匣

area: 'auto ',//{string|array}弹框宽度高度

maxWidth: 375,//{number}弹框最大宽度(仅在area:'auto '的情况下设置有效) ) ) ) ) ) ) ) ) ) )。

maximize: false,//{bool}是否显示最大化按钮

fullscreen: false,//{bool}是全屏弹的吗

fixed: true,//{bool}要么固定弹框

drag: '.rlayer__wrap-tit ',//{ string }拖动元素

dragOut: false,//{bool}是否允许向浏览器外拖动

lockAxis: null,//{string}限制拖动方向选项: v垂直、h水平,默认情况下没有限制

resize: false,//{bool}弹匣是否允许拉伸

btns: null,//{array}组合按钮(参数:text|style|disabled|click ) ) ) ) ) ) )。

//事件

success: null,//{func}层弹出回调

结束: null,//{func}层销毁后回调

() ) ) ) )。

//.

() ) ) ) )。

导入从' react ' react '

import ReactDOM from 'react-dom '

//导入操作系统

import domUtils from './utils/dom '

let $index=0,$lockCount=0,$timer={}

classrlayercomponentextendsreact.com ponent {

constructor{

super(props )

this.state={

//.

() ) ) ) )。

this.closeTimer=null

() ) ) ) )。

组件修改

window.addevent listener (' resize ',this.autopos,false ) )。

() ) ) ) )。

componentWillUnmount

window.removeeventlistener (' resize ',this.autopos,false ) )。

cleartimeout(this.closetimer ) )。

() ) ) ) )。

open=(options )={

options.id=options.id|` rlayer-$ { DOM utils.generate id (} )

this.setState({ (

. this.props, options,opened: true,

、() ) )={

const { success }=this.state

type of success==' function ' success.call (this ) )。

this.auto () )

this.callback (

() )

() ) ) ) )。

close=() )。

const { opened,time,end,remove,rlayerOpts,action }=this.state

if (! opened (返回)

this.setstate (close cls : true ) ) ) )。

cleartimeout(this.closetimer ) )。

this.closeTimer=setTimeout (

this.setState({ (

close cls :假,

opened :假,

() )

rlayer opts.lock scroll (if )

$lockcount---

if (! $lockCount

document.body.style.padding right=' '

文档. body.class list.remove (RC-overflow-hidden ) )。

() ) ) ) )。

() ) ) ) )。

if(time ) (

$index--

() ) ) ) )。

if (动作==' update ' ) {

document.body.style.padding right=' '

文档. body.class list.remove (RC-overflow-hidden ) )。

() ) ) ) )。

rlayer opts.isbodyoverflow (document.body.style.overflow=' ' )

remove () )

type of end==' function ' end.call (this ) )。

(,200 );

() ) ) ) )。

//弹框的位置

auto=() ) )。

//.

() ) ) ) )。

autopos=() )。

const { opened,id,fixed,follow,position }=this.state

if (! opened (返回)

let oL,oT

let DOM=document.query selector (' # ' id )。

letrlayero=DOM.query selector (.rlayer _ _ wrap ) ) ) ) )。

if (! 固定| {

rayero.style.position=' absolute '

() ) ) ) )。

letarea=[DOMutils.client(width ) ],DOM utils.client (height ),rlayero.offsetWidth,rlayero.offsetHeight]

ol=(area[0]-area[2] )/2

ot=(area[1]-area[3] )/2

if(follow ) {

this.offset (

} else {

typeof position==='object '? (

ol=parsefloat(position[0]|0,ot=parsefloat ) position[1]|0

) : (

position=='t '? oT=0 :

position=='r '? oL=area[0] - area[2] :

position=='b '? oT=area[1] - area[3] :

position=='l '? oL=0 :

position=='lt '? (oL=0,oT=0) :

position=='rt '? (oL=area[0] - area[2],oT=0) :

position=='lb '? (oL=0,oT=area[1] - area[3] ) :

position=='rb '? oL=area[0] - area[2],ot=area[1]-area[3]]:

空值

) )

rayero.style.left=parsefloat (fixed? oL:DOMutils.scroll(left ) (ol ) (px ) )。

rayero.style.top=parsefloat (fixed? oT:DOMutils.scroll(top ) ot )、) px )。

}

}

//跟随元素的位置

offset=() )。

const { id,follow }=this.state

let oW,oH,pS

let DOM=document.query selector (' # ' id )。

letrlayero=DOM.query selector (.rlayer _ _ wrap ) ) ) ) )。

oW=rlayero.offsetWidth

oH=rlayero.offsetHeight

PS=DOM utils.getfollowrect (follow,ow,oH ) )。

this.setstate ({ tip arrow : PS [2] } )

rlayero.style.left=pS[0] 'px '

rlayero.style.top=pS[1] 'px '

}

//最大化弹框

full=() ) )。

//.

}

//恢复弹框

还原=() ) )。

const { id,maximize,rlayerOpts }=this.state

let DOM=document.query selector (' # ' id )。

letrlayero=DOM.query selector (.rlayer _ _ wrap ) ) ) ) )。

Leto tit=DOM.query selector (.rlayer _ _ wrap-tit ) ) ) ) ) )。

Leto CNT=DOM.query selector (.rlayer _ _ wrap-CNT box ) ) ) ) ) ) ) )。

Leto BTN=DOM.query selector (.rlayer _ _ wrap-btns ) ) ) ) ) ) ) Leto BTN=DOM.query selector (.rlayer _ wrap-btns ) )

Leto max=DOM.query selector (.rlayer _ _ maximize ) ) )。

let t=otit? otit.offsetHeight : 0

let b=obtn? obtn.offsetHeight : 0

if (! rlayerOpts.lockScroll ) {

rlayer opts.isbodyoverflow=false

this.setstate(rlayeropts ) ) )。

document.body.style.overflow=' '

}

maximize omax.class list.remove (maximized ) )。

rayero.style.left=parsefloat (rlayer opts.rect [0] ) ' px '

rayero.style.top=parsefloat (rlayer opts.rect [1] (px )。

rayero.style.width=parsefloat (rlayer opts.rect [2] ) ' px '

rlayero.style.height=parsefloat (rlayer opts.rect (() px ) ) ) ) )。

ocnt.style.height=parsefloat (rlayer opts.rect [3]-t-b ) ' px '

}

//拖动|缩放弹匣

move=() ) )。

//.

}

//事件处理

callback=() )。

const { time }=this.state

//倒计时并关闭弹框

if(time ) (

$index

//防止重复计数

if($Timer ) $index!=null ) clear time out ($ timer ($ index ) ) ) ) ) ) ) ) )。

$timer[$index]=setTimeout (

this.close () )

、parseint(time ) * 1000;

}

}

//点击最大化按钮

最大化clicked=(e )={

let o=e.target

if (o.class list.contains (' maximized ' ) ) }

//恢复

this.restore (

} else {

//最大化

this.full ()

}

}

//单击遮罩层

shadeClicked=(

if(this.State.shadeclose ) {

this.close () )

}

}

//按钮事件

BTNclicked=(index,e )={

let btn=this.state.btns[index]

if (! btn.disabled ) {

type of BTN.click==' function ' BTN.click (

}

}

}

那么,以上就是基于React.js实现PC端弹出框组件。 希望能帮到大家。

评论区

共0条评论
  • 这篇文章还没有收到评论,赶紧来抢沙发吧~

【随机新闻】

返回顶部