自己封裝一個彈框插件

彈出層提示信息,這是移動前端開發中最常見的需求,你可能會想到一些流行的彈框插件,比如 經典的artDialog?炫酷的Sweetalert等等..

但是慢慢地你其實會發現通常情況下需求定制化要求較高,一般的彈框插件可能只滿足大部分要求,自定義花的時間還不如手動自己封裝一個符合自己開發習慣的彈框組件,這樣后續開發效率將大大提高。

?

首先整理一下思路,原生javascript其實是有實現alert()方法的,但是那個會暫時性中斷程序運行,并且足以讓你丑拒!那么拋開這些細細一想,其實彈框就是兩個div層,一個浮在底下的蒙層(遮罩層),將所有的元素遮起來,并且最好是半透明。另一個就是彈框主體部分了,一般情況需要水平垂直居中,并且通常包含標題,主體內容需要可定制,如果是模態框通常還有確認/取消按鈕。最后就是彈出、關閉的時候一些動效。

?所以說完全可以自己封裝一個,然后放在項目中公共js中去。能自己手寫的盡量不用插件....

?

一些默認屬性值

通過一個foreach循環,類似于傳入的opts繼承了defaultOpts屬性,在調用彈框之前執行的before()方法,相當于一些準備工作

復制代碼
var defaultOpts = {title: '',//標題content: '',//內容  文字 || htmlheight: 50,//默認屏幕(父級)的50%width: 80,//默認屏幕(父級)的80%type: 'alert-default',//彈框類型effect: 'fadeIn',//出現效果,默認下跌落delayTime: 500,//效果延時時間,默認.5sautoClose: false,//自動關閉autoTime: 2000, //自動關閉時間默認2sautoEffect: 'default',//關閉效果ok: '確定',okCallback: function(){},//確定回調cancel: '取消',cancelCallback: function(){},//取消回調before : function() {console.log('before')}, close: function() {console.log('close')},blankclose: false//空白處點擊關閉}for (i in defaultOpts) {if (opts[i] === undefined) {opts[i] = defaultOpts[i]}}
  
  opts.before && opts.before()
復制代碼

?

dom結構

定義一個數組對象,里面放彈框的dom元素,alert-mask為全屏的遮罩層,alert-content為彈框的主要內容區,最后通過.join(‘’)函數將數組轉換為html ,再用jquery的append()方法追加在body節點最后。

復制代碼
var alertHtml = ['<section class="alert-main" id="alertMain">','<div class="alert-mask li-opacity" id="alertMask"></div>','<div class="alert-content '+ opts.type +'" id="alertContent">',opts.content +'</div>','</section>']$('body').append(alertHtml.join(''))
復制代碼

?

設置高寬了,水平垂直居中

我這里是采用fixed定位,然后height是傳進來的高(百分比),top距離屏幕頂端距離百分比為 100-傳進來的高 /2 ,這樣就實現了垂直居中,同理寬度也一樣。這種水平垂直居中的辦法也是自己長期實踐總結出來自己認為最簡單最實用的,兼容各種屏幕大小,當然還有很多方法,可以自行嘗試

復制代碼
var $alertContent = $('#alertContent'),$alertMain = $('#alertMain');$alertContent.css({'height': opts.height + '%','top': (100 - opts.height)/2 + '%','width': opts.width + '%','left': (100 - opts.width)/2 + '%'})$('.li-opacity').css({'-webkit-animation-duration' : opts.delayTime/1000 + 's'})
復制代碼

最后一句是給遮罩層賦一個動畫執行時間,實現淡入效果。詳情見下面的CSS @-webkit-keyframes opacity

?

彈框效果

我這里實現了四個效果,分別是fadeIn跌落,sideLeft從左側飛入,scale放大,info提示信息。可以看到,我是定義了一個集合對象,分別放置了對應的css屬性,然后通過兩個setTimeout函數統一賦值

復制代碼
var effect = {'fadeIn': 'top','fadeInStart': '-100%','fadeInValue': (100 - opts.height)/2 + '%','sideLeft': 'left','sideLeftStart': '-100%','sideLeftValue': (100 - opts.width)/2 + '%','scale': '-webkit-transform','scaleStart': 'scale(0)','scaleValue': 'scale(1)','info': '-webkit-transform','infoStart': 'scale(1.2)','infoValue': 'scale(1)'}setTimeout(function(){$alertContent.css(effect[opts.effect],effect[opts.effect + 'Start']).addClass('alert-show')setTimeout(function(){$alertContent.css(effect[opts.effect], effect[opts.effect + 'Value'])opts.close && opts.close()},10)},opts.delayTime)
復制代碼

?

空白處點擊關閉

通常情況下的需求,都會是要點擊彈框空白處關閉彈框,一個點擊事件搞定,重點是前面的選擇器,jquery給了我們太多方便.... 當然最后為了防止點擊到頁面其他元素,阻止事件冒泡,組件默認行為..

復制代碼
if(opts.blankclose) {$('.alert-main :not(.alert-content)').on('click',function(event){$alertMain.remove()opts.close && opts.close()event.stopPropagation()event.preventDefault()})}
復制代碼

?

自動關閉

當autoClose為true,并且autoTime大于零時,用一個延時事件自動關閉彈框

if(opts.autoClose && opts.autoTime > 0) {setTimeout(function(){$alertMain.remove()},opts.autoTime)opts.close && opts.close()}

?

演示:

css

復制代碼
@-webkit-keyframes opacity {0% {opacity: 0; /*初始狀態 透明度為0*/}50% {opacity: 0; /*中間狀態 透明度為0*/}100% {opacity: 1; /*結尾狀態 透明度為1*/}}.li-opacity {-webkit-animation-name: opacity; /*動畫名稱*/-webkit-animation-iteration-count: 1; /*動畫次數*/-webkit-animation-delay: 0s; /*延遲時間*/}.alert-mask {position: fixed;height: 100%;width: 100%;left: 0%;top: 0%;z-index: 9998;background-color: rgba(0,0,0,.7);}.alert-content {position: fixed;box-sizing: border-box;border-radius: 4px;z-index: 9999;-webkit-transition: .4s;-moz-transition: .4s;transition: .4s;display: none;}.alert-show {display: block;}.alert-default {background-color: white;}
復制代碼

?

html

<p class="alert" data-flag="fadeIn">fadeIn</p><p class="alert" data-flag="sideLeft">sideLeft</p><p class="alert" data-flag="scale">scale</p><p class="alert" data-flag="info">info</p>

?

js

復制代碼
require.config({jquery:'component/jquery/jquery-3.1.0.min',liAlert: 'li/li-alert',//常用彈框組件
})require(['jquery'],function($){require(['liAlert'],function(){$('.alert').on('click',function(event){$.alert({content: '<h1 style="display:flex;justify-content:center;">我是彈框</h1>',effect: $(event.currentTarget).attr('data-flag'),blankclose: true,//autoClose: true})})})})
復制代碼

?

效果圖

?

完整的代碼已上傳github:?https://github.com/helijun/component/tree/master/alert

?

ITer,請跟隨興趣一路前行,個人站點www.liliangel.cn,歡迎指導交流

轉載于:https://www.cnblogs.com/libin-1/p/6181953.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285177.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285177.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285177.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言中include““與include<>的區別(自定義頭文件、預設頭文件)

文章目錄 新建控制臺應用程序自定義頭文件編輯頭文件工程內引用頭文件,調用函數標準庫頭文件,調用函數新建控制臺應用程序 Win32 Application和Win32 Console Application 都是工作在32位Windows環境的程序。其中: (1)Win32 Application就是普通的常見的窗口應用程序,當…

.NET MAUI 性能提升

點擊藍字關注我們作者&#xff1a;Jonathan Peppers翻譯&#xff1a;Yijing Sun校稿&#xff1a;Amy Peng排版&#xff1a;Rani Sun精彩預告*本文干貨滿滿&#xff0c;預計閱讀時間32分鐘&#xff0c;建議收藏保存。.NET多平臺應用程序UI (MAUI)將android、iOS、macOS和Windows…

類與類之間的關系

橫向關系依賴 關聯 聚合 組合 判斷方法&#xff1a; 生命周期有關系&#xff1a;組合&#xff0c;聚合  聚合&#xff1a;包含多個相同的類  組合&#xff1a;定義的時候就要有  依賴&#xff1a;只要使用就必須要有  關聯&#xff1a;可有可無 縱向關系繼承 基類( 父類…

C語言試題155之有五個學生,每個學生有 3 門課的成績,從鍵盤輸入以上數據(包括學生號,姓名,三門課成績),計算出 平均成績,況原有的數據和計算出的平均分數存放在磁盤文件“stud“中

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:有五個學生,每個學生有 3 門…

仿照支付寶賬單界面--listview分組顯示 用來做!發!財樹充值交易明細

QQ圖片20150430155638.png (151.65 KB, 下載次數: 32) 下載鏈接: http://pan.baidu.com/s/1kVMY1SV 密碼: i8ta

系統中常用的目錄

Linux系統中常用的目錄 目錄 /bin 存放二進制可執行文件(ls,cat,mkdir等)&#xff0c;常用命令一般都在這里。 /etc 存放系統管理和配置文件 /home 存放所有用戶文件的根目錄&#xff0c;是用戶主目錄的基點&#xff0c;比如用戶user的主目錄就是/home/user&#xff0…

C語言試題156之有兩個磁盤文件 A 和 B,各存放一行字母,要求把這兩個文件中的信息合并(按字母順序排列), 輸出到一個新文件 C 中。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:有兩個磁盤文件 A 和 B,各存…

【ArcGIS微課1000例】0002:創建漁網(Create fishnet)

本文講解ArcGIS軟件中漁網(fishnet)工具的原理,方法及使用技巧。 文章目錄 微課目標工具介紹實現過程微課目標 如下圖所示,影像為無人機航測生產的DOM,現在需要在ArcGIS平臺中進行DLG數據采集(數字化),由于測區較大,需要創建500*500的漁網,并對影像進行裁剪下發給多…

基于http協議的api接口對于客戶端的身份認證方式以及安全措施[轉]

基于http協議的api接口對于客戶端的身份認證方式以及安全措施 由于http是無狀態的&#xff0c;所以正常情況下在瀏覽器瀏覽網頁&#xff0c;服務器都是通過訪問者的cookie(cookie中存儲的jsessionid)來辨別客戶端的身份的&#xff0c;當客戶端進行登錄服務器也會將登錄信息存放…

使用 Scrutor 快速實現“裝飾者模式”

裝飾者模式介紹裝飾器模式&#xff08;Decorator Pattern&#xff09;是在不改變原類和使用繼承的情況下&#xff0c;動態地給一個對象添加一些額外的職責。它是通過創建一個包裝對象&#xff0c;也就是裝飾來包裹真實的對象。可以在如下使用場景中使用裝飾器模式&#xff1a;在…

各個 Android Gradle 插件版本所需的 Gradle 版本

下表列出了各個 Android Gradle 插件版本所需的 Gradle 版本。 要獲得最佳性能&#xff0c;您應該使用 Gradle 和插件這兩者的最新版本。 插件版本所需的 Gradle 版本1.0.0 - 1.1.32.2.1 - 2.31.2.0 - 1.3.12.2.1 - 2.91.5.02.2.1 - 2.132.0.0 - 2.1.22.10 - 2.132.1.3 - 2.2…

JS時間戳和時間互轉

https://www.cnblogs.com/nield-bky/p/6040853.html http://blog.csdn.net/csdn565973850/article/details/73838583 時間轉時間戳&#xff1a; javascript獲得時間戳的方法有四種&#xff0c;都是通過實例化時間對象 new Date() 來進一步獲取當前的時間戳1.var timestamp1 Da…

C語言試題157之從鍵盤輸入一個字符串,將小寫字母全部轉換成大寫字母,然后輸出到一個磁盤文件“test”中保存。 輸入的字符串以!結束

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:從鍵盤輸入一個字符串,將小…

【ArcGIS微課1000例】0001:添加XY數據(Add XY data)生成shp

用過CASS的人都知道&#xff0c;野外數字測圖得到的點數據&#xff08;平面坐標&#xff09;可以直接在CASS中展點&#xff0c;進一步繪制地形圖。那么&#xff0c;帶有坐標的數據能不能在ArcGIS中實現點圖層的生成呢&#xff1f;答案是必須的&#xff01; 本文以氣象臺站Excel…

算法導論--廣度優先搜索和深度優先搜索

廣度優先搜索 在給定圖G(V,E)和一個特定的源頂點s的情況下&#xff0c;廣度優先搜索系統地探索G中的邊&#xff0c;以期“發現”可從s 到達的所有頂點&#xff0c;并計算s 到所有這些可達頂點之間的距離&#xff08;即最少的邊數&#xff09;。該搜索算法同時還能生成一棵根為s…

動手學 docker

背景動手學 docker最近&#xff0c;終于完成了 動手學 docker 系列的編寫。動手學 docker 是 動手學系列 的首個系列。如果反饋的效果不錯&#xff0c;后續還將推出 動手學 devops動手學 kubernetes動手學 istio 等系列。動手學系列 的構思來源于 李沐 老師的 動手學深度學習 。…

Linux零基礎入學之1-1課程介紹了解RHEL7安裝RHEL7

【本節內容】* 課程介紹* RHEL7了解* RHEL7.2的安裝* 實戰&#xff1a;組裝服務器【Linux介紹】服務器種類&#xff1a;刀片式、塔式&#xff08;機架式&#xff09;1U&#xff1a;4.45cm 三指寬 指服務器的高度貝爾實驗室 Unix 肯湯普森 & 丹尼斯里奇二人合作用…

【ArcGIS微課1000例】0003:按屬性選擇(Select by Attributes)

在使用ArcGIS時,可以使用 SQL 表達式基于要素屬性來選擇要素。 通過按屬性選擇 對話框可為 SQL 表達式定義一個或多個由屬性、運算符和計算構成的條件。給定圖層上生成的要素選擇內容滿足這些條件。 文章目錄 按屬性選擇工具1. 工具箱→按屬性選擇圖層2. 菜單欄→按屬性選擇3.…

[轉]Android 常見安全漏洞修復理論與實踐

前言 前段時間公司對應用在愛加密上進行了安全掃描&#xff0c;本文將基于愛加密的漏洞分析報告&#xff0c;針對部分內容&#xff0c;介紹理論修復實踐 最小化特權準則概念介紹 最小化特權準則&#xff0c;即指組件只能供自身應用調用&#xff0c;盡可能禁止其他應用訪問及…

C語言試題158之從鍵盤輸入一些字符,逐個把它們送到磁盤上去,直到輸入一個#為止。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:從鍵盤輸入一些字符,逐個把…