• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[GELÖST] Sticky Element rechts unten

mikdoe

Moderator
Guten Morgen!

Bitte um Hilfe bei diesem Fiddle: https://jsfiddle.net/mikfidde/2xaza7ua/

Meine Fragen dazu (stehen auch im Fiddle):
  • der Button ist zunächst NICHT sticky
  • sobald auf den Button "Start 1" geklickt wird soll sie sticky rechts unten in der Ecke werden
  • da der Button schon beim Seitenaufbau nicht im sichtbaren Bereich liegt soll er einigermaßen soft nach oben scrollen
  • der Button ist rechtsbündig und soll dies auch bleiben, ich verstehe nicht, warum er das nicht mehr ist nach Klick auf den Schalter
  • der Button soll niemals unter seinen ursprünglichen Platz scrollen, selbst dann nicht, wenn man nach unten über den Button hinaus scrollt

Vielen Dank!
 
Zuletzt bearbeitet:
Punkt 3 und 5 wird mit position: fixed sehr schwierig/aufwändig. Arbeite doch mit position: relative; und aktualisiere die Position beim onscroll und onresize.

Punkt 4 liegt daran, dass der Wrapper ein display: table-cell; hat. Dadurch wird er 0px breit, wenn das <input> fixiert wird. Auch das löst sich, wenn du mit relativer Position arbeitest.
 
Danke dir Korbinian aber wenn ich fixed durch relative ersetze passiert garnichts mehr.
Kannst du mir im CSS die richtigen Werte eintragen und ich mache das JS dafür dann selbst?
 
Du musst natürlich die relative Position bei jedem Scrollen und auch am Anfang neu berechnen und eintragen (ich würde dafür irgendein Framework verwenden (jQuery sollte es tun), da Positionsberechnungen bei manchen Browsern etwas seltsam sind). Am CSS ist da relativ wenig zu machen.
 
@mikdoe
versuch mal den Wrapper mit css anzusprechen der Sticky läuft dann eh mit.
HTML:
css 
#wrapper{
    position:fixed;
    top:auto;
    left:auto;
    right:0;
    text-align:right;
    bottom:-100px;
    transition:bottom 0.5s ease-in-out 0s;
 }
////////////////////////////////////////////////////////
///////////////////////////javascript/////////////////
<script>
document.getElementById('schalter_start1').onclick = function() {
document.getElementById('wrapper').style.bottom = 0;
};		
</script>
MFG
 
Zuletzt bearbeitet von einem Moderator:
offset brauchst du vom Wrapper, damit du weißt, wo das Element eigentlich ist und ob du mit dem Scrollen schon unterhalb des Wrappers bis. Das sollte sich auch meistens nicht ändern - nur wenn du irgendwas an der Darstellung änderst (z.B. Text einfügen/löschen).
Mit scrollTop auf dem window solltest du die Scrollposition des Fensters bekommen.
 
Guten Abend!
Ich bin ein Stückchen weiter gekommen: Fiddle Sticky Element

Die Werte ergeben sich auch wunschgemäß soweit ich das sehe. Aber am Ende tut die Anweisung jQuery('#wrapper').css('top',neue_position+'px') nicht das was ich erwarte. Nämlich der Schalter bewegt sich nicht nach oben. Warum ist das so?
 
Vielen Dank Korbinian!!

Meine Endlösung sieht dann so aus:
HTML:
<!DOCTYPE HTML>
<html>
<head></head>
<body>
<style type="text/css" scoped>
	#sticky_element{
		border:				5px outset red;
		font-weight:		bold;
		font-size:			30px;
		margin:				10px;
	}
	.spacer{
		padding-top:		2000px;
		padding-bottom:		2000px;
	}
	#wrapper{
		text-align:			right;
		position:			relative;
	}
	#footer{
		padding-top:		500px;
		background-color:	black;
		color:				white;
		font-weight:		bold;
	}
</style>

<div style="padding-top:20px;">
	Es gibt einen Button der normalerweise am Ende des Dokuments sitzt und daher ohne Scrollen nicht sichtbar ist.<br>
	Per Klick muss dieser sichtbar werden, weil er sich ab dann am Ende des Viewports befindet und nicht mehr am Ende des Dokuments.
</div>

<div style="padding-top:20px;">
	<b>Testdurchführung:</b>
	<ul>
		<li>bitte auf diesen Schalter klicken und schauen ob der Button seine Position vom Ende des Dokuments zum Ende des Viewports ändert: <input type="button" value="zum Viewport-Ende" id="schalter1"></li>
		<li>ein bisschen hoch und runter scrollen</li>
		<li><b>wichtig:</b> das Element darf unten nicht in den schwarzen Block scrollen, seine maximal tiefste Position muss am oberen Rand des schwarzen Footers liegen</li>
		<li>jetzt bitte auf diesen Schalter klicken und schauen ob die Position wieder an das Ende des Dokuments wechselt: <input type="button" value="zum Dokumenten-Ende" id="schalter2"></li>
		<li>und wieder ein bisschen hoch und runter scrollen</li>
	</ul>
</div>

<div class="spacer"> </div>

<div id="wrapper">
	<input type="button" id="sticky_element" value="Schalter">
</div>

<div id="footer">Hier ist der Footer</div>

<script>
	document.getElementById('schalter1').onclick = function() {
		document.getElementById('sticky_element').style.position = 'relative';
		window.addEventListener('scroll',reposition,false);
		window.addEventListener('resize',reposition,false);
		console.log('Eventhandler gesetzt und position = "'+document.getElementById('sticky_element').style.position+'" definiert');
		reposition();
	};
	document.getElementById('schalter2').onclick = function() {
		document.getElementById('sticky_element').style.position = 'static';	// static = Default
		window.removeEventListener('scroll',reposition,false);
		window.removeEventListener('resize',reposition,false);
		console.log('Eventhandler entfernt und position = "'+document.getElementById('sticky_element').style.position+'" definiert');
	};

	function reposition() {
		let gesamt = parseInt(jQuery(window).height(),10) + parseInt(jQuery(window).scrollTop(),10);
		let wr_off_top = parseInt(jQuery('#wrapper').offset().top,10);
		let wr_height = parseInt(jQuery('#wrapper').height(),10);
		if (gesamt < wr_off_top + wr_height) {
			let neue_position = (gesamt - wr_height) - wr_off_top;
			jQuery('#sticky_element').css('top',neue_position);
		}
		else {
			jQuery('#sticky_element').css('top',0);
		}
	}
</script>
</body>
</html>
 
Zuletzt bearbeitet:
Zurück
Oben