2015-11-17 229 views
1

我曾試圖不使用jQuery的UI庫手動重新創建和手風琴風格的菜單。一切工作正常,除非我點擊打開一個盒子,它立即打開,沒有任何過渡。我試圖通過添加一個名爲open的類來隱藏每個框。我在每個動態內部生成數據,因此每次數據都會發生變化,每個數據內部的數據將完全不同。創建手風琴手動

「我不想一種解決方案包含ACCORDION」 [抱歉在帽:-)鍵入]

我有安裝此在的jsfiddle。有人可以看看這個。

https://jsfiddle.net/2nfd9utt/ 

查看示例代碼,請參閱下文。 這是我使用的HTML結構。

<ul class="prfaccordion"> 
    <li> 
     <h3 class="prfaccDetailsHeader"> Committees </h3> 
     <div class="prfaccDetails"> 
     <ul> 
      <li> Sample Data 1 </li> 
      <li> Sample Data 2 </li> 
      <li> Sample Data 3 </li> 
     </ul> 
     </div> 
    </li> 
    <li> 
     <h3 class="prfaccDetailsHeader"> Contributions </h3> 
     <div class="prfaccDetails"> 
     <ul> 
      <li> Sample Data 1 </li> 
      <li> Sample Data 2 </li> 
      <li> Sample Data 3 </li> 
     </ul> 
     </div> 
    </li> 
    <li> 
     <h3 class="prfaccDetailsHeader"> Areas </h3> 
     <div class="prfaccDetails"> 
     <ul> 
      <li> Sample Data 1 </li> 
      <li> Sample Data 2 </li> 
      <li> Sample Data 3 </li> 
     </ul> 
     </div> 
    </li> 
</div> 

這裏的風格,

.prfaccordion{ 
width: 150px; 
} 

.prfgrybox { 
    background: #eeeeee; 
    box-sizing: border-box; 
    -moz-box-sizing: border-box; 
    -webkit-box-sizing: border-box; 
    padding: 10px; 
    margin: 0px 0px 10px 0px; 
    border-radius: 10px; 
    -moz-border-radius: 10px; 
    -webkit-border-radius: 10px; 
    text-align: center; 
} 

ul.prfaccordion li { 
    list-style: none; 
    margin: 0px 0px 2px 0px; 
} 

    ul.prfaccordion li h3 { 
     background: #eeeeee url(images/downarr.png) no-repeat 95% 50%; 
     padding: 6px 10px; 
     box-sizing: border-box; 
     -moz-box-sizing: border-box; 
     -webkit-box-sizing: border-box; 
     border-radius: 6px; 
     -moz-border-radius: 6px; 
     -webkit-border-radius: 6px; 
     margin: 0px; 
     color: #3a4f60; 
     font-size: 15px; 
    } 

     ul.prfaccordion li h3.open { 
      background: #eeeeee url(images/uparr.png) no-repeat 95% 50%; 
      border-radius: 6px 6px 0px 0px; 
      -moz-border-radius: 6px 6px 0px 0px; 
      -webkit-border-radius: 6px 6px 0px 0px; 
     } 

    ul.prfaccordion li .prfaccDetails { 
     background: #fbfbfb; 
     box-sizing: border-box; 
     -moz-box-sizing: border-box; 
     -webkit-box-sizing: border-box; 
      font-size: 13px; 
     border-radius: 0px 0px 6px 6px; 
     -moz-border-radius: 0px 0px 6px 6px; 
     -webkit-border-radius: 0px 0px 6px 6px; 
     color: #5787ad; 
     display: none; 
      transition:all ease .5s; 
      -moz-transition:all ease .5s; 
      -webkit-transition:all ease .5s; 
    } 

     ul.prfaccordion li .prfaccDetails ul li { 
      padding: 5px 0px 5px 14px; 
      position: relative; 
      border-bottom: 1px solid #FFFFFF; 
     } 

      ul.prfaccordion li .prfaccDetails ul li a { 
       font-size: 13px !important; 
       color: #5787ad !important; 
      } 


      ul.prfaccordion li .prfaccDetails ul li:before { 
       position: absolute; 
       top: 9px; 
       left: 0px; 
       width: 8px; 
       height: 8px; 
       border-radius: 100%; 
       -moz-border-radius: 100%; 
       -webkit-border-radius: 100%; 
       content: ""; 
       background: #b1c7cc; 
      } 

     ul.prfaccordion li .prfaccDetails.open { 
      transition:all ease .5s; 
      -moz-transition:all ease .5s; 
      -webkit-transition:all ease .5s; 
      display: block; 
     } 
} 

這裏是腳本,

$(document).ready(function() { 
      $(".prfaccDetailsHeader").click(function (event) { 

       if ($(this).hasClass("open")) { 
        $('.prfaccDetailsHeader').removeClass("open"); 
        $('.prfaccDetails').removeClass("open"); 
        return false; 
       } 

       $('.prfaccDetailsHeader').each(function (i, obj) { 
        $(this).removeClass('open'); 
       }); 

       $('.prfaccDetails').each(function (event) { 
        $(this).removeClass('open'); 
       }); 

       $(this).addClass("open"); 
       $(this).parent().find('.prfaccDetails').addClass("open"); 
      }); 
     }); 

回答

0

你可以使用jquerys toggle方法並傳入參數緩慢。然後

.toggle("slow");

jQuery代碼應該是這樣的:

$(document).ready(function() { 
    $(".prfaccDetailsHeader").click(function (event) { 
     $('.prfaccDetailsHeader').each(function (i, obj) { 
      $(this).removeClass('open'); 
     }); 
     $('.prfaccDetails').each(function (event) { 
      $(this).removeClass('open'); 
     }); 
     $(this).parent().find('.prfaccDetails').toggle("slow"); 
    }); 
}); 

,你可以刪除一些你的CSS的。如轉換等。 Example Fiddle

我包括這個答案,因爲OP沒有明確說他想使用轉換,只是他不想使用jquery-ui

+0

對不起你能解釋一下? – locknies

+0

我以爲OP不想要JQuery – DonO

+0

他不想要jquery-ui,但他清楚地使用jquery – Craicerjack

0

不能display: none;display: block;間動畫。相反,與display: none隱藏你的元素,你可以通過添加max-height: 0pxoverflow:hidden隱藏它。

在款式片段,當元素被打開你,而不是添加例如用於max-height: 1000px;(最大高度應該是你的元素被允許作爲絕對最大高度)

注:我選擇的只是height是因爲CSS過渡不能動畫的高度,如果它是動態的動畫max-height而不是原因(即高度設置爲自動或100%)。這是通過動畫元素的最大高度來解決的。

$(document).ready(function() { 
 
    $(".prfaccDetailsHeader").click(function(event) { 
 

 
    if ($(this).hasClass("open")) { 
 
     $('.prfaccDetailsHeader').removeClass("open"); 
 
     $('.prfaccDetails').removeClass("open"); 
 
     return false; 
 
    } 
 

 
    $('.prfaccDetailsHeader').each(function(i, obj) { 
 
     $(this).removeClass('open'); 
 
    }); 
 

 
    $('.prfaccDetails').each(function(event) { 
 
     $(this).removeClass('open'); 
 
    }); 
 

 
    $(this).addClass("open"); 
 
    $(this).parent().find('.prfaccDetails').addClass("open"); 
 
    }); 
 
});
.prfaccordion { 
 
    width: 150px; 
 
} 
 
.prfgrybox { 
 
    background: #eeeeee; 
 
    box-sizing: border-box; 
 
    -moz-box-sizing: border-box; 
 
    -webkit-box-sizing: border-box; 
 
    padding: 10px; 
 
    margin: 0px 0px 10px 0px; 
 
    border-radius: 10px; 
 
    -moz-border-radius: 10px; 
 
    -webkit-border-radius: 10px; 
 
    text-align: center; 
 
} 
 
ul.prfaccordion li { 
 
    list-style: none; 
 
    margin: 0px 0px 2px 0px; 
 
} 
 
ul.prfaccordion li h3 { 
 
    background: #eeeeee url(images/downarr.png) no-repeat 95% 50%; 
 
    padding: 6px 10px; 
 
    box-sizing: border-box; 
 
    -moz-box-sizing: border-box; 
 
    -webkit-box-sizing: border-box; 
 
    border-radius: 6px; 
 
    -moz-border-radius: 6px; 
 
    -webkit-border-radius: 6px; 
 
    margin: 0px; 
 
    color: #3a4f60; 
 
    font-size: 15px; 
 
} 
 
ul.prfaccordion li h3.open { 
 
    background: #eeeeee url(images/uparr.png) no-repeat 95% 50%; 
 
    border-radius: 6px 6px 0px 0px; 
 
    -moz-border-radius: 6px 6px 0px 0px; 
 
    -webkit-border-radius: 6px 6px 0px 0px; 
 
} 
 
ul.prfaccordion li .prfaccDetails { 
 
    background: #fbfbfb; 
 
    box-sizing: border-box; 
 
    -moz-box-sizing: border-box; 
 
    -webkit-box-sizing: border-box; 
 
    font-size: 13px; 
 
    border-radius: 0px 0px 6px 6px; 
 
    -moz-border-radius: 0px 0px 6px 6px; 
 
    -webkit-border-radius: 0px 0px 6px 6px; 
 
    color: #5787ad; 
 
    max-height: 0px; 
 
    overflow: hidden; 
 
    transition: all ease .5s; 
 
    -moz-transition: all ease .5s; 
 
    -webkit-transition: all ease .5s; 
 
} 
 
ul.prfaccordion li .prfaccDetails ul li { 
 
    padding: 5px 0px 5px 14px; 
 
    position: relative; 
 
    border-bottom: 1px solid #FFFFFF; 
 
} 
 
ul.prfaccordion li .prfaccDetails ul li a { 
 
    font-size: 13px !important; 
 
    color: #5787ad !important; 
 
} 
 
ul.prfaccordion li .prfaccDetails ul li:before { 
 
    position: absolute; 
 
    top: 9px; 
 
    left: 0px; 
 
    width: 8px; 
 
    height: 8px; 
 
    border-radius: 100%; 
 
    -moz-border-radius: 100%; 
 
    -webkit-border-radius: 100%; 
 
    content: ""; 
 
    background: #b1c7cc; 
 
} 
 
ul.prfaccordion li .prfaccDetails.open { 
 
    max-height: 100px; 
 
    transition: all ease .5s; 
 
    -moz-transition: all ease .5s; 
 
    -webkit-transition: all ease .5s; 
 
    display: block; 
 
} 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<ul class="prfaccordion"> 
 
    <li> 
 
    <h3 class="prfaccDetailsHeader"> Committees </h3> 
 
    <div class="prfaccDetails"> 
 
     <ul> 
 
     <li>Sample Data 1</li> 
 
     <li>Sample Data 2</li> 
 
     <li>Sample Data 3</li> 
 
     </ul> 
 
    </div> 
 
    </li> 
 
    <li> 
 
    <h3 class="prfaccDetailsHeader"> Contributions </h3> 
 
    <div class="prfaccDetails"> 
 
     <ul> 
 
     <li>Sample Data 1</li> 
 
     <li>Sample Data 2</li> 
 
     <li>Sample Data 3</li> 
 
     </ul> 
 
    </div> 
 
    </li> 
 
    <li> 
 
    <h3 class="prfaccDetailsHeader"> Areas </h3> 
 
    <div class="prfaccDetails"> 
 
     <ul> 
 
     <li>Sample Data 1</li> 
 
     <li>Sample Data 2</li> 
 
     <li>Sample Data 3</li> 
 
     </ul> 
 
    </div> 
 
    </li> 
 
    </div>

0

我的答案是類似Natalie的。但是,我無法讓Natalie使用「運行代碼片段」工作,所以我創建了一個jsfiddle。你希望手風琴能夠滑動,所以你需要設置高度而不是顯示模塊而沒有。

.prfaccordion{ 
width: 150px; 
} 

.prfgrybox { 
    background: #eeeeee; 
    box-sizing: border-box; 
    -moz-box-sizing: border-box; 
    -webkit-box-sizing: border-box; 
    padding: 10px; 
    margin: 0px 0px 10px 0px; 
    border-radius: 10px; 
    -moz-border-radius: 10px; 
    -webkit-border-radius: 10px; 
    text-align: center; 
} 

ul.prfaccordion li { 
    list-style: none; 
    margin: 0px 0px 2px 0px; 
} 

    ul.prfaccordion li h3 { 
     background: #eeeeee url(images/downarr.png) no-repeat 95% 50%; 
     padding: 6px 10px; 
     box-sizing: border-box; 
     -moz-box-sizing: border-box; 
     -webkit-box-sizing: border-box; 
     border-radius: 6px; 
     -moz-border-radius: 6px; 
     -webkit-border-radius: 6px; 
     margin: 0px; 
     color: #3a4f60; 
     font-size: 15px; 
    } 

     ul.prfaccordion li h3.open { 
      background: #eeeeee url(images/uparr.png) no-repeat 95% 50%; 
      border-radius: 6px 6px 0px 0px; 
      -moz-border-radius: 6px 6px 0px 0px; 
      -webkit-border-radius: 6px 6px 0px 0px; 
     } 

    ul.prfaccordion li .prfaccDetails { 
     background: #fbfbfb; 
     box-sizing: border-box; 
     -moz-box-sizing: border-box; 
     -webkit-box-sizing: border-box; 
      font-size: 13px; 
     border-radius: 0px 0px 6px 6px; 
     -moz-border-radius: 0px 0px 6px 6px; 
     -webkit-border-radius: 0px 0px 6px 6px; 
     color: #5787ad; 
     max-height:0; 
     overflow:hidden; 
      transition:all .5s ease; 
      -moz-transition:all .5s ease; 
      -webkit-transition:all .5s ease; 
    } 

     ul.prfaccordion li .prfaccDetails ul li { 
      padding: 5px 0px 5px 14px; 
      position: relative; 
      border-bottom: 1px solid #FFFFFF; 
     } 

      ul.prfaccordion li .prfaccDetails ul li a { 
       font-size: 13px !important; 
       color: #5787ad !important; 
      } 


      ul.prfaccordion li .prfaccDetails ul li:before { 
       position: absolute; 
       top: 9px; 
       left: 0px; 
       width: 8px; 
       height: 8px; 
       border-radius: 100%; 
       -moz-border-radius: 100%; 
       -webkit-border-radius: 100%; 
       content: ""; 
       background: #b1c7cc; 
      } 

     ul.prfaccordion li .prfaccDetails.open { 
      transition:all .5s ease; 
      -moz-transition:all .5s ease; 
      -webkit-transition:all .5s ease; 
      max-height:100px; 
     } 
} 

(我有這個寫之前,我注意到了娜塔莉的答案,所以我想我會發布它anwyway)

+0

這工程!但我在我的問題中提到,每個框中生成的數據都是動態的,並且會發生變化! – locknies

+0

@KRIZTE可以將最大高度從100px增加到1000px;不過,我確實注意到動畫效果不佳。 –

0

你可以參考這個簡單的代碼,使您的工作。

$('.prfaccordion').find('h3').on('click',function(){  \t 
 
     var _target = $(this).parent().find('> div'); 
 
     if($(_target).is(':visible')){ 
 
      $(_target).slideUp(500); 
 
     } 
 
     else { 
 
      $(_target).slideDown(500); 
 
     } 
 
    });
.prfaccordion { 
 
    display: inline-block; 
 
    width: 40%; 
 
    list-style: none; 
 
} 
 
.prfaccordion li { 
 
    float: left; 
 
    width: 100%; 
 
} 
 
.prfaccordion li > h3 { 
 
    background: #eee; 
 
    display: inline-block; 
 
    width: 100%; 
 
    margin: 5px 0; 
 
    padding: 5px; 
 
} 
 
.prfaccordion li > div { 
 
    display: none; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<ul class="prfaccordion"> 
 
    <li> 
 
     <h3> Committees </h3> 
 
     <div> 
 
     <ul> 
 
      <li> Sample Data 1 </li> 
 
      <li> Sample Data 2 </li> 
 
      <li> Sample Data 3 </li> 
 
     </ul> 
 
     </div> 
 
    </li> 
 
    <li> 
 
     <h3> Committees 123 </h3> 
 
     <div> 
 
     <ul> 
 
      <li> Sample Data 1 </li> 
 
      <li> Sample Data 2 </li> 
 
      <li> Sample Data 3 </li> 
 
     </ul> 
 
     </div> 
 
    </li> 
 
</ul>