Znajdziecie tutaj sporo postów dotyczących kodowania theme'ów pod wordpressa (hacki, pluginy, template-tags, funkcje), oraz inne przydatne rzeczy, takie jak na przykład skrypty jQuery, czy też snippety CSS2 / CSS3. Z góry przepraszam za ubogie opisy - bloga prowadzę głównie dla siebie, jako swoistą podręczną bazę wiedzy - bym rzeczy raz znalezionej nie musiał szukać ponownie;)
Ostatnio miałem przyjemność zaprojektować menu, które zdecydowałem się troszkę ożywić za sprawą CSS’a. Jako, że wyszło w praniu, że owe menu ma być dwupoziomowe, dodane zostało jQuery za sprawą kolegi z pracy – Tomka. Poniżej prezentuję opis jak zrobić tego typu menu.
Na pierwszy rzut idzie struktura, czyli markup html5. Standardowo – lista:
<nav> <ul id="menu-menu" class="menu"> <li><a href="#" title="#"></a> <ul class="sub-menu"> <li><a href="#" title="#"></a></li> <li><a href="#" title="#"></a></li> <li><a href="#" title="#"></a></li> <li><a href="#" title="#"></a></li> <li><a href="#" title="#"></a></li> </ul> </li> <li><a href="#" title="#"></a></li> <li><a href="#" title="#"></a></li> <li><a href="#" title="#"></a></li> <li><a href="#" title="#"></a></li> <li><a href="#" title="#"></a></li> <li><a href="#" title="#"></a></li> </ul> </nav>
Następnie wypadałoby naszą listę nieco ostylować. Poniżej prezentuję styl, którego użyłem na stronie, pod którą miałem przyjemnośc projektować owe menu:
#left-sidebar nav {
background:#1a6bc6;
width:100%;
}
#left-sidebar nav > ul {
padding:5px;
}
#left-sidebar nav ul li {
display:block;
clear:both;
position:relative;
}
#left-sidebar nav ul li > ul {
display:none;
background:#004a96;
}
#left-sidebar nav ul li > a {
background:url(../img/hover-arrow.png) -10px 15px no-repeat;
border-bottom:1px solid #2679d5;
color:#fff;
display:block;
text-decoration:none;
text-shadow:-1px -1px 0 #0e3766;
padding:11px 0 11px 20px;
}
#left-sidebar nav ul li > a:hover {
background:#2679d5 url(../img/hover-arrow.png) 10px 15px no-repeat;
-moz-transition:all 0.3s ease-out;
-o-transition:all 0.3s ease-out;
-webkit-transition:all 0.3s ease-out;
transition:all 0.3s ease-out;
padding:11px 0 11px 30px;
}
#left-sidebar nav ul li.current-menu-item {
background:#0058b8;
}
#left-sidebar nav ul li > ul li a {
background:url(../img/hover-arrow.png) -10px 15px no-repeat;
padding-left:30px;
border-color:#004389;
}
#left-sidebar nav ul li > ul li a:hover {
background:#044180 url(../img/hover-arrow.png) 20px 15px no-repeat;
-moz-transition:all 0.3s ease-out;
-o-transition:all 0.3s ease-out;
-webkit-transition:all 0.3s ease-out;
transition:all 0.3s ease-out;
padding:11px 0 11px 40px;
}
#left-sidebar nav ul li > ul li.current-menu-item {
background:#044180 20px 15px no-repeat;
}
#left-sidebar nav ul li span {
display:block;
position:absolute;
border-radius:3px;
-moz-border-radius:3px;
-o-border-radius:3px;
right:10px;
top:11px;
width:14px;
height:14px;
cursor:pointer;
background:url(../img/plusiminus.gif) 0 0 no-repeat;
}
#left-sidebar nav ul li span.plus:hover {
background:url(../img/plusiminus.gif) 0 -14px no-repeat;
}
#left-sidebar nav ul li span.minus {
background:url(../img/plusiminus.gif) -14px 0 no-repeat;
}
#left-sidebar nav ul li span.minus:hover {
background:url(../img/plusiminus.gif) -14px -14px no-repeat;
}
Jak widać w powyższym kodzie, zdefiniowane są także klasy:
current – dla aktualnie zaznaczonego elementu – w przypadku WordPressa klasa ta dopisywana jest automatycznie.
plus, minus – jeśli któraś ze stron/kategorii będzie miała dzieci (substrony, lub subkategorie) wyświetlony zostanie ‘+’ w celu rozwinięcia listy, nastepnie po rozwinięciu zamieni się on na ‘-’.
W powyższym kodzie można zauważyć coś nowego, mianowicie:
-moz-transition: all 0.3s ease-out; /*dla firefoxa*/ -o-transition: all 0.3s ease-out; /* dla opery*/ -webkit-transition: all 0.3s ease-out; /*dla safari*/ transition: all 0.3s ease-out; /*dla innych*/
Tak, to ten element, dzięki któremu nasze menu będzie animowane w momencie, gdy najedziemy na dany link! Jako, że nasze menu miało być ponad to rozwijane/zwijane należy dodać do szczęścia troszkę jQuery:
$(document).ready(function(){
$('.menu li').has('ul').find('ul').before('<span class="menu-toggle expand plus"></span>');
$('.menu-toggle').live('click',function(){
$(this).next().stop(true, true).animate({height:'toggle'});
if($(this).hasClass('plus'))
{
$(this).removeClass('plus').addClass('minus');
}
else
{
$(this).addClass('plus').removeClass('minus');
}
});
$('ul.sub-menu a[href="'+window.location+'"]').closest('ul').toggle();
});
Wszystko powinno przyszłowiowo „trybić”. Zobaczcie jak wygląda to menu w akcji (demo).
Efekt jak dla mnie – bardzo fajny :). Jeśli ktoś chciałby zaimplementować powyższy kod pod swojego bloga wystarczy, że odnajdzie plik sidebar.php i doda w nim następujący kod:
<nav> <?php wp_nav_menu(array( 'depth' => 2, 'container' => '', )); ?> </nav>
Oczywiście, w tym przypadku nasz theme musi wspierać dynamiczne menu – w functions.php należy dodać deklarację:
// WordPress custom menu register
function register_menu()
{
register_nav_menus();
}
add_action( 'init', 'register_menu' );
To by było na tyle – może się komuś przyda. Pozdrawiam :)!
W praktyce, jak kliknę w „tworzenie dynamicznego menu” i strona się przeładuje. To submenu też się rozwinie?
Napisał speX dnia 2011/07/04, 22:18.
W praktyce, to menu działa sobie pod wordpressem. Zrobione jest tak, że w momencie, gdy rozwiniemy sobie listę subkategorii i w jakąś wejdziemy wówczas lista zostaje rozwinięta a dana kategoria jest zaznaczona.
Edit: Odnośnie pytania – tutaj wg mnie trzeba pamiętać o pewnej specyfice wordpressowego menu – rzeczy wyświetlane jako dzieci niekoniecznie muszą być powiązane z kategorią główną (rodzicem). Wcześniejsza wersja tego menu (no, podobna – użyta na innej stronie) działała właśnie w taki sposób, że po kliknięciu na rodzica rozwijała się lista z dziećmi. Nie tak efekt jednak chciałem osiągnąć. Wg mnie ma to sens tylko wtedy, gdy rodzic jest kategorią postów, a wszystkie dzieci są podkategoriami – w momencie, gdy zastosujemy „mixa” wszystkich możliwych rzeczy dodanych do menu robi się problem:)
Napisał Free dnia 2011/07/04, 23:31.
Fajna sprawa :) Staram się zrobić coś podobnego, tylko z podziałem na kolumny po rozwinięciu. I tylko nie wiem jeszcze jak ten podział zrobić
Napisał Darek dnia 2012/03/27, 23:41.
Możesz użyć w css display: table-cell dla jakiegoś elementu i wtedy elementy (listy na przykład) będą formatowane tak, jakby były komórkami tabeli ;)
Napisał Free dnia 2012/03/27, 23:46.
rozumiem, że edytowałeś też w wordpress klasę Walker_Nav_Menu?
Napisał Darek dnia 2012/03/28, 10:02.