【javascript】jq之display:none與visible:hidden


  今天學習到jquery的hide()部分時,突然有一個想法,jquery中的隱藏/顯示部分的實現是給目標元素附加一個"display: none"屬性,那么如果在類似於下面的布局中運用,會發生什么情況?


  先把布局的代碼貼上來

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta http-equiv="content-type" content="text/html; charset=utf-8" />   
 5         <script src="jquery.js"></script>
 6         <style type="text/css">
 7             * {
 8                 margin: 0;
 9                 padding: 0;
10             }
11             .box {            
12                 width: 300px;
13                 height: 150px;                
14                 text-Align: center;
15                 border: 2px solid;
16                 margin: 100px auto 0 auto;
17             }
18             .box .content {
19                 width: 100%;
20                 height: 100px;
21                 line-height: 100px;                
22                 background: #666;
23             }    
24             .box .click {
25                 background: #ccc;
26                 width: 300px;    
27                 padding: 15px 0;
28             }
29         </style>
30         <title>jquery</title>
31     </head>    
32     <body>
33         <div class="box">
34             <div class="content">顯示原來的內容</div>
35             <div class="click">
36                 <input id="change" type="button" value="改變文字內容" />
37                 <input id="hide" type="button" value="隱藏/顯示" />
38             </div>
39         </div>
40     </body>
41 </html>

  然后給兩個按鈕綁定上點擊事件,第一個改變文字內容,第二個隱藏/顯示上面的內容部分。

 1 <script type="text/javascript">
 2     $(function(){
 3       $('#change').click(function(){
 4          $('.content').html("顯示改變了的內容!");
 5        });
 6        $('#hide').click(function(){
 7           $('.content').fadeToggle();
 8        });
 9     });
10 </script>

  代碼里的"$(function(){})"部分是"$('document').ready(function(){})"的簡寫,這個稍后再論。

  現在點擊事件綁定上了,分別點擊兩個按鈕。

  點擊改變文字內容按鈕:

  

  看起來沒有問題!

  再點擊顯示/隱藏按鈕:

  

  按鈕條怎么跑上面去了?

  通過瀏覽器調試查看

  

  可以看到jquery是通過給元素附加了"display: none"而達到效果的。

  上網查了一下,"display:none"的作用是吧某個元素隱藏起來,並且不為被隱藏的對象保留其物理空間,即該對象在頁面上徹底消失。這樣就造成了下面的按鈕塊向上浮動了。如何解決這個問題呢?

  我首先想到的是把按鈕塊給固定在box框的底部,這樣不論上面元素塊是否存在,都不會影響到下面的按鈕塊的位置。

  要達到這樣的效果,首先得把按鈕塊從文檔流中彈出,使文檔流中的元素無法影響到這個元素的位置,浮動"float"和絕對定位"absolute"可以達到目的。

  不過當用浮動實現時,發現點擊顯示/隱藏按鈕,由於內容塊忽而顯示忽而消失,導致按鈕塊內的按鈕元素也隨之移動,顯然內容塊是否存在對浮動元素的位置是有影響的,這樣顯然是失敗的。

  當使用絕對定位時,通過計算其坐標,倒是達到了效果,不過如果父元素塊的布局稍微發生改變,按鈕塊絕對定位的位置卻沒有變化(絕對定位基於body),這樣顯然破壞了該結構的布局,這樣的布局是脆弱的,不是我們想要達到的效果。

  顯然通過布局來解決這個問題是不現實的。那就從其他方面入手。

  元素的隱藏有兩個方法:display:none和visible:hidden。

  兩者都可以將元素給隱藏起來,不過有所區別:

  display:none

    不為被隱藏的對象保留其物理空間,即該對象在頁面上徹底消失,通俗來說就是看不見也摸不到。

  visible:hidden

    使對象在網頁上不可見,但該對象在網頁上所占的空間沒有改變,通俗來說就是看不見但摸得到。

  這樣就找到方法了!將隱藏的實現由"display:none"更改為"visible:hidden"就行了。

  於是js代碼更改為:

 1 $(function(){
 2     $("#change").toggle(function(){
 3         $(".content").html("顯示改變的內容");
 4         },function(){
 5         $(".content").html("顯示原來的內容");
 6     });
 7     $("#hide").toggle(function(){
 8             $(".content").css("visibility","hidden");
 9         },function(){
10         $(".content").css("visibility","visible");
11     });
12 });

  完美解決了問題!


  總結:

    就像腦筋急轉彎,有時候換個思路想一想,其實問題很簡單。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM