+ Antworten
Ergebnis 1 bis 4 von 4

Thema: Moodalbox - Close Button oben hin?

  1. #1
    TP-Veteran Elli macht sich hier sehr viel Mühe Avatar von Elli
    Registriert seit
    Nov 2002
    Ort
    Orscholz
    Beiträge
    1.114

    Moodalbox - Close Button oben hin?

    Hallo,

    ich verwende die Moodalbox (sowas wie Lightbox, nur für Inhalte) und möchte
    hier den CLOSE-BUTTON oben hin haben, nicht unten. Leider sind meine JS
    Kenntnisse eher beschränkt, um hier genau herauslesen zu können, was ich
    ändern muss, damit er diesen über den Content schreibt. Wäre schön, wenn
    jemand ne Idee dazu hätte Erzeugt wird dieser Part in Zeile 80.

    Code:
    /******************************************************************/
    /*                        MOOdalBox 1.2.1                         */
    /* A modal box (inline popup), used to display remote content     */
    /* loaded using AJAX, written for the mootools framework          */
    /*         by Razvan Brates, razvan [at] e-magine.ro              */
    /******************************************************************/
    /*               http://www.e-magine.ro/moodalbox                 */
    /******************************************************************/
    /*                                                                */
    /* MIT style license:                                             */
    /* http://en.wikipedia.org/wiki/MIT_License                       */
    /*                                                                */
    /* mootools found at:                                             */
    /* http://mootools.net/                                           */
    /*                                                                */
    /* Original code based on "Slimbox", by Christophe Beyls:         */
    /* http://www.digitalia.be/software/slimbox                       */
    /******************************************************************/
    
    // Constants defined here can be changed for easy config / translation
    // (defined as vars, because of MSIE's lack of support for const)
    
    var _ERROR_MESSAGE = "Leider trat ein Fehler beim Laden des Inhalts auf.<br /><br />" +
    					"Bitte noch einmal probieren.<br /><br />" +
    					"<em>Zum Schließen einfach irgendwo klicken.</em>"; // the error message displayed when the request has a problem
    var _RESIZE_DURATION 		= 400; 		// Duration of height and width resizing (ms)
    var _INITIAL_WIDTH			= 250;		// Initial width of the box (px)
    var _INITIAL_HEIGHT			= 250;		// Initial height of the box (px)
    var _CONTENTS_WIDTH 		= 746;		// Actual width of the box (px) ### changed for DGP
    var _CONTENTS_HEIGHT		= 582;		// Actual height of the box (px) ### changed for DGP
    var _DEF_CONTENTS_WIDTH		= 500;		// Default width of the box (px) - used for resetting when a different setting was used
    var _DEF_CONTENTS_HEIGHT	= 400;		// Default height of the box (px) - used for resetting when a different setting was used
    var _ANIMATE_CAPTION		= true;		// Enable/Disable caption animation
    var _EVAL_SCRIPTS			= false;	// Option to evaluate scripts in the response text
    var _EVAL_RESPONSE			= false;	// Option to evaluate the whole response text
    
    // The MOOdalBox object in its beauty
    var MOOdalBox = {
    	
    	// init the MOOdalBox
    	init: function (options) {
    		
    		// init default options
    		this.options = Object.extend({
    			resizeDuration: 	_RESIZE_DURATION,
    			initialWidth: 		_INITIAL_WIDTH,	
    			initialHeight: 		_INITIAL_HEIGHT,
    			contentsWidth: 		_CONTENTS_WIDTH,
    			contentsHeight: 	_CONTENTS_HEIGHT,
    			defContentsWidth: 	_DEF_CONTENTS_WIDTH,
    			defContentsHeight: 	_DEF_CONTENTS_HEIGHT,
    			animateCaption: 	_ANIMATE_CAPTION,
    			evalScripts: 		_EVAL_SCRIPTS,
    			evalResponse: 		_EVAL_RESPONSE
    		}, options || {});
    		
    		// scan anchors for those opening a MOOdalBox
    		this.anchors = [];
    		$A($$('a')).each(function(el){
    			// we use a regexp to check for links that 
    			// have a rel attribute starting with "moodalbox"
    			if(el.rel && el.href && el.rel.test('^moodalbox', 'i')) {
    				el.onclick = this.click.pass(el, this);
    				this.anchors.push(el);
    			}
    		}, this);
    		
    		// add event listeners
    		this.eventKeyDown = this.keyboardListener.bindWithEvent(this);
    		this.eventPosition = this.position.bind(this);
    		
    		// init the HTML elements
    		// the overlay (clickable to close)
    		this.overlay = new Element('div').setProperty('id', 'mb_overlay').injectInside(document.body);
    		// the center element
    		this.center = new Element('div').setProperty('id', 'mb_center').setStyles({width: this.options.initialWidth+'px', height: this.options.initialHeight+'px', marginLeft: '-'+(this.options.initialWidth/2)+'px', display: 'none'}).injectInside(document.body);
    		// the actual page contents
    		this.contents = new Element('div').setProperty('id', 'mb_contents').injectInside(this.center);
    
    		// the bottom part (caption / close)
    		this.bottom = new Element('div').setProperty('id', 'mb_bottom').setStyle('display', 'none').injectInside(document.body);
    		this.closelink = new Element('a').setProperties({id: 'mb_close_link', href: '#'}).injectInside(this.bottom);
    		this.caption = new Element('div').setProperty('id', 'mb_caption').injectInside(this.bottom);
    		new Element('div').setStyle('clear', 'both').injectInside(this.bottom);
    		
    		this.error = new Element('div').setProperty('id', 'mb_error').setHTML(_ERROR_MESSAGE);
    		
    		// attach the close event to the close button / the overlay
    		this.closelink.onclick = this.overlay.onclick = this.close.bind(this);
    		
    		// init the effects
    		var nextEffect = this.nextEffect.bind(this);
    		this.fx = {
    			overlay: 	this.overlay.effect('opacity', { duration: 500 }).hide(),
    			resize: 	this.center.effects({ duration: this.options.resizeDuration, onComplete: nextEffect }),
    			contents: 	this.contents.effect('opacity', { duration: 500, onComplete: nextEffect }),
    			bottom: 	this.bottom.effects({ duration: 400, onComplete: nextEffect })
    		};
    		
    		this.ajaxRequest = Class.empty;
    
    	},
    	
    	click: function(link) {
    		return this.open (link.href, link.title, link.rel);
    	},
    
    	open: function(sLinkHref, sLinkTitle, sLinkRel) {
    		this.href = sLinkHref;
    		this.title = sLinkTitle;
    		this.rel = sLinkRel;
    		this.position();
    		this.setup(true);
    		this.top = Window.getScrollTop() + (Window.getHeight() / 15);
    		this.center.setStyles({top: this.top+'px', display: ''});
    		this.fx.overlay.custom(0.8);
    		return this.loadContents(sLinkHref);
    	},
    
    	position: function() {
    		this.overlay.setStyles({top: Window.getScrollTop()+'px', height: Window.getHeight()+'px'});
    	},
    
    	setup: function(open) {
    		var elements = $A($$('object'));
    		elements.extend($$(window.ActiveXObject ? 'select' : 'embed'));
    		elements.each(function(el){ el.style.visibility = open ? 'hidden' : ''; });
    		var fn = open ? 'addEvent' : 'removeEvent';
    		window[fn]('scroll', this.eventPosition)[fn]('resize', this.eventPosition);
    		document[fn]('keydown', this.eventKeyDown);
    		this.step = 0;
    	},
    	
    	loadContents: function() {		
    		if(this.step) return false;
    		this.step = 1;
    		
    		// check to see if there are specified dimensions
    		// if not, fall back to default values
    		var aDim = this.rel.match(/[0-9]+/g);
    		this.options.contentsWidth = (aDim && (aDim[0] > 0)) ? aDim[0] : this.options.defContentsWidth;
    		this.options.contentsHeight = (aDim && (aDim[1] > 0)) ? aDim[1] : this.options.defContentsHeight;
    						
    		this.bottom.setStyles({opacity: '0', height: '0px', display: 'none'});
    		this.center.className = 'mb_loading';
    		
    		this.fx.contents.hide();
    		
    		// AJAX call here
    		var nextEffect = this.nextEffect.bind(this);
    		var ajaxFailure = this.ajaxFailure.bind(this);
    		var ajaxOptions = {
    			method: 		'get',
    			update: 		this.contents, 
    			evalScripts: 	this.options.evalScripts,
    			evalResponse: 	this.options.evalResponse,
    			onComplete: 	nextEffect, 
    			onFailure: 		ajaxFailure
    			};
    		this.ajaxRequest = new Ajax(this.href, ajaxOptions).request();
    				
    		return false;
    	},
    	
    	ajaxFailure: function (){
    		this.contents.setHTML('');
    		this.error.clone().injectInside(this.contents);
    		this.nextEffect();
    		this.center.setStyle('cursor', 'pointer');
    		this.bottom.setStyle('cursor', 'pointer');
    		this.center.onclick = this.bottom.onclick = this.close.bind(this);		
    	},
    	
    	nextEffect: function() {
    		switch(this.step++) {
    		case 1:
    			// remove previous styling from the elements 
    			// (e.g. styling applied in case of an error)
    			this.center.className = '';
    			this.center.setStyle('cursor', 'default');
    			this.bottom.setStyle('cursor', 'default');
    			this.center.onclick = this.bottom.onclick = '';
    			this.caption.setHTML(this.title);
    			
    			this.contents.setStyles ({width: this.options.contentsWidth + "px", height: this.options.contentsHeight + "px"});
    
    			if(this.center.clientHeight != this.contents.offsetHeight) {
    				this.fx.resize.custom({height: [this.center.clientHeight, this.contents.offsetHeight]});
    				break;
    			}
    			this.step++;
    					
    		case 2:
    			if(this.center.clientWidth != this.contents.offsetWidth) {
    				this.fx.resize.custom({width: [this.center.clientWidth, this.contents.offsetWidth], marginLeft: [-this.center.clientWidth/2, -this.contents.offsetWidth/2]});
    				break;
    			}
    			this.step++;
    		
    		case 3:
    			this.bottom.setStyles({top: (this.top + this.center.clientHeight)+'px', width: this.contents.style.width, marginLeft: this.center.style.marginLeft, display: ''});
    			this.fx.contents.custom(0,1);
    			break;
    		
    		case 4:
    			if(this.options.animateCaption) {
    				this.fx.bottom.custom({opacity: [0, 1], height: [0, this.bottom.scrollHeight]});
    				break;
    			}
    			this.bottom.setStyles({opacity: '1', height: this.bottom.scrollHeight+'px'});
    
    		case 5:
    			this.step = 0;
    		}
    	},
    	
    	
    	keyboardListener: function(event) {
    		// close the MOOdalBox when the user presses CTRL + W, CTRL + X, ESC
    		if ((event.control && event.key == 'w') || (event.control && event.key == 'x') || (event.key == 'esc')) {
    			this.close();
    			event.stop();
    		}		
    	},
    	
    	close: function() {
    		if(this.step < 0) return;
    		this.step = -1;
    		for(var f in this.fx) this.fx[f].clearTimer();
    		this.center.style.display = this.bottom.style.display = 'none';
    		this.center.className = 'mb_loading';
    		this.fx.overlay.chain(this.setup.pass(false, this)).custom(0);
    		return false;
    	}
    		
    };
    
    Window.onDomReady(MOOdalBox.init.bind(MOOdalBox));
    Gruß
    Elli
    Es gibt keinen Fortschritt ohne den Glauben an die Zukunft.
    [JFK]

  2. #2
    TP-Special Mod steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User Avatar von steffenk
    Registriert seit
    Feb 2005
    Ort
    Haan / NRW
    Beiträge
    12.869
    das muss doch über css gehen (#mb_bottom)


    TYPO3 · MySQLDumper · dislabs
    ·
    manche Mühlen mahlen schneller ...
    "Ich habe Rücken"
    Horst Schlämmer


  3. #3
    TP-Veteran Elli macht sich hier sehr viel Mühe Avatar von Elli
    Registriert seit
    Nov 2002
    Ort
    Orscholz
    Beiträge
    1.114
    So, habens heute Nachmittag gelöst.

    Nein - leider geht das nicht über pures CSS zu lösen. Habe sogar
    in dem Forum dazu diesen Hinweis erhalten, dass dies zur Zeit nur
    über JS geht, kombiniert mit CSS.

    Lösung: Die Elemente werden einfach der Reihe nach in den DOM
    geschrieben. Das haben wir hoch gezogen. Dann muss man noch
    die Werte für Top korrigieren. Die Angabe wird auch per JS direkt
    rein geschrieben und wird für die Top-Ausrichtung nicht wirklich
    benötigt >
    Code:
    this.bottom.setStyles({top: '5px', width: this.contents.style.width, marginLeft: this.center.style.marginLeft, display: ''});
    Die 5 px sind hier der top Abstand, wenn man den Border auch auf
    5 gestellt hat.

    That's it
    Es gibt keinen Fortschritt ohne den Glauben an die Zukunft.
    [JFK]

  4. #4
    TP-Newbie informer macht alles soweit korrekt
    Registriert seit
    May 2008
    Beiträge
    3
    Hab' da eine weitere Frage zur Moodalbox.

    Weiß jemand ob und wenn wie es möglich ist mehrere Moodalboxen miteinander zu verknüpfen? Also wie z.B. bei der Lightbox... durch rel="lightbox[bild1]" und rel="lightbox[bild2]" sodass dann beim drüberfahren ein "next" oder "previous" kommt!?

    Vielen Dank für eure Mühen!

+ Antworten

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51