2014-01-24 19 views
2

我只想將HTML5 詳細信息的內容標記爲'滑動'/ animate打開,而不是立即彈出打開/出現。這可能與jQuery/JavaScript?使用jQuery/JS打開時,使<details>標記具有動畫效果

Fiddle

HTML:

<details> 
<summary>Show/Hide</summary> 
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum laoreet metus auctor tempor dignissim. Nunc tempor ligula malesuada, adipiscing justo quis, ultrices libero. Curabitur pretium odio sagittis lorem euismod, a ultrices sem ultrices. Integer sapien nibh, mollis id pretium id, dignissim ut dui. Nam sit amet lectus lectus. Cras scelerisque risus a dui accumsan, in dignissim dolor sodales. Nunc aliquam pharetra dui, a consectetur velit lobortis vel.</p> 
<p>Mauris convallis orci in semper aliquam. Ut mollis laoreet nibh pretium tincidunt. Donec aliquam at odio sit amet dictum. Phasellus sapien leo, feugiat sit amet sagittis in, congue vel lectus. Donec elementum est vitae nulla interdum laoreet. Curabitur fringilla a tellus non laoreet. Aliquam vel lectus convallis massa pulvinar pellentesque. Mauris laoreet pharetra turpis vel tristique. Sed ligula ligula, sodales sed auctor in, aliquam sit amet lorem. Etiam vestibulum, libero vel dignissim ultrices, lacus mauris lacinia enim, quis aliquam nibh mauris eu mauris. Etiam sapien leo, dapibus et libero sed, laoreet ornare tellus.</p> 
<p>Sed placerat vehicula magna et adipiscing. Nam euismod nibh ut tellus tempor, eget lobortis metus iaculis. In laoreet, enim in dignissim pellentesque, felis augue tincidunt massa, vestibulum fringilla mauris sapien in diam. Duis interdum molestie fermentum. Aenean dictum varius augue, id luctus neque viverra id. Nam eleifend tempus mauris in mattis. Sed id risus non magna semper blandit in vel arcu. Suspendisse quis nisi ligula. Fusce vestibulum at enim eu.</p> 
</details> 
+0

關於open屬性,使用css轉換和over-ride/spec height。你可以在裏面設置一個子容器的動畫,以方便xbrowser compat。 – dandavis

回答

4

太糟糕了一個簡單的CSS過渡,不能使用。

因此,我會建議先包裝summary元素的同級元素,然後在其上使用.slideToggle()。這並不是那麼簡單,但您需要將open屬性添加到details,並在默認情況下隱藏內部包裹的元素。

這隻適用於使用e.preventDefault()來防止默認功能;但是,您需要重寫箭頭指示符()。

你會使用summary::-webkit-details-markerdisplay:none移除不再是工作的標記,並通過:before/:after僞元素添加自己的自定義標記。

UPDATED EXAMPLE HERE

$('details summary').each(function(){ 
    $(this).nextAll().wrapAll('<div id="wrap"></div>'); 
}); 
$('details').attr('open','').find('#wrap').css('display','none'); 
$('details summary').click(function(e) { 
    e.preventDefault(); 
    $(this).siblings('div#wrap').slideToggle(function(){ 
     $(this).parent('details').toggleClass('open'); 
    }); 
}); 

CSS:

summary::-webkit-details-marker { 
    display: none; 
} 
summary:before { 
    content: "►"; 
} 
details.open summary:before { 
    content: "▼"; 
} 

如果你想details元素是默認打開的,加class="open"而不是屬性open,然後使用此:$('details.open div#wrap').css('display','block');

ALTERNATIVE EXAMPLE - (默認情況下打開)

+0

嘿喬希,謝謝你的回覆。我好奇,左側的'切換'似乎停止工作(至少對我來說,在Chrome中)。此外,當您添加更多下拉菜單時,它似乎不起作用。見http://jsfiddle.net/fakeguybrushthreepwood/gY398/2/ – fakeguybrushthreepwood

+0

@fakeguybrushthreepwood好點 - 我修好了所有的;看到更新。值得注意的是,它現在適用於所有主流瀏覽器。這是一個簡單的動畫很多工作,希望它會對未來的人有用,我有一種感覺,這將是一個受歡迎的問題,搜索引擎:) –

+0

我真的很努力將其添加到實際的網站I正在建設中(我很想鏈接,但因爲它是一個客戶站點,不知道他們是否會因爲讓他們的網站在這裏而興奮不已),正如你可能會說的 - 一直在研究這個很長的時間,或許我是錯過了一些東西 - 所以我繼續沿着jQuery和CSS的另一條路徑。 – fakeguybrushthreepwood

0

基於@JoshCrozier's answer,我制定了使用open屬性而不是額外open類的解決方案。這樣你不必改變CSS。

如果你想用css來改變<details>元素的外觀,您可以使用相同的樣式規則不管瀏覽器是否支持<details>元素,也不管的JavaScript是否在瀏覽器中啓用,因爲你只需要考慮open屬性,並且不需要特殊的類。

另外,在包裝元素上沒有特別的id,這使得解決方案稍微更健壯一些。

此外,此解決方案需要<details>默認情況下應打開的元素。

$('details summary').each(function() { 
    var $Wrapper = $(this).nextAll().wrapAll('<div></div>').parent(); 
    // Hide elements that are not open by default 
    if(!$(this).parent('details').attr('open')) 
     $Wrapper.hide(); 
    $(this).click(function(Event) { 
     Event.preventDefault(); 
     if($(this).parent('details').attr('open')) { 
     $Wrapper.slideUp(function() { 
      // Remove the open attribute after sliding so, so the animation is visible in browsers supporting the <details> element 
      $(this).parent('details').removeAttr('open'); 
     }); 
     } else { 
     // Add the open attribute before sliding down, so the animation is visible in browsers supporting the <details> element 
     $(this).parent('details').attr('open', true); 
     $Wrapper.slideDown(); 
     } 
    }); 
});