Potrei essere un idiota, ma come fai a mantenere aperte più sezioni nella fisarmonica dell'interfaccia utente di jQuery? Le demo hanno tutte solo una aperta alla volta ... Sto cercando un sistema di tipi di menu comprimibile.
Potrei essere un idiota, ma come fai a mantenere aperte più sezioni nella fisarmonica dell'interfaccia utente di jQuery? Le demo hanno tutte solo una aperta alla volta ... Sto cercando un sistema di tipi di menu comprimibile.
Risposte:
Questo è stato originariamente discusso nella documentazione dell'interfaccia utente jQuery per Accordion :
NOTA: se desideri aprire più sezioni contemporaneamente, non utilizzare una fisarmonica
Una fisarmonica non consente di aprire più di un pannello di contenuti contemporaneamente e richiede molto impegno per farlo. Se stai cercando un widget che consenta di aprire più di un pannello dei contenuti, non utilizzarlo. Di solito può essere scritto con poche righe di jQuery, qualcosa del genere:
jQuery(document).ready(function(){ $('.accordion .head').click(function() { $(this).next().toggle(); return false; }).next().hide(); });
O animato:
jQuery(document).ready(function(){ $('.accordion .head').click(function() { $(this).next().toggle('slow'); return false; }).next().hide(); });
"Potrei essere un idiota" - Non sei un idiota se non leggi la documentazione, ma se hai problemi, di solito velocizza la ricerca di una soluzione.
Abbastanza semplice:
<script type="text/javascript">
(function($) {
$(function() {
$("#accordion > div").accordion({ header: "h3", collapsible: true });
})
})(jQuery);
</script>
<div id="accordion">
<div>
<h3><a href="#">First</a></h3>
<div>Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.</div>
</div>
<div>
<h3><a href="#">Second</a></h3>
<div>Phasellus mattis tincidunt nibh.</div>
</div>
<div>
<h3><a href="#">Third</a></h3>
<div>Nam dui erat, auctor a, dignissim quis.</div>
</div>
</div>
create: function(event) { $(event.target).accordion( "activate", false ); }
per iniziare crollato.
create: function(event) { $(event.target).accordion( "activate", false ); }
impostare l'opzione:{active: false}
Inserito questo in un thread simile, ma ho pensato che potrebbe essere rilevante anche qui.
Raggiungere questo obiettivo con una singola istanza di jQuery-UI Accordion
Come altri hanno notato, il Accordion
widget non ha un'opzione API per farlo direttamente. Tuttavia, se per qualche motivo devi utilizzare il widget (ad es. Stai mantenendo un sistema esistente), è possibile ottenere ciò utilizzando ilbeforeActivate
opzione del gestore di eventi per sovvertire ed emulare il comportamento predefinito del widget.
Per esempio:
$('#accordion').accordion({
collapsible:true,
beforeActivate: function(event, ui) {
// The accordion believes a panel is being opened
if (ui.newHeader[0]) {
var currHeader = ui.newHeader;
var currContent = currHeader.next('.ui-accordion-content');
// The accordion believes a panel is being closed
} else {
var currHeader = ui.oldHeader;
var currContent = currHeader.next('.ui-accordion-content');
}
// Since we've changed the default behavior, this detects the actual status
var isPanelSelected = currHeader.attr('aria-selected') == 'true';
// Toggle the panel's header
currHeader.toggleClass('ui-corner-all',isPanelSelected).toggleClass('accordion-header-active ui-state-active ui-corner-top',!isPanelSelected).attr('aria-selected',((!isPanelSelected).toString()));
// Toggle the panel's icon
currHeader.children('.ui-icon').toggleClass('ui-icon-triangle-1-e',isPanelSelected).toggleClass('ui-icon-triangle-1-s',!isPanelSelected);
// Toggle the panel's content
currContent.toggleClass('accordion-content-active',!isPanelSelected)
if (isPanelSelected) { currContent.slideUp(); } else { currContent.slideDown(); }
return false; // Cancels the default action
}
});
ui-accordion-header-active
O anche più semplice?
<div class="accordion">
<h3><a href="#">First</a></h3>
<div>Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.</div>
</div>
<div class="accordion">
<h3><a href="#">Second</a></h3>
<div>Phasellus mattis tincidunt nibh.</div>
</div>
<div class="accordion">
<h3><a href="#">Third</a></h3>
<div>Nam dui erat, auctor a, dignissim quis.</div>
</div>
<script type="text/javascript">
$(".accordion").accordion({ collapsible: true, active: false });
</script>
Ho creato un plugin jQuery che ha lo stesso aspetto di jQuery UI Accordion e posso tenere aperte tutte le schede \ sezioni
Potete trovare qui
http://anasnakawa.wordpress.com/2011/01/25/jquery-ui-multi-open-accordion/
funziona con lo stesso markup
<div id="multiOpenAccordion">
<h3><a href="#">tab 1</a></h3>
<div>Lorem ipsum dolor sit amet</div>
<h3><a href="#">tab 2</a></h3>
<div>Lorem ipsum dolor sit amet</div>
</div>
Codice Javascript
$(function(){
$('#multiOpenAccordion').multiAccordion();
// you can use a number or an array with active option to specify which tabs to be opened by default:
$('#multiOpenAccordion').multiAccordion({ active: 1 });
// OR
$('#multiOpenAccordion').multiAccordion({ active: [1, 2, 3] });
$('#multiOpenAccordion').multiAccordion({ active: false }); // no opened tabs
});
AGGIORNAMENTO: il plugin è stato aggiornato per supportare l'opzione predefinita delle schede attive
AGGIORNAMENTO: questo plugin è ora deprecato.
In realtà stava cercando su Internet una soluzione a questo per un po '. E la risposta accettata dà la buona risposta "da manuale". Ma non volevo accettarlo, quindi ho continuato a cercare e ho trovato questo:
http://jsbin.com/eqape/1601/edit - Esempio dal vivo
Questo esempio inserisce gli stili corretti e aggiunge la funzionalità richiesta allo stesso tempo, completa di spazio per scrivere, aggiungi la tua funzionalità ad ogni clic sull'intestazione. Consente inoltre di inserire più div tra gli "h3".
$("#notaccordion").addClass("ui-accordion ui-accordion-icons ui-widget ui-helper-reset")
.find("h3")
.addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-top ui-corner-bottom")
.hover(function() { $(this).toggleClass("ui-state-hover"); })
.prepend('<span class="ui-icon ui-icon-triangle-1-e"></span>')
.click(function() {
$(this).find("> .ui-icon").toggleClass("ui-icon-triangle-1-e ui-icon-triangle-1-s").end()
.next().toggleClass("ui-accordion-content-active").slideToggle();
return false;
})
.next()
.addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom")
.hide();
Codice HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Toggle Panels (not accordion) using ui-accordion styles</title>
<!-- jQuery UI | http://jquery.com/ http://jqueryui.com/ http://jqueryui.com/docs/Theming -->
<style type="text/css">body{font:62.5% Verdana,Arial,sans-serif}</style>
<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/themes/base/jquery-ui.css" rel="stylesheet" type="text/css" />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/jquery-ui.min.js"></script>
</head>
<body>
<h1>Toggle Panels</h1>
<div id="notaccordion">
<h3><a href="#">Section 1</a></h3>
<div class="content">
Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer
ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit
amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut
odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.
</div>
<h3><a href="#">Section 2</a></h3>
<div>
Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet
purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor
velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In
suscipit faucibus urna.
</div>
<h3><a href="#">Section 3</a></h3>
<div class="top">
Top top top top
</div>
<div class="content">
Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis.
Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero
ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis
lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui.
<ul>
<li>List item one</li>
<li>List item two</li>
<li>List item three</li>
</ul>
</div>
<div class="bottom">
Bottom bottom bottom bottom
</div>
<h3><a href="#">Section 4</a></h3>
<div>
Cras dictum. Pellentesque habitant morbi tristique senectus et netus
et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in
faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia
mauris vel est.
Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus.
Class aptent taciti sociosqu ad litora torquent per conubia nostra, per
inceptos himenaeos.
</div>
</div>
</body>
</html>`
Ho trovato una soluzione complicata. Chiamiamo due volte la stessa funzione ma con un id diverso.
Codice JQuery
$(function() {
$( "#accordion1" ).accordion({
collapsible: true, active: false, heightStyle: "content"
});
$( "#accordion2" ).accordion({
collapsible: true, active: false, heightStyle: "content"
});
});
Codice HTML
<div id="accordion1">
<h3>Section 1</h3>
<div>Section one Text</div>
</div>
<div id="accordion2">
<h3>Section 2</h3>
<div>Section two Text</div>
</div>
class
come suggerito da altri, questo significa che non ti ripeti ( DRY )
Semplice, crea più div accordian ciascuno che rappresenta un tag di ancoraggio come:
<div>
<div class="accordion">
<a href = "#">First heading</a>
</div>
<div class="accordion">
<a href = "#">First heading</a>
</div>
</div>
Aggiunge un po 'di markup. Ma funziona come un professionista ...
Semplice: attiva la fisarmonica in una classe, quindi crea div con questo, come istanze multiple di fisarmonica.
Come questo:
JS
$(function() {
$( ".accordion" ).accordion({
collapsible: true,
clearStyle: true,
active: false,
})
});
HTML
<div class="accordion">
<h3>Title</h3>
<p>lorem</p>
</div>
<div class="accordion">
<h3>Title</h3>
<p>lorem</p>
</div>
<div class="accordion">
<h3>Title</h3>
<p>lorem</p>
</div>
Basta chiamare ogni sezione della fisarmonica come la propria fisarmonica. attivo: n sarà 0 per il primo (quindi verrà visualizzato) e 1, 2, 3, 4, ecc per il resto. Poiché ognuno è la sua fisarmonica, avranno tutti solo 1 sezione e il resto verrà compresso per iniziare.
$('.accordian').each(function(n, el) {
$(el).accordion({
heightStyle: 'content',
collapsible: true,
active: n
});
});
Senza jQuery-UI fisarmonica, si può semplicemente fare questo:
<div class="section">
<div class="section-title">
Section 1
</div>
<div class="section-content">
Section 1 Content: Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.
</div>
</div>
<div class="section">
<div class="section-title">
Section 2
</div>
<div class="section-content">
Section 2 Content: Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.
</div>
</div>
E js
$( ".section-title" ).click(function() {
$(this).parent().find( ".section-content" ).slideToggle();
});
apri jquery-ui - *. js
trova $.widget( "ui.accordion", {
trova _eventHandler: function( event ) {
dentro
modificare
var options = this.options, active = this.active, clicked = $( event.currentTarget ), clickedIsActive = clicked[ 0 ] === active[ 0 ], collapsing = clickedIsActive && options.collapsible, toShow = collapsing ? $() : clicked.next(), toHide = active.next(), eventData = {
oldHeader: active,
oldPanel: toHide,
newHeader: collapsing ? $() : clicked,
newPanel: toShow };
per
var options = this.options,
clicked = $( event.currentTarget),
clickedIsActive = clicked.next().attr('aria-expanded') == 'true',
collapsing = clickedIsActive && options.collapsible;
if (clickedIsActive == true) {
var toShow = $();
var toHide = clicked.next();
} else {
var toShow = clicked.next();
var toHide = $();
}
eventData = {
oldHeader: $(),
oldPanel: toHide,
newHeader: clicked,
newPanel: toShow
};
prima active.removeClass( "ui-accordion-header-active ui-state-active" );
Inserisci if (typeof(active) !== 'undefined') {
e chiudi}
godere
Devi solo usare la funzione jquery each ();
$(function() {
$( ".selector_class_name" ).each(function(){
$( this ).accordion({
collapsible: true,
active:false,
heightStyle: "content"
});
});
});