D. h. nachdem wir die Änderung mit dem Ausblenden des Div gemacht haben funktioniert funktioniert das animierte Wachsen der Größe von 0 an nicht mehr?
Ich mache mal eine Testdatei dafür ...
D. h. nachdem wir die Änderung mit dem Ausblenden des Div gemacht haben funktioniert funktioniert das animierte Wachsen der Größe von 0 an nicht mehr?
Ich mache mal eine Testdatei dafür ...
Zitatallerdings funktioniert der CSS-Effekt nicht.
Das verstehe ich jetzt nicht, Du schreibst doch, dass die Javascript-Animation funktiert? Welchen CSS-Effekt meinst Du hier?
ZitatIch möchte schön mehrere elemente erzeugen, deswegen mit DocumentFragment.
Das ist natürlich ein Grund und dann ist es auch angebracht.
Zitatmöchte ich ein div ins das erste div erzeugen. Muss ich es mir mit getElementById(....) holen?
Wenn ich das richtig verstehe, hast Du das Div ja als Javascript-Objekt und dann kannst Du das neue auch dort einfügen. In etwa so:
let newDiv = document.createElement('div');
if(categoryBox.hasOwnProperty(elem)) {
newDiv.id = elem;
newDiv.classList.add('min-row');
}
let newDiv2 =document.createElement('div');
// dieses div erweitern mit class, id etc.
// und dem ersten Div hinzu fügen:
newDiv.appendChild(newDiv2);
console.log(categoryBox[elem]);
htmlFragment.appendChild(newDiv);
Alles anzeigen
Das wäre kein Problem, Du müsstest im CSS nur das display auf none setzen und beim Scrollen wieder auf block oder flex:
/* Klasse des eigentlichen Bildes .upperlogo ist der div */
.logocool {
margin-top: 6px;
height: 55px;
width: 57px;
transition: width 0.7s, height 0.7s;
/* Bild zunaechst unsichtbar machen */
width: 0;
height: 0;
display: none;
}
.logocool img {
width: 100%;
height: 100%;
}
#upperlogo.visi {
/* jetzt das Bild sichtbar machen */
width: 55px;
height: 57px;
display: flex;
}
Alles anzeigen
Ich fürchte nur, dass es dann einen unangenehmen Sprung gibt, aber sieh es dir erst Mal an.
Ja, dann wäre das Logo von Anfang an etwas nach rechts versetzt und würde sich vom Zentrum aus ausdehnen.
Wenn ich mir deinen Screenshot oben ansehe, dann ist das Logo ja sicher in einem Container mit den Menüpunkten. Diesem könntest Du display: flex; zuweisen und dann das Logo zentrieren mit align-self: center; für den Container des Logos mit der Klasse "logocool".
Finde ich nicht pingelig. Möchtest Du, dass es nur vertikal mittig ist? Denn sonst wären wären wir wieder bei dem Effekt, den wir mit scale hatten.
Da fehlen uns jetzt noch zwei Dinge:
Das Logo muss sich in der Größe an das Div anpassen und wir müssen width und height animieren:
/* Klasse des eigentlichen Bildes .upperlogo ist der div */
.logocool {
margin-top: 6px;
height: 55px;
width: 57px;
transition: width 0.7s, height 0.7s;
/* Bild zunaechst unsichtbar machen */
width: 0;
height: 0;
}
.logocool img {
width: 100%;
height: 100%;
}
#upperlogo.visi {
/* jetzt das Bild sichtbar machen */
width: 50px;
height: 50px;
}
Alles anzeigen
Ja, ich denke, so sollte es funktionieren. Das andere CSS musst Du natürlich beibehalten.
Und stört es jetzt, dass das Div auch im unsichtbaren Zustand den Platz einnimmt? Wenn ja, einfach width und height ändern anstatt transform:scale
ZitatEine Sache noch:
Ich sollte ja das style="display: none;" entfernen. Dies hatte ich drinstehen, damit der Div nur angezeigt wird, wenn das Scroll-Event gestartet ist, da dort sonst ein unschöner freier Platz ist. Jetzt wird der Div aber immer angezeigt. Kann ich den auch einfach über CSS ausblenden?
Da sind wir jetzt mit dem scale u. U. auf falschen Weg, denn dabei ist es so, dass das Element auf wenn es auf 0 herunter skaliert ist, den Platz einnimmt. Lass uns das erstmal zum Laufen bringen und dann sehen wir weiter.
Jetzt getestet und so funktioniert es:
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8" />
<title></title>
<style>
header {
position: fixed;
background: lightsalmon;
width: 100%;
}
main {
height: 400vh;
background-color: lightblue;
}
/* Klasse des eigentlichen Bildes .upperlogo ist der div */
.logocool {
margin-top: 6px;
height: 55px;
width: 57px;
transition: transform 0.7s;
/* Bild zunaechst unsichtbar machen */
transform: scale(0, 0);
}
#upperlogo.visi {
/* jetzt das Bild sichtbar machen */
transform: scale(1, 1);
}
</style>
</head>
<body>
<header>
<div class="logocool" id="upperlogo">
<img src="images/buttondownload.png" alt="">
</div>
</header>
<main></main>
<script>
window.onscroll = scrollFunction;
function scrollFunction() {
if (window.matchMedia('(min-width: 769px)').matches) {
if (document.body.scrollTop > 250 || document.documentElement.scrollTop > 250) {
document.getElementById("upperlogo").classList.add("visi");
} else {
document.getElementById("upperlogo").classList.remove("visi");
}
}
}
</script>
</body>
</html>
Alles anzeigen
Woran es jetzt lag, weiß ich nicht, ich hatte zunächst das inline display: none; noch drin und der Eventhandler war mir abhanden gekommen.
Das ist nicht verwunderlich, denn ich hatte bisher nichts von dem getestet. Werde ich jetzt aber tun ...
Eher habe ich da etwas falsch verstanden, weil ich das HTML nicht gesehen habe. Du willst ja das Logo sichtbar machen, wenn man herunter scrollt. D. h. den Klassennamen auf "visi" ändern:
if(window.matchMedia('(min-width: 769px)').matches){
if (document.body.scrollTop > 250 || document.documentElement.scrollTop > 250) {
document.getElementById("upperlogo").classList.add("visi");
} else {
document.getElementById("upperlogo").classList.remove("visi");
}
}
}
Du machst ja das Logo mit dem Inlinestyle style="display: none;" unsichtbar. Das zunächst Mal löschen, denn wir wollen ja jetzt die Größe des Logos animieren. Dann im CSS das Logos zunächst auf 0 herunter verkleinern und wenn die Klasse "visi" vorhanden ist, wieder sichtbar machen:
// Klasse des eigentlichen Bildes .upperlogo ist der div //
.logocool {
margin-top: 6px;
height: 55px;
width: 57px;
-webkit-transition: -webkit-transform 0.7s;
transition: transform 0.7s;
/* Bild zunaechst unsichtbar machen */
transform: scale(0, 0);
}
#upperlogo.visi {
-webkit-transform: scale(0, 0);
/* jetzt das Bild sichtbar machen */
transform: scale(1, 1);
}
Alles anzeigen
AFAIK ist dieses -webkit-transform heute nicht mehr notwendig.
Ebenfalls frohe Ostern!
Ich habe es nicht getestet, aber ich denke, Du bist da schon auf dem richtigen Weg. Du musst dann nur das htmlFragment noch dem Container hinzu fügen.
DocumentFragment hat schon Vorteile, aber wenn Du ein einziges Element erzeugen und hinzu fügen willst, geht es wahrscheinlich auch ohne.
Nein, Du brauchst nur eine Klasse. Wenn heruntergescrollt wird, setzt Du diese Klasse mit add und wenn wieder hoch gescrollt wird, löschst Du sie wieder mir remove:
if(window.matchMedia('(min-width: 769px)').matches){
if (document.body.scrollTop > 250 || document.documentElement.scrollTop > 250) {
document.getElementById("upperlogo").classList.add("hidden");
} else {
document.getElementById("upperlogo").classList.remove("hidden");
}
}
}
Und dann im CSS:
Am besten geht so etwas, wenn man es durch Hinzufügen und Löschen einer Klasse macht, dann kannst Du beliebige CSS-Regeln steuern, ohne im JS etwa ändern zu müssen.
https://wiki.selfhtml.org/wiki/JavaScrip…ement/classList
Und mit transition bist Du schon auf dem richtigen Wege. Entweder width und height ändern oder mit transform: scale die Größe auf 0 ändern.
BTW: Dies window.onscroll = function() {scrollFunction()}; lässt sich kürzer formulieren: window.onscroll = scrollFunction;
Gegen deine Vorgehensweise ist nicht einzuwenden.
Alternativen:
Die Eventlistener nicht inline notieren sondern mit addEventListener registrieren
Dies ist problemlos auch mit nur-CSS möglich.
Je nachdem, wie es gewollt ist, kann man dafür sorgen, dass immer nur ein Element geöffnet ist.
1. getElementsByClassName liefert kein einzelnes Element sondern ein Nodelist, im wesentlichen ein Array. Darüber müsstest Du eine Schleife machen.
2. Du musst eine Verbindung zwischen dem geklickten Button und dem .main mit dem Inhalt herstellen. Hast Du den Button, kannst Du das .main mit nextElementSibling finden.
Am besten gleich den Button an die Funktion fun übergeben:
<button onclick="fun(this)">Lesen Sie mehr</button></div>
Dann steht er in der Funktion zur Verfügung:
Ungetestet, den Rest überlasse ich dir.
Ich habe damit (overflow-x) mal ein Demo gemacht und zusätzlich Scrollsnap verwendet. Damit funktioniert es auf meinem Handy mit dem Androidbrowser ganz gut. Nur die Empfindlichkeit ist etwas hoch, häufig wischt man zwei Bilder weiter.
Hier kannst Du es in Aktion sehen:
https://webentwicklung.ulrichbangert.de/thread363-swipe-images.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Swipe Demo</title>
<style>
#img-container {
width: 100%;
display: flex;
overflow-x: scroll;
scroll-snap-type: x mandatory;
}
#img-container img {
width: 100vw;
height: auto;
min-height: 1px;
flex: 0 0 100%;
scroll-snap-align: center;
}
</style>
</head>
<body>
<div id="img-container">
<img src="images/bild1.jpg">
<img src="images/bild2.jpg">
<img src="images/bild3.jpg">
</div>
</body>
</html>
Alles anzeigen
HTML-Seminar.de - mit Videos zum schnellen Lernen, wie man eine Website selbst erstellt.