<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>TheGeek.de &#187; scriptaculous</title>
	<atom:link href="http://thegeek.de/t/scriptaculous/feed" rel="self" type="application/rss+xml" />
	<link>http://thegeek.de</link>
	<description>WordPress, PHP, JavaScript, Web 2.0, Gaming, Motorräder, Fotografie, Piratenpartei, Privates</description>
	<lastBuildDate>Tue, 07 Feb 2012 13:21:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Parallax Scrolling Effekt mit Prototype/Scriptaculous JavaScript</title>
		<link>http://thegeek.de/parallax-scrolling-effekt-mit-prototypescriptaculous-javascript</link>
		<comments>http://thegeek.de/parallax-scrolling-effekt-mit-prototypescriptaculous-javascript#comments</comments>
		<pubDate>Wed, 11 Nov 2009 10:09:57 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[eyecandy]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[parallax]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[scriptaculous]]></category>
		<category><![CDATA[scrolling]]></category>

		<guid isPermaLink="false">http://thegeek.de/?p=325</guid>
		<description><![CDATA[Wer sich an Spiele wie &#8220;Shadow of the Beast&#8221; erinnert, der muss sich auch zwangsweise an diesen netten Pseudo-3D Effekt erinnern, mit dem diese Spiele ihren coolen Look erhielten. Parallax Scrolling nennt man diese Technik übrigens, bei der verschiedene Layer aus Grafiken übereinander gelegt und unterschiedlich schnell horizontal oder auch vertikal bewegt werden. Weil mir [...]]]></description>
			<content:encoded><![CDATA[<p>Wer sich an Spiele wie &#8220;Shadow of the Beast&#8221; erinnert, der muss sich auch zwangsweise an diesen netten Pseudo-3D Effekt erinnern, mit dem diese Spiele ihren coolen Look erhielten. Parallax Scrolling nennt man diese Technik übrigens, bei der verschiedene Layer aus Grafiken übereinander gelegt und unterschiedlich schnell horizontal oder auch vertikal bewegt werden.</p>
<p>Weil mir gestern Abend langweilig war, habe ich mich damit beschäftigt den Parallax Effekt versuchsweise in JavaScript umzusetzen. Als Bibliotheken verwende ich dabei PrototypeJS und Scriptaculous. Nachdem ich mit einem Grafikprogramm meine 3 Layer gezeichnet und PNGs mit Transparenz exportiert hatte, ging es an die Umsetzung. Schnell wurde mir klar, wie simpel es im Grunde ist mit ein wenig CSS und JavaScript diesen Effekt zu erzeugen.<span id="more-325"></span></p>
<p>Das HTML Grundgerüst besteht lediglich aus 3 DIV Layern:</p>
<pre class="brush:html">
&lt;div id=&quot;layer_bg&quot;&gt;
	&lt;div id=&quot;layer2&quot;&gt;
		&lt;div id=&quot;layer1&quot;&gt;
		&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
</pre>
<p>Auf diese DIVs werden ein paar einfache CSS Regeln angewendet, um die Hintergrundgrafiken zu setzen. Zudem wird noch die Breite und Höhe definiert und der &#8220;overflow&#8221; auf &#8220;hidden&#8221; gesetzt. So wird es möglich per CSS Anweisung &#8220;background-position&#8221; den Hintergrund, also unseren Parallax-Layer, zu verschieben und einen Scroll-Effekt zu realisieren.</p>
<pre class="brush:css">
#layer_bg {
	border:10px solid #FFF;
	width:1150px;
	height:400px;
	margin:auto auto;
	background-image:url( 'layer_bg.png' );
	background-repeat:repeat-x;
	background-position:0px 0px;
	overflow:hidden;
}
#layer1 {
	background-image:url( 'layer1.png' );
	background-repeat:repeat-x;
	background-position:0px 0px;
	width:1150px;
	height:400px;
	overflow:hidden;
}
#layer2 {
	background-image:url( 'layer2.png' );
	background-repeat:repeat-x;
	background-position:0px 0px;
	width:1150px;
	height:400px;
	overflow:hidden;
}
</pre>
<p>Die Bewegung der Hintergrundgrafiken übernimmt eine kleine JavaScript-Funktion, an welche die Art der Bewegung übergeben wird.</p>
<pre class="brush:js">
var position_index1 = 0;
var position_index2 = 0;
var position_index3 = 0;
var effect_running = false;
function run_effect( $move_type )
{
	if( !effect_running )
	{
		effect_running = true;
		if( $move_type == 'move_left' )
		{
			position_index3 += 200;
			position_index2 += 200;
			position_index1 += 200;
		}
		if( $move_type == 'move_right' )
		{
			position_index1 -= 200;
			position_index2 -= 200;
			position_index3 -= 200;
		}
		if( $move_type == 'rotate_left' )
		{
			position_index3 += 200;
			position_index2 += 50;
			position_index1 -= 200;
		}
		if( $move_type == 'rotate_right' )
		{
			position_index3 -= 200;
			position_index2 -= 50;
			position_index1 += 200;
		}
		new Effect.Morph( 'layer_bg', { style:'background-position:' + (position_index3 * 1) + 'px 0px;' } );
		new Effect.Morph( 'layer2', { style:'background-position:' + (position_index2 * 2) + 'px 0px;' } );
		new Effect.Morph( 'layer1', { style:'background-position:' + (position_index1 * 3) + 'px 0px;', afterFinish:function() { effect_running = false; } } );
	}
}
</pre>
<p>Bei Eintritt in die Funktion wir zuerst geprüft, ob eine Bewegung nicht bereits läuft, falls das nicht der Fall ist, werden für die unterschiedlichen Bewegungs-Arten die neuen Werte für die Hintergrund-Position des Hintergrundbildes berechnet und anschließend mit dem Effekt &#8220;Morph&#8221; gesetzt. Je näher der Layer an der &#8220;Kamera&#8221; ist, um so mehr (schneller) wird er bewegt, wodurch dem Betrachter eine dritte Dimension vorgegaukelt wird.</p>
<p>Wer das <strong><a href="http://www.codemonster.de/parallax/">vollendete Versuchsobjekt betrachten</a></strong> möchte, der kann das nun gerne tun und noch einen Blick in den Quellcode der Seite werfen. Ich habe den Code noch um einige Kleinigkeiten erweitert, z.B. um die Steuerung per Pfeiltasten.</p>
<p>Natürlich ist das mal wieder sinnloses eyecandy, denkbar wäre aber, ein schickes Menü damit zu realisieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://thegeek.de/parallax-scrolling-effekt-mit-prototypescriptaculous-javascript/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress dazu bringen Seiten per AJAX zu laden</title>
		<link>http://thegeek.de/wordpress-dazu-bringen-seiten-per-ajax-zu-laden</link>
		<comments>http://thegeek.de/wordpress-dazu-bringen-seiten-per-ajax-zu-laden#comments</comments>
		<pubDate>Fri, 23 Oct 2009 13:37:48 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[eyecandy]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[scriptaculous]]></category>

		<guid isPermaLink="false">http://thegeek.de/?p=186</guid>
		<description><![CDATA[Wer im Browser sein Javascript aktiviert hat, der wird sicherlich sehen, dass beim Klicken eines Links der Content hier dynamisch geladen wird. Um das in meinem WordPress Theme zu realisieren, habe ich zwei einfache JavaScript Funktionen geschrieben. Als JS Bibliotheken nutze ich dafür Prototype und Scriptaculous, es ginge aber auch sicherlich mit JQuery. Vorteil der [...]]]></description>
			<content:encoded><![CDATA[<p>Wer im Browser sein Javascript aktiviert hat, der wird sicherlich sehen, dass beim Klicken eines Links der Content hier dynamisch geladen wird. Um das in meinem WordPress Theme zu realisieren, habe ich zwei einfache JavaScript Funktionen geschrieben. Als JS Bibliotheken nutze ich dafür Prototype und Scriptaculous, es ginge aber auch sicherlich mit JQuery.</p>
<p>Vorteil der Lösung: Wenn ein Fehler auftritt, oder im Browser kein JavaScript aktiviert ist, dann funktioniert die Seite ganz normal, was nebenbei auch sehr Suchmaschinen freundlich ist.</p>
<p>Die erste Funktion &#8220;fixLinks&#8221; die ich nutze, hat den Zweck an alle Links, die nicht bestimmten Kriterien entsprechen &#8211; z.B. Links auf Bilder, externe Links oder aber Links in WordPress Backend &#8211; eine &#8220;onclick&#8221; Aktion anzufügen. Die neue &#8220;onclick&#8221; Aktion des Links ruft dann die zweite Funktion &#8220;get_page&#8221; auf, welche die Seite läd und mit einem netten Effekt dann anzeigt.</p>
<pre class="brush:js">function fixLinks()
{
	var myLinks = document.links;
	var myBrowserType = (window.attachEvent ? 1 : (window.addEventListener ? 2 : 0));
	var myDomain = 'thegeek.de';
	for( var i = 0; i < myLinks.length; i++ )
	{
		// Get the href
		myHref = myLinks[i].href.toString();
		// Get the onclick action
		myOnClick = myLinks[i].onclick ? myLinks[i].onclick : '';
		// Only attack onclick action, if not jscript links, images, wp-admin features and internal link
		if( 	myOnClick == ''
			&amp;&amp; myHref.indexOf( "#" ) != (myHref.length - 1)
			&amp;&amp; myHref.indexOf( "javascript:" ) == -1
			&amp;&amp; myHref.indexOf( "wp-admin" ) == -1
			&amp;&amp; myHref.indexOf( "#respond" ) == -1
			&amp;&amp; myHref.indexOf( "/trackback" ) == -1
			&amp;&amp; myHref.indexOf( "/feed" ) == -1
			&amp;&amp; myHref.indexOf( "/wp-login" ) == -1
			&amp;&amp; myHref.indexOf( ".jpg" ) == -1
			&amp;&amp; myHref.indexOf( ".gif" ) == -1
			&amp;&amp; myHref.indexOf( ".png" ) == -1
			&amp;&amp; myHref.indexOf( myDomain) != -1
		)
		{
			switch( myBrowserType )
			{
				case 1:
					Event.observe( myLinks[i], 'click', function( e ) { if( !get_page( this.href ) ) e.stop(); } );
					break;
				case 2:
					myLinks[i].setAttribute( "onclick", "return get_page( this.href );" );
					break;
				default:
					// Do nothing
			}
		}
	}
}
// body onload="fixLinks()" und die Sache läuft. :-)
</pre>
<p>Die zweite Funktion bewegt zuerst den Inhalt an die beim Init ermittelt Position außerhalb des Bildschirms und läd dann per asynchronem HTTP Request die neue Seite. Der Inhalt der Seite ist im Theme mit einem HTML Kommentar gekennzeichnet und wird mittels Regular Expression ermittelt, dann in den Layer eingefügt, um die Seite danach wieder an die ursprüngliche Position zu bewegen. Keine Ahnung, ob's im IE klappt, ist mir allerdings auch ziemlich egal. :-)</p>
<p>Sollte etwas schief gehen, dann gibt die Funktion "true" zurück, womit der Klick auf den Link ganz normal ausgewertet wird. Hat alles geklappt, liefert die Funktion "false" zurück und der Browser folgt dem angeklicktem Link dann nicht. So ist auf jeden Fall gewährleistet, dass die neue Seite angezeigt wird - auf die synchrone oder asynchrone Art.</p>
<pre class="brush:js">	var	c_w = $('content').getWidth();
	var	c_x = $('content').viewportOffset()[0];
	var	c_leave = (c_x + c_w) * -1;
	var	c_come = c_leave * -1;
	var	c_search = /(<!-- CONTENT -->)((?:.|[\r\n])*?)(<!-- \/CONTENT -->)/mgi;
	var	get_page_return_code = false;
	var	effect_running = false;
	function get_page( uri )
	{
		get_page_return_code = false;
		if( effect_running == false )
		{
			effect_running = true;
			new Effect.Move( 'content', { x: c_leave, y: 0, mode: 'relative', duration:0.5,
				afterFinish:function() {
					new Ajax.Request(	uri, {
									method:'get',
									onSuccess: function( r ) {
											$('content').update( '' );
											SearchResult = c_search.exec( r.responseText );
											while( SearchResult != null )
											{
												if( SearchResult[ 2 ] )
													$('content').update( SearchResult[ 2 ] );
												SearchResult = c_search.exec( r.responseText );
											}
											new Effect.Move( 'content', { x: c_come, y: 0, mode: 'relative', duration:0.5, afterFinish:function () {effect_running = false;} } );
											fixLinks();
									},
									onFailure: function( r ) {
										get_page_return_code = true;
										effect_running = false;
									}
					});
				}
			});
		}
		return get_page_return_code;
	}
</pre>
<p>Klar handelt es sich hier um ziemliches sinnfreies Eyecandy. Ich mag Eyecandy.</p>
]]></content:encoded>
			<wfw:commentRss>http://thegeek.de/wordpress-dazu-bringen-seiten-per-ajax-zu-laden/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

