-
data publikacji: 10.02.2009
Efekt graficznego podświetlenia w jQuery i Prototype z Scriptaculous
kategoria: Skrypty client-side, XHTML/CSS autor: m1chu
Jedni nie korzystają z nich wcale, niektórzy tylko po to aby zwiększyć funkcjonalność tworzonych przez siebie stron, a u jeszcze innych zauważalny jest przepych tego typu rozwiązań. Biblioteki programistyczne języka JavaScript, bo o ich wykorzystaniu tu mowa to źródło bardzo różnorodnych, nie tylko funkcjonalnych, ale także estetycznych efektów. Sieć aż kipi od dobrych i słabych, lepiej oraz słabiej wytłumaczonych przykładów użycia możliwości MooTools, jQuery, Prototype z Scriptaculous, czy innych mniej powszechnych frameworków.
Jednym z takich efektów jest możliwość stworzenia animowanego, graficznego podświetlenia pojawiającego się np. nad grafiką wywołującą animację. Interaktywność taka została opisana na NetTuts z wykorzystaniem MooTools. My osiągniemy taki wynik dzięki zastosowaniu jQuery (w jednym przykładzie) oraz dodatkowo także za pomocą Prototype wraz z Scriptaculous (w drugim przykładzie).
Oczekiwany efekt.Krok 1: Za co się chwycić na początku...
Na początek musisz wiedzieć w jakim celu potrzebny jest Ci prezentowany w tym artykule efekt. Menu? Wyświetlanie dodatkowych informacji w graficznej liście produktów? Czy może szybki, animowany splash? Wybór jest Twój i podług niego będziesz musiał zaopatrzyć się w dodatkowe, niezbędne elementy do wykonania podświetlenia.
Chodzi tu mianowicie o grafiki, których musi być dwa razy więcej niż elementów podatnych na działanie mechanizmu. Powiedzmy, jeżeli chcemy w pięcioelementowym menu zastosować w każdym zdarzenie po najechaniu myszką zgodne z przesłaniem tego artykułu to potrzebujemy dziesięciu grafik. Pięć opisujących przyciski menu i drugie tyle będące "treścią" pojawiającą się po podświetleniu.
Po uporaniu się z wizualną częścią problemu oraz strony internetowej możemy ruszyć krok dalej.
Krok 2: Zaopatrujemy się w jQuery i/lub Prototype i Scriptaculous!
jQuery to aktualnie najpopularniejsza biblioteka. I najłatwiej ją skatalogować w czeluścia własnego projektu. Wystarczy ze strony głównej pobrać wersję 1.3.1 production/Minified i umieścić ją w obrębie plików tworzonego przez nas przykładu (niezbędny będzie tylko plik jquery-1.3.1.min.js).
Z Prototype sprawa jest ciut bardziej skomplikowana, bo prócz standardowego frameworka musimy pobrać także dodatkowy interfejs w postaci Scriptaculous, dzięki któremu uzyskamy dostęp do efektu pozwalającego na dynamiczne zmienianie właściwości CSS elementów strony. Ściągamy więc wersję 1.6.0.3 pierwszej biblioteki, oraz paczkę z wersją 1.8.2 drugiej. Z obydwu wyodrębniamy pliki i w ramach folderu tworzonego przez nas projektu umieszczamy tylko prototype.js oraz effects.js (z drugiego archiwum).
W przypadku tego artykułu umownie pliki związane z frameworkami będą znajdować się w podkatalogu javascript folderu głównego. Obydwa przykłady (dotyczące, jeden jQuery, a drugi Prototype z Scriptaculous) będą oczywiście wykonywane w osobnych plikach znajdujących się w dwóch różnych katalogach.

Przykładowe rozdzielenie implementacji przykładów na dwa katalogi. W naszym przypadku pliki .js znajdują się dodatkowo w podkatalogu javascript.Krok 3: Tworzymy strukturę XHTML
Atutem naszego rozwiązania jest kompatybilność z serwowaniem dokumentu XHTML w postaci
application/xhtml+xml, czego bardzo często brakuje w przypadku efektów opartych na bibliotekach JS. Z racji tego także, że i w przypadku Prototype i jQuery struktura strony pozostaje niezmienna to obojętnie który framework wykorzystujesz poniższe tłumaczenie i partie kodu będą prawidłowe.Z powodu tego w jaki sposób będziemy wysyłać treść strony posłużymy się małą częścią kodu PHP, a co za tym idzie plik korzystający z naszego mechanizmu musi mieć też takie rozszerzenie (no chyba, że serwer jest inaczej skonfigurowany, ale to już problematyka do rozwiązania na inny temat).
<?php
if ( stristr($_SERVER['HTTP_ACCEPT'], 'application/xhtml+xml') ) // jeżeli przeglądarka obsługuje application/xhtml+xml
{
header("Content-Type: application/xhtml+xml; charset=utf-8"); // wysłanie odpowiednich nagłówków
print '<?xml version="1.0" encoding="utf-8"?>'."\r\n";
print '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"'."\r\n";
print '"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">'."\r\n";
}
else // wysłanie dokumentu jako text/html dla przeglądarek nie obsługujących typu zawartości pliku z powyższego warunku, np. dla IE
{
header("Content-Type: text/html; charset=utf-8");
print '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"'."\r\n";
print '"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'."\r\n";
}
?>Poniżej dodajemy uniwersalny układ strony. Ważnym ułatwieniem jest możliwość tworzenia odnośników z elementów graficznych podatnych mechanizmowi, a także fakt, że nie korzystamy w nim z tagów
img, a efektu zbliżonego do sliding-doors w celu wyświetlania obrazów.<html lang="pl" xml:lang="pl" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-type" content="<?php print ( stristr($_SERVER['HTTP_ACCEPT'], 'application/xhtml+xml') ? 'application/xhtml+xml' : 'text/html' ); // typ zawartości zależny do możliwości przeglądarki użytkownika ?>; charset=utf-8" />
<meta name="Description" content="Product highlighter - tworzenie dynamicznych opisów produktów - m1chu.eu" />
<meta name="Keywords" content="product, highlighter" />
<title>Product highlighter</title>
<style type="text/css">@import url('stylesheet.css');</style> <!-- arkusz stylów -->
</head>
<body>
<div id="siteContainer">
<div id="highlightsContainer"> <!-- zbiór grafik wyświetlanych przy najechaniu kursorem -->
<div class="highlights" id="highlight1"></div>
<div class="highlights" id="highlight2"></div>
<div class="highlights" id="highlight3"></div>
</div>
<div id="pageContainer"> <!-- zbiór grafik podatnych na efekt -->
<div class="pages" id="page1"><a href="http://m1chu.eu/"></a></div>
<div class="pages" id="page2"><a href="http://vivee.info/"></a></div>
<div class="pages" id="page3"><a href="http://utnij.eu/"></a></div>
</div>
</div>
</body>
</html>Krok 4: Stylizujemy strukturę strony za pomocą CSS
Posługując się metodami pozycjonowania elementów dostępnymi w kaskadowym arkuszu stylów możemy operując na elementach o identyfikatorach
siteContainer,pageContainer,highlightsContainerorazdivachpotomnych ułożyć i wystylizować wygląd, w tym położenie jak na wyżej zamieszczonym filmiku (screenie) obrazującym wykonanie zadania z tego artykułu.Do wszystkich bloków kodu CSS odwołujących się do tagów zawierających identyfikatory grafik zostały dodane także właściwości
backgroundz adresem pliku tła.W naszym przypadku poniższy kod zapisujemy do pliku stylesheet.css.
/* ustawienia domyślne dla ciała strony (w poprawnie wysyłanym XHTML jest to html+body, a nie tylko body) */
html, body {
margin: 0px;
padding: 0px;
background: #000 url('bg.png') repeat-x;
}#siteContainer {
margin: 150px auto 0px auto; /* marginesy - wyśrodkowanie poziome */
width: 573px;
height: 345px;
position: relative; /* relatywna pozycja, kontener */
background: transparent url('container.png') no-repeat top left;
}
#pageContainer {
position: absolute; /* pozycja względem #siteContainer */
z-index: 5; /* ponad ciałem strony i pod #highlightsContainer */
top: 128px;
left: 0px;
}
#highlightsContainer {
position: absolute; /* pozycja względem #siteContainer */
z-index: 10; /* ponad pozostałymi elementami */
left: 178px;
top: 30px;
}
/* ustawienie w linii wraz z zmianą wyglądu kursora */
#pageContainer > div {
float: left;
cursor: pointer;
}
/* rozmiary klikalnych divów potomnych znajdujących się w kontenerze listy grafik podatnych na działanie mechanizmu */
#pageContainer > div a {
width: 178px;
height: 178px;
display: block;
}
#page1 {
margin-right: 19px; /* prawy margines - odstęp od kolejnego diva */
}
#page1 a {
background: url('icon_1.png') no-repeat; /* tło grafiki podatnej na działanie efektu */
}
#page2 {
margin-right: 20px; /* prawy margines - odstęp od kolejnego diva */
}
#page2 a {
background: url('icon_2.png') no-repeat; /* tło grafiki podatnej na działanie efektu */
}
#page3 a {
background: url('icon_3.png') no-repeat; /* tło grafiki podatnej na działanie efektu */
}/* rozmiary wszystkich potomków typu div kontenera zawierającego podświetlenia */
#highlightsContainer > div {
position: absolute;
width: 222px;
height: 101px;
display: block;
}
/* pliki tła w pojawiających się podświetleniach */
#highlight1 {
background: transparent url('highlights_1.png') no-repeat;
}
#highlight2 {
background: transparent url('highlights_2.png') no-repeat;
}
#highlight3 {
background: transparent url('highlights_3.png') no-repeat;
}Krok 5a: Dodajemy jQuery do dokumentu
Tego, czego zabrakło dotychczasowo w naszym dokumencie to załączenie bibliotek oraz pliku .js w którym będzie znajdować się kod animujący pożądany przez nas efekt.
Dla jQuery w sekcji
headnależy dodać pliki jquery-1.3.1.min.js oraz product-highlighter.js (który umownie będzie zawierał dodatkowy kod).<script type="text/javascript" src="javascript/jquery-1.3.1.min.js"></script>
<script type="text/javascript" src="javascript/product-highlighter.js"></script>Krok 5b: Dodajemy Prototype z Scriptaculous do dokumentu
Tym razem musimy dodać jeden plik więcej. Bibliotekę (prototype.js), jej dodatkowy interfejs, a dokładniej plik zawierający obiekt Effect (effects.js) oraz jak w powyższym przypadku plik z naszym kodem animacji (product-highlighter.js).
<script type="text/javascript" src="javascript/prototype.js"></script>
<script type="text/javascript" src="javascript/effects.js"></script>
<script type="text/javascript" src="javascript/product-highlighter.js"></script>Krok 6a: Implementujemy kod animacji z użyciem jQuery
Jak to bywa w przypadku tego frameworka, aby jakieś zdarzenie działało poprawnie powinno się je umieszczać w funkcji
$(document).ready(), której zawartość zostanie załadowana w momencie załadowania drzewa dokumentu.$(document).ready(function() {
[kod]
});W [kod] musimy przypisać (do tablicy) wg. klasy wszystkie grafiki wyświetlane podczas podświetlenia, ustawić parametry podstawowe CSS oraz stworzyć sprawdzanie w pętli, czy dana grafika o klasie
.pagesnie jest najechana przez kursor i w zależności o danego trybu (kursor na/kursor poza) wykonać pożądaną animacji (wyłonienie dodatkowego tła / zanikanie dodatkowego tła).Poniższy kod umieszczamy w pliku product-highlighter.js.
$(document).ready(function() {
// tablica elementów o klasie .highlights
var highlights = $('.highlights');
// ustawienie pełnej przezroczystości elementów pojawiających się w czasie najechania myszką na obiekty podatne efektowi oraz widzialności ich kontenera
$('.highlights').css('opacity', 0);
$('#highlightsContainer').css('visibility', 'visible');
// sprawdzanie każdego elementu podatnego mechanizmowi
$('.pages').each(function(i) {
// jeżeli na danym elemencie znajduje się kursor
$(this).mouseover(function() {
// wykonanie animacji grafiki wyłanianej i przypisanej do najechanego elementu (margines o 15px w górę i brak przezroczystości w czasie 0,5 sekundy)
$(highlights[i]).animate({
opacity: 1,
marginTop: '-15px'
}, 500);
}).mouseout(function(){ // jeżeli na danym elemencie nie znajduje się już kursor
$(highlights[i]).animate({
opacity: 0,
marginTop: '-0px'
}, 500);
});
});
});Należy jeszcze wyjaśnić dokładniej w jaki sposób działa
$(highlights[i]).animate(). Mianowicie przy każdej iteracji pętli$('.pages').each()przekazuje ona do parametrufunction(i)aktualny numer elementu na którym się znajduje. Ponieważ w idpageContainerznaczniki potomne muszą być posegregowane i musi być ich tyle samo co obiektów graficznych whighlightsContainerto jeżeli kursor znajduje się na pierwszym podatnym na efekt obrazie to w podświetleniu wyłania się także pierwsza grafika. Wszystko to dzięki wyłuskaniu jej z tablicyhighlightspoprzez parametri.Krok 6b: Implementujemy kod animacji z użyciem Prototype z Scriptaculous
Podobnie w Prototype obserwujemy zdarzenie, ale tym razem załadowania całej strony w celu późniejszej obserwacji aktywności kursora na wybranych elementach aktywnych. Można oczywiście podobnie jak w poprzednim podpunkcie wykonać obserwacje zdarzeń wraz z załadowanie DOM (drzewa dokumentu) poprzez użycie
document.observe('dom:loaded', function() {}). To tylko kwestia osobistego wyboru.Event.observe(window, 'load', function() {
[kod]
});Dalsze postępowanie jest adekwatne do tego opisanego w przypadku zastosowania jQuery. Z tymże, tablicę elementów o danej klasie pobiera się poprzez podwójny znak dolara (
$$), a najechanie oraz zjechanie kursorem poza zadany obszar rozpoznaje się także poprzez obiektEventi metodęobserve(). Do animacji służy funkcjaMorphinstancjiEffectz plikueffects.jsinterfejsu Scriptaculous.Event.observe(window, 'load', function() {
var highlights = $$('.highlights'); // utworzenie tablicy
$$('.highlights').invoke('setStyle', { opacity: 0 }); // ustawienie stylu przezroczystości
$$('#highlightsContainer').invoke('setStyle', { visibility: 'visible' }); // widzialność kontenera
$$('.pages').each(function(v, i) { // pętla
Event.observe(v, 'mouseover', function() { // zdarzenie wykonywane w momencie pojawienia się kursora na elemencie
new Effect.Morph(highlights[i], { // animacja
style: 'opacity: 1; margin-top: -15px;',
duration: 0.5 // czas 0,5 sekundy
});
});
Event.observe(v, 'mouseout', function() { // zdarzenie wykonywane w momencie wyjechania kursorem poza element
new Effect.Morph(highlights[i], {
style: 'opacity: 0; margin-top: 0px;',
duration: 0.5
});
});
});
});Tym razem do funkcji w
$$('.pages').each()przekazywane są dwa parametry:vii. Pierwszy z nich jest odpowiednikiemthisi wskazuje na aktualnie przetwarzany element tablicy znaczników o klasie.pages. Drugi to numer pokazujący który z kolei tag jest aktualnie sprawdzany. Inaczej pisząc jego zadanie jest równoznaczne do działania parametruiw przykładzie z jQuery.Demonstracja wyników...
Stworzyłem dwa gotowe przykłady, których analiza pozwoli Wam jeszcze bardziej zrozumieć jak stworzyć ten efekt. Pierwszy, za pomocą jQuery. Drugi, za pomocą Prototype z Scriptaculous.
Jeżeli chcecie dowiedzieć się więcej o tych bibliotekach to zapraszam do ich dokumentacji (Prototype, jQuery).
copyright © 2008-2009, m1chu
udostępnione na licencji CC dla vivee.info i m1chu.eu
-
5 Responses to “Efekt graficznego podświetlenia w jQuery i Prototype z Scriptaculous”
Leave a Reply
Komentarze
Kategorie
Top 10
bal intermobil: Jak stworzyć stronę za pomocą xhtml oraz css
alan27pbll: Query_posts, czyli jak ujarzmić loopa część 1.
alan27pbll: Query_posts, czyli jak ujarzmić loopa część 1.
Michał: Inspirujące strony www: wrzesień 2010
czi: Gravatar, czyli jak mieć globalnego avatara
learn italian online: Query_posts, czyli jak ujarzmić loopa część 1.
hotelpalermo: Jak poprawnie osadzić Flasha w kodzie (X)HTML strony?
Michał: jQuery Cycle
Windscreen: Inspirujące strony www: wrzesień 2010
EMAAR MGF GURGAON: Query_posts, czyli jak ujarzmić loopa część 1.
- CMSy Artykuły dotyczące różnego rodzaju systemów zarządzania treścią CMS.
- Flash Podstawowe informacje pomocne przy tworzeniu animacji w Adobe Flash.
- Fotografia Samouczki dotyczące nie tylko robienia zdjęć ale też ich cyfrowej obróbki.
- Grafika Ogólnie pojęta grafika komputerowa, od inspiracji, po tworzenie layoutów oraz mniejszych form graficznych.
- Inne tutoriale wordpressowe Wszystkie inne zagadnienia dotyczące WordPressa.
- Inspiracje Inspirujące materiały graficzne z dziedziny projektowania stron www, projektów DTP, digital painting, itp.
- Obróbka zdjęć Techniki retuszu fotografii cyfrowych.
- Rysunek Tworzenie rysowanych ilustracji w Adobe Photoshop.
- Skóry do Wordpressa Darmowe oraz płatne – najlepsze skóry do WordPressa.
- Skrypty client-side
- Skrypty server-side
- Tutoriale
- Webdesign Tutoriale z zakresu projektowania stron www i grafiki użytkowej na rzecz internetu.
- Wieczór z Open Source
- Wordpress Ulubieniec naszej publiczności CMS WordPress: nowości, tricki, wtyczki, skóry i wszystko to co może przydać się przy korzystaniu z tego systemu.
- Wtyczki do Wordpressa Recenzje oraz instrukcje najbardziej popularnych i najbardziej niezbędnych pluginów do WordPressa.
- XHTML/CSS Ciekawostki z dziedziny kodowania stron www: XHTML, CSS, jQuery.
- Efekt graficznego podświetlenia w jQuery i Prototype z Scriptaculous
- WP-Polls, czyli ankiety na stronie wordpressowej
- Google Maps API - pierwsze starcie
- Illustrator - podstawy cz.1
- Zrozumieć Fotografię cz.1
- Wordpress Shortcode API
- Jak wyizolować liczbę subskrybentów RSS korzystając z FeedBurner'a?
- Inspirujące strony www - styczeń 2009
- Pierwsza polska strona o ExpressionEngine
Najnowsze newsy
Wieczór z Open Source 2010
Jak co roku WSINF organizuje konferencję Wieczór z Open Source.
Chciałbym zaprosić was na tegoroczna konferencję Wieczór z Open Source 2010! Czytaj dalej
Grafart.org i WACOM zapraszają na konkursy!
Witam!
Myślę, że czas najwyższy nadmienić, że za niedługi czas zostanie zorganizowany pierwszy z trzech konkursów, w których główną nagrodą będą tablety firmy WACOM!
Za miejsca drugie oraz trzecie nagrodami będą kubki i koszulki firmy WACOM oraz magazyny graficzne PSD PHOTOSHOP oraz COMPUTERARTS.
Czytaj dalej
Zapraszamy na forum graficzne Graffika.pl
Każda osoba interesująca się grafiką komputerową ma czasami ochotę porozmawiać o swoich pracach, posłuchać rad, krytyki i pochwał innych osób. Idealnym miejscem na realizowanie takich potrzeb jest forum graficzne Graffika.pl.
Czytaj dalej
Polecane strony
- No bookmarks avaliable.























Świetna rzecz
Ciekawy efekt i dobrze opisany tutorial. Bravo!
Dobrze mi się kojarzy z Net Tuts?
Gdybyś przeczytał artykuł to wiedziałbyś czy tak czy nie… jest to tak wyraźnie zaznaczone.
linki i film nie działają