在做運營活動頁面的時候,有時候一些活動會有很多彈窗,而彈窗要定位在頁面中央的位置,即對div進行水平垂直居中,這個並不難做
運營活動通常要用zepto進行開發,輕便簡潔,方便操作頁面中的DOM,但是當用zepto中的show和hide來切換彈窗的時候便會出現問題
這個問題我已經遇到過好幾次了,之前想不通,後來才發現問題所在:
HTML程式碼如下:
1 <div class="button" id="button1">點選出現彈框1</div> 2 <div class="button" id="button2">點選出現彈框2</div> 3 4 <div class="dialog-wrap"> 5 <!-- 第一個彈窗 --> 6 <div class="dialog" id="dialog1"> 7 <div>this is the first dialog</div> 8 </div> 9 <!-- 第二個彈窗 --> 10 <div class="dialog" id="dialog2"> 11 <div>this is ths second dialog</div> 12 </div> 13 <!-- 半透明蒙層 --> 14 <div class="layer"></div> 15 </div>
css程式碼如下:
1 .dialog-wrap{ 2 width: 100%; 3 height: 100%; 4 display: none; 5 position: absolute; 6 top: 0; 7 left: 0; 8 } 9 .layer{ 10 width: 100%; 11 height: 100%; 12 position: absolute; 13 top: 0; 14 left: 0; 15 background: rgba(0,0,0,.85); 16 z-index: 999; 17 } 18 .dialog{ 19 position: absolute; 20 top: 50%; 21 left: 50%; 22 transform: translate(-50%,-50%); 23 -webkit-transform:translate(-50%,-50%); 24 z-index: 1000; 25 } 26 #dialog1{ 27 width: 500px; 28 height: 200px; 29 border: 1px solid black; 30 background: #fff; 31 border-radius: 10px; 32 text-align: center; 33 line-height: 200px; 34 font-size: 30px; 35 display: none; 36 } 37 #dialog2{ 38 width: 500px; 39 height: 300px; 40 background: #fff; 41 border-radius: 10px; 42 line-height: 300px; 43 text-align: center; 44 font-size: 30px; 45 display: none; 46 }
js程式碼如下所示:
1 $('#button1').on('click',function(){ 2 $('.dialog-wrap').show(); 3 $('#dialog1').css('display','block'); 4 }) 5 $('#button2').on('click',function(){ 6 $('.dialog-wrap').show(); 7 $('#dialog2').show(); 8 }) 9 $('.layer').on('tap',function(){ 10 $('.dialog-wrap').hide(); 11 $('#dialog1').hide(); 12 $('#dialog2').hide(); 13 })
對彈窗1和彈窗2的不同操作,第一個彈窗是 $('#dialog1').css('display','block'); 第二個彈窗是 $('#dialog2').show();
然後來看對應的效果:
第一個彈窗在頁面中央位置,而第二個彈窗卻偏了很多
以前我在寫彈窗的切換時為了方便都是用的show和hide來實現,但是明明定位在中央的彈窗在用了show之後卻偏了,
當時不明白為什麼,只能在對應的彈窗中再加上下面的程式碼:margin-left:-250px;margin-top:-100px;
這樣是有作用的,彈窗顯示在頁面中央,但是如果頁面中有很多個彈窗,而且每個彈窗的大小樣式都不一樣時,這樣就需要為每個彈窗單獨定位,比較麻煩
後來在除錯控制檯的時候,發現用了show的彈窗被自動加上了一些樣式,如下所示:
這才發現,原來元素在用了show之後,會被預設加上如上程式碼,而transform:scale(1,1)使元素顯示的同時剛好覆蓋住了我對彈窗設計的樣式:transform: translate(-50%,-50%);
所以彈窗才會偏,而用了 $('#dialog1').css('display','block'); 就不會被覆蓋。
做了好幾個活動之後終於發現問題所在啦,以後再也不用為每個彈窗單獨定位了,鼓掌!!