PSD-Tutorials.de
Forum für Design, Fotografie & Bildbearbeitung
Tutkit
Agentur
Hilfe
Kontakt
Start
Forum
Aktuelles
Besonderer Inhalt
Foren durchsuchen
Tutorials
News
Anmelden
Kostenlos registrieren
Aktuelles
Suche
Suche
Nur Titel durchsuchen
Von:
Menü
Anmelden
Kostenlos registrieren
App installieren
Installieren
JavaScript ist deaktiviert. Für eine bessere Darstellung aktiviere bitte JavaScript in deinem Browser, bevor du fortfährst.
Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder einen
alternativen Browser
verwenden.
Antworten auf deine Fragen:
Neues Thema erstellen
Start
Forum
Sonstiges
Webdesign, Webentwicklung & Programmierung
PHP, Javascript, jQuery, Ajax, nodeJS, MySQL...
Spry Menü - Effekte verändern oder hinzufügen
Beitrag
<blockquote data-quote="Jimbim" data-source="post: 1350250" data-attributes="member: 241774"><p>Hi!</p><p></p><p>Im Dreamweaver hab ich mir ein Spry-Menü erstellt. Jetzt würde ich gerne die Effekte abändern. Ich geh mal davon aus, dass dafür js-Kenntnisse benötige, die bei mir nicht vorhanden sind.</p><p></p><p>Für eure Hilfe wäre ich sehr dankbar.</p><p></p><p>Hier der JavaScript-Code:</p><p></p><p>[CODE]</p><p></p><p>var Spry; if (!Spry) Spry = {}; if (!Spry.Widget) Spry.Widget = {};</p><p></p><p>Spry.BrowserSniff = function()</p><p>{</p><p> var b = navigator.appName.toString();</p><p> var up = navigator.platform.toString();</p><p> var ua = navigator.userAgent.toString();</p><p></p><p> this.mozilla = this.ie = this.opera = this.safari = false;</p><p> var re_opera = /Opera.([0-9\.]*)/i;</p><p> var re_msie = /MSIE.([0-9\.]*)/i;</p><p> var re_gecko = /gecko/i;</p><p> var re_safari = /(applewebkit|safari)\/([\d\.]*)/i;</p><p> var r = false;</p><p></p><p> if ( (r = ua.match(re_opera))) {</p><p> this.opera = true;</p><p> this.version = parseFloat(r[1]);</p><p> } else if ( (r = ua.match(re_msie))) {</p><p> this.ie = true;</p><p> this.version = parseFloat(r[1]);</p><p> } else if ( (r = ua.match(re_safari))) {</p><p> this.safari = true;</p><p> this.version = parseFloat(r[2]);</p><p> } else if (ua.match(re_gecko)) {</p><p> var re_gecko_version = /rv:\s*([0-9\.]+)/i;</p><p> r = ua.match(re_gecko_version);</p><p> this.mozilla = true;</p><p> this.version = parseFloat(r[1]);</p><p> }</p><p> this.windows = this.mac = this.linux = false;</p><p></p><p> this.Platform = ua.match(/windows/i) ? "windows" :</p><p> (ua.match(/linux/i) ? "linux" :</p><p> (ua.match(/mac/i) ? "mac" :</p><p> ua.match(/unix/i)? "unix" : "unknown"));</p><p> this[this.Platform] = true;</p><p> this.v = this.version;</p><p></p><p> if (this.safari && this.mac && this.mozilla) {</p><p> this.mozilla = false;</p><p> }</p><p>};</p><p></p><p>Spry.is = new Spry.BrowserSniff();</p><p></p><p>// Constructor for Menu Bar</p><p>// element should be an ID of an unordered list (<ul> tag)</p><p>// preloadImage1 and preloadImage2 are images for the rollover state of a menu</p><p>Spry.Widget.MenuBar = function(element, opts)</p><p>{</p><p> this.init(element, opts);</p><p>};</p><p></p><p>Spry.Widget.MenuBar.prototype.init = function(element, opts)</p><p>{</p><p> this.element = this.getElement(element);</p><p></p><p> // represents the current (sub)menu we are operating on</p><p> this.currMenu = null;</p><p> this.showDelay = 250;</p><p> this.hideDelay = 600;</p><p> if(typeof document.getElementById == 'undefined' || (navigator.vendor == 'Apple Computer, Inc.' && typeof window.XMLHttpRequest == 'undefined') || (Spry.is.ie && typeof document.uniqueID == 'undefined'))</p><p> {</p><p> // bail on older unsupported browsers</p><p> return;</p><p> }</p><p></p><p> // Fix IE6 CSS images flicker</p><p> if (Spry.is.ie && Spry.is.version < 7){</p><p> try {</p><p> document.execCommand("BackgroundImageCache", false, true);</p><p> } catch(err) {}</p><p> }</p><p></p><p> this.upKeyCode = Spry.Widget.MenuBar.KEY_UP;</p><p> this.downKeyCode = Spry.Widget.MenuBar.KEY_DOWN;</p><p> this.leftKeyCode = Spry.Widget.MenuBar.KEY_LEFT;</p><p> this.rightKeyCode = Spry.Widget.MenuBar.KEY_RIGHT;</p><p> this.escKeyCode = Spry.Widget.MenuBar.KEY_ESC;</p><p></p><p> this.hoverClass = 'MenuBarItemHover';</p><p> this.subHoverClass = 'MenuBarItemSubmenuHover';</p><p> this.subVisibleClass ='MenuBarSubmenuVisible';</p><p> this.hasSubClass = 'MenuBarItemSubmenu';</p><p> this.activeClass = 'MenuBarActive';</p><p> this.isieClass = 'MenuBarItemIE';</p><p> this.verticalClass = 'MenuBarVertical';</p><p> this.horizontalClass = 'MenuBarHorizontal';</p><p> this.enableKeyboardNavigation = true;</p><p></p><p> this.hasFocus = false;</p><p> // load hover images now</p><p> if(opts)</p><p> {</p><p> for(var k in opts)</p><p> {</p><p> if (typeof this[k] == 'undefined')</p><p> {</p><p> var rollover = new Image;</p><p> rollover.src = opts[k];</p><p> }</p><p> }</p><p> Spry.Widget.MenuBar.setOptions(this, opts);</p><p> }</p><p></p><p> // safari doesn't support tabindex</p><p> if (Spry.is.safari)</p><p> this.enableKeyboardNavigation = false;</p><p></p><p> if(this.element)</p><p> {</p><p> this.currMenu = this.element;</p><p> var items = this.element.getElementsByTagName('li');</p><p> for(var i=0; i<items.length; i++)</p><p> {</p><p> if (i > 0 && this.enableKeyboardNavigation)</p><p> items[i].getElementsByTagName('a')[0].tabIndex='-1';</p><p></p><p> this.initialize(items[i], element);</p><p> if(Spry.is.ie)</p><p> {</p><p> this.addClassName(items[i], this.isieClass);</p><p> items[i].style.position = "static";</p><p> }</p><p> }</p><p> if (this.enableKeyboardNavigation)</p><p> {</p><p> var self = this;</p><p> this.addEventListener(document, 'keydown', function(e){self.keyDown(e); }, false);</p><p> }</p><p></p><p> if(Spry.is.ie)</p><p> {</p><p> if(this.hasClassName(this.element, this.verticalClass))</p><p> {</p><p> this.element.style.position = "relative";</p><p> }</p><p> var linkitems = this.element.getElementsByTagName('a');</p><p> for(var i=0; i<linkitems.length; i++)</p><p> {</p><p> linkitems[i].style.position = "relative";</p><p> }</p><p> }</p><p> }</p><p>};</p><p>Spry.Widget.MenuBar.KEY_ESC = 27;</p><p>Spry.Widget.MenuBar.KEY_UP = 38;</p><p>Spry.Widget.MenuBar.KEY_DOWN = 40;</p><p>Spry.Widget.MenuBar.KEY_LEFT = 37;</p><p>Spry.Widget.MenuBar.KEY_RIGHT = 39;</p><p></p><p>Spry.Widget.MenuBar.prototype.getElement = function(ele)</p><p>{</p><p> if (ele && typeof ele == "string")</p><p> return document.getElementById(ele);</p><p> return ele;</p><p>};</p><p></p><p>Spry.Widget.MenuBar.prototype.hasClassName = function(ele, className)</p><p>{</p><p> if (!ele || !className || !ele.className || ele.className.search(new RegExp("\\b" + className + "\\b")) == -1)</p><p> {</p><p> return false;</p><p> }</p><p> return true;</p><p>};</p><p></p><p>Spry.Widget.MenuBar.prototype.addClassName = function(ele, className)</p><p>{</p><p> if (!ele || !className || this.hasClassName(ele, className))</p><p> return;</p><p> ele.className += (ele.className ? " " : "") + className;</p><p>};</p><p></p><p>Spry.Widget.MenuBar.prototype.removeClassName = function(ele, className)</p><p>{</p><p> if (!ele || !className || !this.hasClassName(ele, className))</p><p> return;</p><p> ele.className = ele.className.replace(new RegExp("\\s*\\b" + className + "\\b", "g"), "");</p><p>};</p><p></p><p>// addEventListener for Menu Bar</p><p>// attach an event to a tag without creating obtrusive HTML code</p><p>Spry.Widget.MenuBar.prototype.addEventListener = function(element, eventType, handler, capture)</p><p>{</p><p> try</p><p> {</p><p> if (element.addEventListener)</p><p> {</p><p> element.addEventListener(eventType, handler, capture);</p><p> }</p><p> else if (element.attachEvent)</p><p> {</p><p> element.attachEvent('on' + eventType, handler);</p><p> }</p><p> }</p><p> catch (e) {}</p><p>};</p><p></p><p>// createIframeLayer for Menu Bar</p><p>// creates an IFRAME underneath a menu so that it will show above form controls and ActiveX</p><p>Spry.Widget.MenuBar.prototype.createIframeLayer = function(menu)</p><p>{</p><p> var layer = document.createElement('iframe');</p><p> layer.tabIndex = '-1';</p><p> layer.src = 'javascript:""';</p><p> layer.frameBorder = '0';</p><p> layer.scrolling = 'no';</p><p> menu.parentNode.appendChild(layer);</p><p> </p><p> layer.style.left = menu.offsetLeft + 'px';</p><p> layer.style.top = menu.offsetTop + 'px';</p><p> layer.style.width = menu.offsetWidth + 'px';</p><p> layer.style.height = menu.offsetHeight + 'px';</p><p>};</p><p></p><p>// removeIframeLayer for Menu Bar</p><p>// removes an IFRAME underneath a menu to reveal any form controls and ActiveX</p><p>Spry.Widget.MenuBar.prototype.removeIframeLayer = function(menu)</p><p>{</p><p> var layers = ((menu == this.element) ? menu : menu.parentNode).getElementsByTagName('iframe');</p><p> while(layers.length > 0)</p><p> {</p><p> layers[0].parentNode.removeChild(layers[0]);</p><p> }</p><p>};</p><p></p><p>// clearMenus for Menu Bar</p><p>// root is the top level unordered list (<ul> tag)</p><p>Spry.Widget.MenuBar.prototype.clearMenus = function(root)</p><p>{</p><p> var menus = root.getElementsByTagName('ul');</p><p> for(var i=0; i<menus.length; i++)</p><p> this.hideSubmenu(menus[i]);</p><p></p><p> this.removeClassName(this.element, this.activeClass);</p><p>};</p><p></p><p>// bubbledTextEvent for Menu Bar</p><p>// identify bubbled up text events in Safari so we can ignore them</p><p>Spry.Widget.MenuBar.prototype.bubbledTextEvent = function()</p><p>{</p><p> return Spry.is.safari && (event.target == event.relatedTarget.parentNode || (event.eventPhase == 3 && event.target.parentNode == event.relatedTarget));</p><p>};</p><p></p><p>// showSubmenu for Menu Bar</p><p>// set the proper CSS class on this menu to show it</p><p>Spry.Widget.MenuBar.prototype.showSubmenu = function(menu)</p><p>{</p><p> if(this.currMenu)</p><p> {</p><p> this.clearMenus(this.currMenu);</p><p> this.currMenu = null;</p><p> }</p><p> </p><p> if(menu)</p><p> {</p><p> this.addClassName(menu, this.subVisibleClass);</p><p> if(typeof document.all != 'undefined' && !Spry.is.opera && navigator.vendor != 'KDE')</p><p> {</p><p> if(!this.hasClassName(this.element, this.horizontalClass) || menu.parentNode.parentNode != this.element)</p><p> {</p><p> menu.style.top = menu.parentNode.offsetTop + 'px';</p><p> }</p><p> }</p><p> if(Spry.is.ie && Spry.is.version < 7)</p><p> {</p><p> this.createIframeLayer(menu);</p><p> }</p><p> }</p><p> this.addClassName(this.element, this.activeClass);</p><p>};</p><p></p><p>// hideSubmenu for Menu Bar</p><p>// remove the proper CSS class on this menu to hide it</p><p>Spry.Widget.MenuBar.prototype.hideSubmenu = function(menu)</p><p>{</p><p> if(menu)</p><p> {</p><p> this.removeClassName(menu, this.subVisibleClass);</p><p> if(typeof document.all != 'undefined' && !Spry.is.opera && navigator.vendor != 'KDE')</p><p> {</p><p> menu.style.top = '';</p><p> menu.style.left = '';</p><p> }</p><p> if(Spry.is.ie && Spry.is.version < 7)</p><p> this.removeIframeLayer(menu);</p><p> }</p><p>};</p><p></p><p>// initialize for Menu Bar</p><p>// create event listeners for the Menu Bar widget so we can properly</p><p>// show and hide submenus</p><p>Spry.Widget.MenuBar.prototype.initialize = function(listitem, element)</p><p>{</p><p> var opentime, closetime;</p><p> var link = listitem.getElementsByTagName('a')[0];</p><p> var submenus = listitem.getElementsByTagName('ul');</p><p> var menu = (submenus.length > 0 ? submenus[0] : null);</p><p></p><p> if(menu)</p><p> this.addClassName(link, this.hasSubClass);</p><p></p><p> if(!Spry.is.ie)</p><p> {</p><p> // define a simple function that comes standard in IE to determine</p><p> // if a node is within another node</p><p> listitem.contains = function(testNode)</p><p> {</p><p> // this refers to the list item</p><p> if(testNode == null)</p><p> return false;</p><p></p><p> if(testNode == this)</p><p> return true;</p><p> else</p><p> return this.contains(testNode.parentNode);</p><p> };</p><p> }</p><p></p><p> // need to save this for scope further down</p><p> var self = this;</p><p> this.addEventListener(listitem, 'mouseover', function(e){self.mouseOver(listitem, e);}, false);</p><p> this.addEventListener(listitem, 'mouseout', function(e){if (self.enableKeyboardNavigation) self.clearSelection(); self.mouseOut(listitem, e);}, false);</p><p></p><p> if (this.enableKeyboardNavigation)</p><p> {</p><p> this.addEventListener(link, 'blur', function(e){self.onBlur(listitem);}, false);</p><p> this.addEventListener(link, 'focus', function(e){self.keyFocus(listitem, e);}, false);</p><p> }</p><p>};</p><p>Spry.Widget.MenuBar.prototype.keyFocus = function (listitem, e)</p><p>{</p><p> this.lastOpen = listitem.getElementsByTagName('a')[0];</p><p> this.addClassName(this.lastOpen, listitem.getElementsByTagName('ul').length > 0 ? this.subHoverClass : this.hoverClass);</p><p> this.hasFocus = true;</p><p>};</p><p>Spry.Widget.MenuBar.prototype.onBlur = function (listitem)</p><p>{</p><p> this.clearSelection(listitem);</p><p>};</p><p>Spry.Widget.MenuBar.prototype.clearSelection = function(el){</p><p> //search any intersection with the current open element</p><p> if (!this.lastOpen)</p><p> return;</p><p></p><p> if (el)</p><p> {</p><p> el = el.getElementsByTagName('a')[0];</p><p> </p><p> // check children</p><p> var item = this.lastOpen;</p><p> while (item != this.element)</p><p> {</p><p> var tmp = el;</p><p> while (tmp != this.element)</p><p> {</p><p> if (tmp == item)</p><p> return;</p><p> try{</p><p> tmp = tmp.parentNode;</p><p> }catch(err){break;}</p><p> }</p><p> item = item.parentNode;</p><p> }</p><p> }</p><p> var item = this.lastOpen;</p><p> while (item != this.element)</p><p> {</p><p> this.hideSubmenu(item.parentNode);</p><p> var link = item.getElementsByTagName('a')[0];</p><p> this.removeClassName(link, this.hoverClass);</p><p> this.removeClassName(link, this.subHoverClass);</p><p> item = item.parentNode;</p><p> }</p><p> this.lastOpen = false;</p><p>};</p><p>Spry.Widget.MenuBar.prototype.keyDown = function (e)</p><p>{</p><p> if (!this.hasFocus)</p><p> return;</p><p></p><p> if (!this.lastOpen)</p><p> {</p><p> this.hasFocus = false;</p><p> return;</p><p> }</p><p></p><p> var e = e|| event;</p><p> var listitem = this.lastOpen.parentNode;</p><p> var link = this.lastOpen;</p><p> var submenus = listitem.getElementsByTagName('ul');</p><p> var menu = (submenus.length > 0 ? submenus[0] : null);</p><p> var hasSubMenu = (menu) ? true : false;</p><p></p><p> var opts = [listitem, menu, null, this.getSibling(listitem, 'previousSibling'), this.getSibling(listitem, 'nextSibling')];</p><p> </p><p> if (!opts[3])</p><p> opts[2] = (listitem.parentNode.parentNode.nodeName.toLowerCase() == 'li')?listitem.parentNode.parentNode:null;</p><p></p><p> var found = 0;</p><p> switch (e.keyCode){</p><p> case this.upKeyCode:</p><p> found = this.getElementForKey(opts, 'y', 1);</p><p> break;</p><p> case this.downKeyCode:</p><p> found = this.getElementForKey(opts, 'y', -1);</p><p> break;</p><p> case this.leftKeyCode:</p><p> found = this.getElementForKey(opts, 'x', 1);</p><p> break;</p><p> case this.rightKeyCode:</p><p> found = this.getElementForKey(opts, 'x', -1);</p><p> break;</p><p> case this.escKeyCode:</p><p> case 9:</p><p> this.clearSelection();</p><p> this.hasFocus = false;</p><p> default: return;</p><p> }</p><p> switch (found)</p><p> {</p><p> case 0: return;</p><p> case 1:</p><p> //subopts</p><p> this.mouseOver(listitem, e);</p><p> break;</p><p> case 2:</p><p> //parent</p><p> this.mouseOut(opts[2], e);</p><p> break;</p><p> case 3:</p><p> case 4:</p><p> // left - right</p><p> this.removeClassName(link, hasSubMenu ? this.subHoverClass : this.hoverClass);</p><p> break;</p><p> }</p><p> var link = opts[found].getElementsByTagName('a')[0];</p><p> if (opts[found].nodeName.toLowerCase() == 'ul')</p><p> opts[found] = opts[found].getElementsByTagName('li')[0];</p><p></p><p> this.addClassName(link, opts[found].getElementsByTagName('ul').length > 0 ? this.subHoverClass : this.hoverClass);</p><p> this.lastOpen = link;</p><p> opts[found].getElementsByTagName('a')[0].focus();</p><p> </p><p> //stop further event handling by the browser</p><p> return Spry.Widget.MenuBar.stopPropagation(e);</p><p>};</p><p>Spry.Widget.MenuBar.prototype.mouseOver = function (listitem, e)</p><p>{</p><p> var link = listitem.getElementsByTagName('a')[0];</p><p> var submenus = listitem.getElementsByTagName('ul');</p><p> var menu = (submenus.length > 0 ? submenus[0] : null);</p><p> var hasSubMenu = (menu) ? true : false;</p><p> if (this.enableKeyboardNavigation)</p><p> this.clearSelection(listitem);</p><p></p><p> if(this.bubbledTextEvent())</p><p> {</p><p> // ignore bubbled text events</p><p> return;</p><p> }</p><p></p><p> if (listitem.closetime)</p><p> clearTimeout(listitem.closetime);</p><p></p><p> if(this.currMenu == listitem)</p><p> {</p><p> this.currMenu = null;</p><p> }</p><p></p><p> // move the focus too</p><p> if (this.hasFocus)</p><p> link.focus();</p><p></p><p> // show menu highlighting</p><p> this.addClassName(link, hasSubMenu ? this.subHoverClass : this.hoverClass);</p><p> this.lastOpen = link;</p><p> if(menu && !this.hasClassName(menu, this.subHoverClass))</p><p> {</p><p> var self = this;</p><p> listitem.opentime = window.setTimeout(function(){self.showSubmenu(menu);}, this.showDelay);</p><p> }</p><p>};</p><p>Spry.Widget.MenuBar.prototype.mouseOut = function (listitem, e)</p><p>{</p><p> var link = listitem.getElementsByTagName('a')[0];</p><p> var submenus = listitem.getElementsByTagName('ul');</p><p> var menu = (submenus.length > 0 ? submenus[0] : null);</p><p> var hasSubMenu = (menu) ? true : false;</p><p> if(this.bubbledTextEvent())</p><p> {</p><p> // ignore bubbled text events</p><p> return;</p><p> }</p><p></p><p> var related = (typeof e.relatedTarget != 'undefined' ? e.relatedTarget : e.toElement);</p><p> if(!listitem.contains(related))</p><p> {</p><p> if (listitem.opentime) </p><p> clearTimeout(listitem.opentime);</p><p> this.currMenu = listitem;</p><p></p><p> // remove menu highlighting</p><p> this.removeClassName(link, hasSubMenu ? this.subHoverClass : this.hoverClass);</p><p> if(menu)</p><p> {</p><p> var self = this;</p><p> listitem.closetime = window.setTimeout(function(){self.hideSubmenu(menu);}, this.hideDelay);</p><p> }</p><p> if (this.hasFocus)</p><p> link.blur();</p><p> }</p><p>};</p><p>Spry.Widget.MenuBar.prototype.getSibling = function(element, sibling)</p><p>{</p><p> var child = element[sibling];</p><p> while (child && child.nodeName.toLowerCase() !='li')</p><p> child = child[sibling];</p><p></p><p> return child;</p><p>};</p><p>Spry.Widget.MenuBar.prototype.getElementForKey = function(els, prop, dir)</p><p>{</p><p> var found = 0;</p><p> var rect = Spry.Widget.MenuBar.getPosition;</p><p> var ref = rect(els[found]);</p><p></p><p> var hideSubmenu = false;</p><p> //make the subelement visible to compute the position</p><p> if (els[1] && !this.hasClassName(els[1], this.MenuBarSubmenuVisible))</p><p> {</p><p> els[1].style.visibility = 'hidden';</p><p> this.showSubmenu(els[1]);</p><p> hideSubmenu = true;</p><p> }</p><p></p><p> var isVert = this.hasClassName(this.element, this.verticalClass);</p><p> var hasParent = els[0].parentNode.parentNode.nodeName.toLowerCase() == 'li' ? true : false;</p><p> </p><p> for (var i = 1; i < els.length; i++){</p><p> //when navigating on the y axis in vertical menus, ignore children and parents</p><p> if(prop=='y' && isVert && (i==1 || i==2))</p><p> {</p><p> continue;</p><p> }</p><p> //when navigationg on the x axis in the FIRST LEVEL of horizontal menus, ignore children and parents</p><p> if(prop=='x' && !isVert && !hasParent && (i==1 || i==2))</p><p> {</p><p> continue;</p><p> }</p><p> </p><p> if (els[i])</p><p> {</p><p> var tmp = rect(els[i]); </p><p> if ( (dir * tmp[prop]) < (dir * ref[prop]))</p><p> {</p><p> ref = tmp;</p><p> found = i;</p><p> }</p><p> }</p><p> }</p><p> </p><p> // hide back the submenu</p><p> if (els[1] && hideSubmenu){</p><p> this.hideSubmenu(els[1]);</p><p> els[1].style.visibility = '';</p><p> }</p><p></p><p> return found;</p><p>};</p><p>Spry.Widget.MenuBar.camelize = function(str)</p><p>{</p><p> if (str.indexOf('-') == -1){</p><p> return str; </p><p> }</p><p> var oStringList = str.split('-');</p><p> var isFirstEntry = true;</p><p> var camelizedString = '';</p><p></p><p> for(var i=0; i < oStringList.length; i++)</p><p> {</p><p> if(oStringList[i].length>0)</p><p> {</p><p> if(isFirstEntry)</p><p> {</p><p> camelizedString = oStringList[i];</p><p> isFirstEntry = false;</p><p> }</p><p> else</p><p> {</p><p> var s = oStringList[i];</p><p> camelizedString += s.charAt(0).toUpperCase() + s.substring(1);</p><p> }</p><p> }</p><p> }</p><p></p><p> return camelizedString;</p><p>};</p><p></p><p>Spry.Widget.MenuBar.getStyleProp = function(element, prop)</p><p>{</p><p> var value;</p><p> try</p><p> {</p><p> if (element.style)</p><p> value = element.style[Spry.Widget.MenuBar.camelize(prop)];</p><p></p><p> if (!value)</p><p> if (document.defaultView && document.defaultView.getComputedStyle)</p><p> {</p><p> var css = document.defaultView.getComputedStyle(element, null);</p><p> value = css ? css.getPropertyValue(prop) : null;</p><p> }</p><p> else if (element.currentStyle) </p><p> {</p><p> value = element.currentStyle[Spry.Widget.MenuBar.camelize(prop)];</p><p> }</p><p> }</p><p> catch (e) {}</p><p></p><p> return value == 'auto' ? null : value;</p><p>};</p><p>Spry.Widget.MenuBar.getIntProp = function(element, prop)</p><p>{</p><p> var a = parseInt(Spry.Widget.MenuBar.getStyleProp(element, prop),10);</p><p> if (isNaN(a))</p><p> return 0;</p><p> return a;</p><p>};</p><p></p><p>Spry.Widget.MenuBar.getPosition = function(el, doc)</p><p>{</p><p> doc = doc || document;</p><p> if (typeof(el) == 'string') {</p><p> el = doc.getElementById(el);</p><p> }</p><p></p><p> if (!el) {</p><p> return false;</p><p> }</p><p></p><p> if (el.parentNode === null || Spry.Widget.MenuBar.getStyleProp(el, 'display') == 'none') {</p><p> //element must be visible to have a box</p><p> return false;</p><p> }</p><p></p><p> var ret = {x:0, y:0};</p><p> var parent = null;</p><p> var box;</p><p></p><p> if (el.getBoundingClientRect) { // IE</p><p> box = el.getBoundingClientRect();</p><p> var scrollTop = doc.documentElement.scrollTop || doc.body.scrollTop;</p><p> var scrollLeft = doc.documentElement.scrollLeft || doc.body.scrollLeft;</p><p> ret.x = box.left + scrollLeft;</p><p> ret.y = box.top + scrollTop;</p><p> } else if (doc.getBoxObjectFor) { // gecko</p><p> box = doc.getBoxObjectFor(el);</p><p> ret.x = box.x;</p><p> ret.y = box.y;</p><p> } else { // safari/opera</p><p> ret.x = el.offsetLeft;</p><p> ret.y = el.offsetTop;</p><p> parent = el.offsetParent;</p><p> if (parent != el) {</p><p> while (parent) {</p><p> ret.x += parent.offsetLeft;</p><p> ret.y += parent.offsetTop;</p><p> parent = parent.offsetParent;</p><p> }</p><p> }</p><p> // opera & (safari absolute) incorrectly account for body offsetTop</p><p> if (Spry.is.opera || Spry.is.safari && Spry.Widget.MenuBar.getStyleProp(el, 'position') == 'absolute')</p><p> ret.y -= doc.body.offsetTop;</p><p> }</p><p> if (el.parentNode)</p><p> parent = el.parentNode;</p><p> else</p><p> parent = null;</p><p> if (parent.nodeName){</p><p> var cas = parent.nodeName.toUpperCase();</p><p> while (parent && cas != 'BODY' && cas != 'HTML') {</p><p> cas = parent.nodeName.toUpperCase();</p><p> ret.x -= parent.scrollLeft;</p><p> ret.y -= parent.scrollTop;</p><p> if (parent.parentNode)</p><p> parent = parent.parentNode;</p><p> else</p><p> parent = null;</p><p> }</p><p> }</p><p> return ret;</p><p>};</p><p></p><p>Spry.Widget.MenuBar.stopPropagation = function(ev)</p><p>{</p><p> if (ev.stopPropagation)</p><p> ev.stopPropagation();</p><p> else</p><p> ev.cancelBubble = true;</p><p> if (ev.preventDefault) </p><p> ev.preventDefault();</p><p> else </p><p> ev.returnValue = false;</p><p>};</p><p></p><p>Spry.Widget.MenuBar.setOptions = function(obj, optionsObj, ignoreUndefinedProps)</p><p>{</p><p> if (!optionsObj)</p><p> return;</p><p> for (var optionName in optionsObj)</p><p> {</p><p> if (ignoreUndefinedProps && optionsObj[optionName] == undefined)</p><p> continue;</p><p> obj[optionName] = optionsObj[optionName];</p><p> }</p><p>};</p><p></p><p>[/CODE]</p></blockquote><p></p>
[QUOTE="Jimbim, post: 1350250, member: 241774"] Hi! Im Dreamweaver hab ich mir ein Spry-Menü erstellt. Jetzt würde ich gerne die Effekte abändern. Ich geh mal davon aus, dass dafür js-Kenntnisse benötige, die bei mir nicht vorhanden sind. Für eure Hilfe wäre ich sehr dankbar. Hier der JavaScript-Code: [CODE] var Spry; if (!Spry) Spry = {}; if (!Spry.Widget) Spry.Widget = {}; Spry.BrowserSniff = function() { var b = navigator.appName.toString(); var up = navigator.platform.toString(); var ua = navigator.userAgent.toString(); this.mozilla = this.ie = this.opera = this.safari = false; var re_opera = /Opera.([0-9\.]*)/i; var re_msie = /MSIE.([0-9\.]*)/i; var re_gecko = /gecko/i; var re_safari = /(applewebkit|safari)\/([\d\.]*)/i; var r = false; if ( (r = ua.match(re_opera))) { this.opera = true; this.version = parseFloat(r[1]); } else if ( (r = ua.match(re_msie))) { this.ie = true; this.version = parseFloat(r[1]); } else if ( (r = ua.match(re_safari))) { this.safari = true; this.version = parseFloat(r[2]); } else if (ua.match(re_gecko)) { var re_gecko_version = /rv:\s*([0-9\.]+)/i; r = ua.match(re_gecko_version); this.mozilla = true; this.version = parseFloat(r[1]); } this.windows = this.mac = this.linux = false; this.Platform = ua.match(/windows/i) ? "windows" : (ua.match(/linux/i) ? "linux" : (ua.match(/mac/i) ? "mac" : ua.match(/unix/i)? "unix" : "unknown")); this[this.Platform] = true; this.v = this.version; if (this.safari && this.mac && this.mozilla) { this.mozilla = false; } }; Spry.is = new Spry.BrowserSniff(); // Constructor for Menu Bar // element should be an ID of an unordered list (<ul> tag) // preloadImage1 and preloadImage2 are images for the rollover state of a menu Spry.Widget.MenuBar = function(element, opts) { this.init(element, opts); }; Spry.Widget.MenuBar.prototype.init = function(element, opts) { this.element = this.getElement(element); // represents the current (sub)menu we are operating on this.currMenu = null; this.showDelay = 250; this.hideDelay = 600; if(typeof document.getElementById == 'undefined' || (navigator.vendor == 'Apple Computer, Inc.' && typeof window.XMLHttpRequest == 'undefined') || (Spry.is.ie && typeof document.uniqueID == 'undefined')) { // bail on older unsupported browsers return; } // Fix IE6 CSS images flicker if (Spry.is.ie && Spry.is.version < 7){ try { document.execCommand("BackgroundImageCache", false, true); } catch(err) {} } this.upKeyCode = Spry.Widget.MenuBar.KEY_UP; this.downKeyCode = Spry.Widget.MenuBar.KEY_DOWN; this.leftKeyCode = Spry.Widget.MenuBar.KEY_LEFT; this.rightKeyCode = Spry.Widget.MenuBar.KEY_RIGHT; this.escKeyCode = Spry.Widget.MenuBar.KEY_ESC; this.hoverClass = 'MenuBarItemHover'; this.subHoverClass = 'MenuBarItemSubmenuHover'; this.subVisibleClass ='MenuBarSubmenuVisible'; this.hasSubClass = 'MenuBarItemSubmenu'; this.activeClass = 'MenuBarActive'; this.isieClass = 'MenuBarItemIE'; this.verticalClass = 'MenuBarVertical'; this.horizontalClass = 'MenuBarHorizontal'; this.enableKeyboardNavigation = true; this.hasFocus = false; // load hover images now if(opts) { for(var k in opts) { if (typeof this[k] == 'undefined') { var rollover = new Image; rollover.src = opts[k]; } } Spry.Widget.MenuBar.setOptions(this, opts); } // safari doesn't support tabindex if (Spry.is.safari) this.enableKeyboardNavigation = false; if(this.element) { this.currMenu = this.element; var items = this.element.getElementsByTagName('li'); for(var i=0; i<items.length; i++) { if (i > 0 && this.enableKeyboardNavigation) items[i].getElementsByTagName('a')[0].tabIndex='-1'; this.initialize(items[i], element); if(Spry.is.ie) { this.addClassName(items[i], this.isieClass); items[i].style.position = "static"; } } if (this.enableKeyboardNavigation) { var self = this; this.addEventListener(document, 'keydown', function(e){self.keyDown(e); }, false); } if(Spry.is.ie) { if(this.hasClassName(this.element, this.verticalClass)) { this.element.style.position = "relative"; } var linkitems = this.element.getElementsByTagName('a'); for(var i=0; i<linkitems.length; i++) { linkitems[i].style.position = "relative"; } } } }; Spry.Widget.MenuBar.KEY_ESC = 27; Spry.Widget.MenuBar.KEY_UP = 38; Spry.Widget.MenuBar.KEY_DOWN = 40; Spry.Widget.MenuBar.KEY_LEFT = 37; Spry.Widget.MenuBar.KEY_RIGHT = 39; Spry.Widget.MenuBar.prototype.getElement = function(ele) { if (ele && typeof ele == "string") return document.getElementById(ele); return ele; }; Spry.Widget.MenuBar.prototype.hasClassName = function(ele, className) { if (!ele || !className || !ele.className || ele.className.search(new RegExp("\\b" + className + "\\b")) == -1) { return false; } return true; }; Spry.Widget.MenuBar.prototype.addClassName = function(ele, className) { if (!ele || !className || this.hasClassName(ele, className)) return; ele.className += (ele.className ? " " : "") + className; }; Spry.Widget.MenuBar.prototype.removeClassName = function(ele, className) { if (!ele || !className || !this.hasClassName(ele, className)) return; ele.className = ele.className.replace(new RegExp("\\s*\\b" + className + "\\b", "g"), ""); }; // addEventListener for Menu Bar // attach an event to a tag without creating obtrusive HTML code Spry.Widget.MenuBar.prototype.addEventListener = function(element, eventType, handler, capture) { try { if (element.addEventListener) { element.addEventListener(eventType, handler, capture); } else if (element.attachEvent) { element.attachEvent('on' + eventType, handler); } } catch (e) {} }; // createIframeLayer for Menu Bar // creates an IFRAME underneath a menu so that it will show above form controls and ActiveX Spry.Widget.MenuBar.prototype.createIframeLayer = function(menu) { var layer = document.createElement('iframe'); layer.tabIndex = '-1'; layer.src = 'javascript:""'; layer.frameBorder = '0'; layer.scrolling = 'no'; menu.parentNode.appendChild(layer); layer.style.left = menu.offsetLeft + 'px'; layer.style.top = menu.offsetTop + 'px'; layer.style.width = menu.offsetWidth + 'px'; layer.style.height = menu.offsetHeight + 'px'; }; // removeIframeLayer for Menu Bar // removes an IFRAME underneath a menu to reveal any form controls and ActiveX Spry.Widget.MenuBar.prototype.removeIframeLayer = function(menu) { var layers = ((menu == this.element) ? menu : menu.parentNode).getElementsByTagName('iframe'); while(layers.length > 0) { layers[0].parentNode.removeChild(layers[0]); } }; // clearMenus for Menu Bar // root is the top level unordered list (<ul> tag) Spry.Widget.MenuBar.prototype.clearMenus = function(root) { var menus = root.getElementsByTagName('ul'); for(var i=0; i<menus.length; i++) this.hideSubmenu(menus[i]); this.removeClassName(this.element, this.activeClass); }; // bubbledTextEvent for Menu Bar // identify bubbled up text events in Safari so we can ignore them Spry.Widget.MenuBar.prototype.bubbledTextEvent = function() { return Spry.is.safari && (event.target == event.relatedTarget.parentNode || (event.eventPhase == 3 && event.target.parentNode == event.relatedTarget)); }; // showSubmenu for Menu Bar // set the proper CSS class on this menu to show it Spry.Widget.MenuBar.prototype.showSubmenu = function(menu) { if(this.currMenu) { this.clearMenus(this.currMenu); this.currMenu = null; } if(menu) { this.addClassName(menu, this.subVisibleClass); if(typeof document.all != 'undefined' && !Spry.is.opera && navigator.vendor != 'KDE') { if(!this.hasClassName(this.element, this.horizontalClass) || menu.parentNode.parentNode != this.element) { menu.style.top = menu.parentNode.offsetTop + 'px'; } } if(Spry.is.ie && Spry.is.version < 7) { this.createIframeLayer(menu); } } this.addClassName(this.element, this.activeClass); }; // hideSubmenu for Menu Bar // remove the proper CSS class on this menu to hide it Spry.Widget.MenuBar.prototype.hideSubmenu = function(menu) { if(menu) { this.removeClassName(menu, this.subVisibleClass); if(typeof document.all != 'undefined' && !Spry.is.opera && navigator.vendor != 'KDE') { menu.style.top = ''; menu.style.left = ''; } if(Spry.is.ie && Spry.is.version < 7) this.removeIframeLayer(menu); } }; // initialize for Menu Bar // create event listeners for the Menu Bar widget so we can properly // show and hide submenus Spry.Widget.MenuBar.prototype.initialize = function(listitem, element) { var opentime, closetime; var link = listitem.getElementsByTagName('a')[0]; var submenus = listitem.getElementsByTagName('ul'); var menu = (submenus.length > 0 ? submenus[0] : null); if(menu) this.addClassName(link, this.hasSubClass); if(!Spry.is.ie) { // define a simple function that comes standard in IE to determine // if a node is within another node listitem.contains = function(testNode) { // this refers to the list item if(testNode == null) return false; if(testNode == this) return true; else return this.contains(testNode.parentNode); }; } // need to save this for scope further down var self = this; this.addEventListener(listitem, 'mouseover', function(e){self.mouseOver(listitem, e);}, false); this.addEventListener(listitem, 'mouseout', function(e){if (self.enableKeyboardNavigation) self.clearSelection(); self.mouseOut(listitem, e);}, false); if (this.enableKeyboardNavigation) { this.addEventListener(link, 'blur', function(e){self.onBlur(listitem);}, false); this.addEventListener(link, 'focus', function(e){self.keyFocus(listitem, e);}, false); } }; Spry.Widget.MenuBar.prototype.keyFocus = function (listitem, e) { this.lastOpen = listitem.getElementsByTagName('a')[0]; this.addClassName(this.lastOpen, listitem.getElementsByTagName('ul').length > 0 ? this.subHoverClass : this.hoverClass); this.hasFocus = true; }; Spry.Widget.MenuBar.prototype.onBlur = function (listitem) { this.clearSelection(listitem); }; Spry.Widget.MenuBar.prototype.clearSelection = function(el){ //search any intersection with the current open element if (!this.lastOpen) return; if (el) { el = el.getElementsByTagName('a')[0]; // check children var item = this.lastOpen; while (item != this.element) { var tmp = el; while (tmp != this.element) { if (tmp == item) return; try{ tmp = tmp.parentNode; }catch(err){break;} } item = item.parentNode; } } var item = this.lastOpen; while (item != this.element) { this.hideSubmenu(item.parentNode); var link = item.getElementsByTagName('a')[0]; this.removeClassName(link, this.hoverClass); this.removeClassName(link, this.subHoverClass); item = item.parentNode; } this.lastOpen = false; }; Spry.Widget.MenuBar.prototype.keyDown = function (e) { if (!this.hasFocus) return; if (!this.lastOpen) { this.hasFocus = false; return; } var e = e|| event; var listitem = this.lastOpen.parentNode; var link = this.lastOpen; var submenus = listitem.getElementsByTagName('ul'); var menu = (submenus.length > 0 ? submenus[0] : null); var hasSubMenu = (menu) ? true : false; var opts = [listitem, menu, null, this.getSibling(listitem, 'previousSibling'), this.getSibling(listitem, 'nextSibling')]; if (!opts[3]) opts[2] = (listitem.parentNode.parentNode.nodeName.toLowerCase() == 'li')?listitem.parentNode.parentNode:null; var found = 0; switch (e.keyCode){ case this.upKeyCode: found = this.getElementForKey(opts, 'y', 1); break; case this.downKeyCode: found = this.getElementForKey(opts, 'y', -1); break; case this.leftKeyCode: found = this.getElementForKey(opts, 'x', 1); break; case this.rightKeyCode: found = this.getElementForKey(opts, 'x', -1); break; case this.escKeyCode: case 9: this.clearSelection(); this.hasFocus = false; default: return; } switch (found) { case 0: return; case 1: //subopts this.mouseOver(listitem, e); break; case 2: //parent this.mouseOut(opts[2], e); break; case 3: case 4: // left - right this.removeClassName(link, hasSubMenu ? this.subHoverClass : this.hoverClass); break; } var link = opts[found].getElementsByTagName('a')[0]; if (opts[found].nodeName.toLowerCase() == 'ul') opts[found] = opts[found].getElementsByTagName('li')[0]; this.addClassName(link, opts[found].getElementsByTagName('ul').length > 0 ? this.subHoverClass : this.hoverClass); this.lastOpen = link; opts[found].getElementsByTagName('a')[0].focus(); //stop further event handling by the browser return Spry.Widget.MenuBar.stopPropagation(e); }; Spry.Widget.MenuBar.prototype.mouseOver = function (listitem, e) { var link = listitem.getElementsByTagName('a')[0]; var submenus = listitem.getElementsByTagName('ul'); var menu = (submenus.length > 0 ? submenus[0] : null); var hasSubMenu = (menu) ? true : false; if (this.enableKeyboardNavigation) this.clearSelection(listitem); if(this.bubbledTextEvent()) { // ignore bubbled text events return; } if (listitem.closetime) clearTimeout(listitem.closetime); if(this.currMenu == listitem) { this.currMenu = null; } // move the focus too if (this.hasFocus) link.focus(); // show menu highlighting this.addClassName(link, hasSubMenu ? this.subHoverClass : this.hoverClass); this.lastOpen = link; if(menu && !this.hasClassName(menu, this.subHoverClass)) { var self = this; listitem.opentime = window.setTimeout(function(){self.showSubmenu(menu);}, this.showDelay); } }; Spry.Widget.MenuBar.prototype.mouseOut = function (listitem, e) { var link = listitem.getElementsByTagName('a')[0]; var submenus = listitem.getElementsByTagName('ul'); var menu = (submenus.length > 0 ? submenus[0] : null); var hasSubMenu = (menu) ? true : false; if(this.bubbledTextEvent()) { // ignore bubbled text events return; } var related = (typeof e.relatedTarget != 'undefined' ? e.relatedTarget : e.toElement); if(!listitem.contains(related)) { if (listitem.opentime) clearTimeout(listitem.opentime); this.currMenu = listitem; // remove menu highlighting this.removeClassName(link, hasSubMenu ? this.subHoverClass : this.hoverClass); if(menu) { var self = this; listitem.closetime = window.setTimeout(function(){self.hideSubmenu(menu);}, this.hideDelay); } if (this.hasFocus) link.blur(); } }; Spry.Widget.MenuBar.prototype.getSibling = function(element, sibling) { var child = element[sibling]; while (child && child.nodeName.toLowerCase() !='li') child = child[sibling]; return child; }; Spry.Widget.MenuBar.prototype.getElementForKey = function(els, prop, dir) { var found = 0; var rect = Spry.Widget.MenuBar.getPosition; var ref = rect(els[found]); var hideSubmenu = false; //make the subelement visible to compute the position if (els[1] && !this.hasClassName(els[1], this.MenuBarSubmenuVisible)) { els[1].style.visibility = 'hidden'; this.showSubmenu(els[1]); hideSubmenu = true; } var isVert = this.hasClassName(this.element, this.verticalClass); var hasParent = els[0].parentNode.parentNode.nodeName.toLowerCase() == 'li' ? true : false; for (var i = 1; i < els.length; i++){ //when navigating on the y axis in vertical menus, ignore children and parents if(prop=='y' && isVert && (i==1 || i==2)) { continue; } //when navigationg on the x axis in the FIRST LEVEL of horizontal menus, ignore children and parents if(prop=='x' && !isVert && !hasParent && (i==1 || i==2)) { continue; } if (els[i]) { var tmp = rect(els[i]); if ( (dir * tmp[prop]) < (dir * ref[prop])) { ref = tmp; found = i; } } } // hide back the submenu if (els[1] && hideSubmenu){ this.hideSubmenu(els[1]); els[1].style.visibility = ''; } return found; }; Spry.Widget.MenuBar.camelize = function(str) { if (str.indexOf('-') == -1){ return str; } var oStringList = str.split('-'); var isFirstEntry = true; var camelizedString = ''; for(var i=0; i < oStringList.length; i++) { if(oStringList[i].length>0) { if(isFirstEntry) { camelizedString = oStringList[i]; isFirstEntry = false; } else { var s = oStringList[i]; camelizedString += s.charAt(0).toUpperCase() + s.substring(1); } } } return camelizedString; }; Spry.Widget.MenuBar.getStyleProp = function(element, prop) { var value; try { if (element.style) value = element.style[Spry.Widget.MenuBar.camelize(prop)]; if (!value) if (document.defaultView && document.defaultView.getComputedStyle) { var css = document.defaultView.getComputedStyle(element, null); value = css ? css.getPropertyValue(prop) : null; } else if (element.currentStyle) { value = element.currentStyle[Spry.Widget.MenuBar.camelize(prop)]; } } catch (e) {} return value == 'auto' ? null : value; }; Spry.Widget.MenuBar.getIntProp = function(element, prop) { var a = parseInt(Spry.Widget.MenuBar.getStyleProp(element, prop),10); if (isNaN(a)) return 0; return a; }; Spry.Widget.MenuBar.getPosition = function(el, doc) { doc = doc || document; if (typeof(el) == 'string') { el = doc.getElementById(el); } if (!el) { return false; } if (el.parentNode === null || Spry.Widget.MenuBar.getStyleProp(el, 'display') == 'none') { //element must be visible to have a box return false; } var ret = {x:0, y:0}; var parent = null; var box; if (el.getBoundingClientRect) { // IE box = el.getBoundingClientRect(); var scrollTop = doc.documentElement.scrollTop || doc.body.scrollTop; var scrollLeft = doc.documentElement.scrollLeft || doc.body.scrollLeft; ret.x = box.left + scrollLeft; ret.y = box.top + scrollTop; } else if (doc.getBoxObjectFor) { // gecko box = doc.getBoxObjectFor(el); ret.x = box.x; ret.y = box.y; } else { // safari/opera ret.x = el.offsetLeft; ret.y = el.offsetTop; parent = el.offsetParent; if (parent != el) { while (parent) { ret.x += parent.offsetLeft; ret.y += parent.offsetTop; parent = parent.offsetParent; } } // opera & (safari absolute) incorrectly account for body offsetTop if (Spry.is.opera || Spry.is.safari && Spry.Widget.MenuBar.getStyleProp(el, 'position') == 'absolute') ret.y -= doc.body.offsetTop; } if (el.parentNode) parent = el.parentNode; else parent = null; if (parent.nodeName){ var cas = parent.nodeName.toUpperCase(); while (parent && cas != 'BODY' && cas != 'HTML') { cas = parent.nodeName.toUpperCase(); ret.x -= parent.scrollLeft; ret.y -= parent.scrollTop; if (parent.parentNode) parent = parent.parentNode; else parent = null; } } return ret; }; Spry.Widget.MenuBar.stopPropagation = function(ev) { if (ev.stopPropagation) ev.stopPropagation(); else ev.cancelBubble = true; if (ev.preventDefault) ev.preventDefault(); else ev.returnValue = false; }; Spry.Widget.MenuBar.setOptions = function(obj, optionsObj, ignoreUndefinedProps) { if (!optionsObj) return; for (var optionName in optionsObj) { if (ignoreUndefinedProps && optionsObj[optionName] == undefined) continue; obj[optionName] = optionsObj[optionName]; } }; [/CODE] [/QUOTE]
Bilder bitte
hier hochladen
und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Zitate einfügen…
Authentifizierung
Wenn ▲ = 7, ▼ = 3, ◇ = 2 und die Summe von ▲ und ▼ durch ◇ geteilt wird, was ist das Ergebnis?
Antworten
Start
Forum
Sonstiges
Webdesign, Webentwicklung & Programmierung
PHP, Javascript, jQuery, Ajax, nodeJS, MySQL...
Spry Menü - Effekte verändern oder hinzufügen
Oben