Beiträge von Sempervivum
-
-
Du hast im HTML schon die Klasse "hidden" gesetzt, das brauchst Du nicht, sie wird erst beim Filtern durch JS gesetzt für die Elemente, die nicht angezeigt werden sollen.
-
Man ist ja neugierig und ich wollte wissen, wie man das auch mit PHP machen kann. Dies ist das Ergebnis:
1. Mit String-Manipulation des HTML:
Code
Alles anzeigen$parent = $_SERVER["SCRIPT_NAME"]; preg_match_all('/href="([^"]+)"/', $html, $matches); var_dump($parent); var_dump($matches); for ($i = 0; $i < count($matches[1]); $i++) { $href = $matches[0][$i]; $url = $matches[1][$i]; if (strpos($parent, $url) !== false) { $htmlModStr = str_replace($href, $href . ' class="active"', $html); } } var_dump($htmlModStr); echo $htmlModStr;
2. Mit Parsen durch DOMDocument:
Code
Alles anzeigen$parent = $_SERVER["SCRIPT_NAME"]; $dom = new DOMDocument; $dom->loadHTML($html, LIBXML_NOWARNING | LIBXML_NOERROR); $links = $dom->getElementsByTagName('a'); foreach ($links as $link) { $url = $link->getAttribute('href'); if (strpos($parent, $url) !== false) { $link->setAttribute('class', 'active'); } } $htmlModDom = $dom->saveHTML(); var_dump($htmlModDom); echo $htmlModDom;
Bei beiden wird zunächst das HTML als String in der Variablen $html definiert, z. B.:
Code$html = ' <nav> <ul> <li> <a id="navi01" href="index.php">Startseite</a></li> <li> <a id="navi02" href="master-1.php">Seite 1</a></li> <li> <a id="navi03" href="master-2.php">Seite 2</a></li> </ul> </nav>'; $parent = $_SERVER["SCRIPT_NAME"];
Beides erfordert keine Änderungen in der Elterndatei und ist nicht viel komplizierter als die Lösung mit Javascript.
-
Zitat
Dabei ist mir aufgefallen, dass ich viel weniger und verständlichen html- Code habe als zb. mit Bootstrap.
Das ist genau der Grund, warum ich selbst kein Freund von Bootstrap bin. Freut mich, dass Du das auch so siehst.
Was die Animation mit dem Gleiten zum Platz betrifft, so habe ich das schon bei Isotope gesehen, das Du am Anfang gepostet hattest. So weit ich das überblicke werden dort die Positionen nicht mit Flex oder Grid fest gelegt sondern komplett mit Javascript berechnet.
Auf der einen Seite bin ich nicht so dafür, das Rad neu zu erfinden aber auf der anderen wäre es eine interessante Herausforderung, so etwas wie bei Ben Yahia selbst aufzubauen. Der Effekt, dass die Bilder von unten her eingleiten, wäre noch relativ einfach zu machen: Wie bisher die Positionen durch Flex festlegen lassen, aber direkt nach dem Filtern durch transform:translate die Position nach unten verschieben und dann mit transform: translate(0,0) an den endgültigen Platz gleiten lassen. Die Animation kann man dabei durch CSS machen lassen, man braucht nur die Positionen am Anfang und Ende zu setzen.
-
Yep, weil diese Aufgabe hin und wieder vorkommt, habe ich etwas in der Schublade. Man kann das mit wenigen Zeilen Javascript erledigen:
Codeconst url = document.location.href; document.querySelectorAll('nav li a').forEach(item => { if (url.includes(item.href)) { item.classList.add('active'); } });
Den Selektor musst Du ggf. anpassen. Und basierend auf der Klasse "active" kannst Du dann den Link hervorheben wie Du es möchtest.
-
Wenn man versteht, wie es funktioniert, kann man das alles durch logische Überlegung herleiten.
Das Layout ist immer noch ein wenig unsauber. Wenn ich ein display:none hinzu füge, sieht es besser aus. Und auf das flex-basis kann man dann verzichten:
-
-
-
Das liegt daran, dass das CSS ist und kein Javascript. Du musst es in deiner CSS-Datei eintragen. Und dann das JS so erweitern:
Code
Alles anzeigenconst liItem = document.querySelectorAll('ul li'); const figureItem = document.querySelectorAll('div.image-gallery figure'); liItem.forEach(li => { li.onclick = function() { //active liItem.forEach(li => { li.classList.remove('active'); }) li.classList.add("active"); //Filter const value = li.textContent; figureItem.forEach(figure => { if (figure.dataset['data-filter'] == value.toLowerCase() || value == "All Menu") { figure.classList.remove('hidden'); } else { figure.classList.add('hidden'); } }); } });
(ungetestet)
-
-
Das liegt daran, dass Du nur das img ausblendest, und nicht das gesamte figure. Bei dem figure wirkt dann das flex-basis: 350px; und es nimmt dennoch den Raum ein wie zuvor, auch wenn das Bild verschwunden ist. Setze das flex-basis für figure auf 0, dann wird es funktionieren.
Noch besser: Setze im Javascript eine Klasse "hidden" und blende dann im CSS das figure aus:
-
Das war jetzt wirklich ein wenig eine harte Nuss!
Der Schuldige ist das ul in dem Slider "Was sagen meine Kunden".
Code
Alles anzeigen.testim .dots { text-align: center; position: absolute; width: 100%; bottom: 60px; left: 0; display: block; z-index: 3333; height: 12px; padding: 0; }
Diesem weist Du eine Breite von 100% zu, damit es den umgebenden Container ausfüllt. Das Problem ist, dass dieses ul per Default ein padding hat. Das addiert sich zu der Breite, so dass sich mehr als 100% ergeben und die Breite des Browserfensters überschritten wird. Setze ich im Seiteninspektor das Padding auf 0 verschwindet die horizontale Scrollbar.
-
Natürlich, das ist zu empfehlen.
-
-
Übrigens, dies ist ganz schlecht:
Du löschst damit alle anderen Klassen, die das Element schon hat. Besser mit classList arbeiten:
-
Wenn Du den Filter, das wird ja wahrscheinlich eine Leiste mit Buttons werden, einfach im HTML dazwischen setzt, wird die Galerie nach unten rücken, Du brauchst nicht extra Platz zu machen.
ZitatVielleicht hast du ja eine Eingebung wie mich von den externen Scripts befreien kann.
Du kannst sie einfach herunter laden, die URL im src-Attribut kopieren, in der Adresszeile des Browsers einfügen. Dann wird die Datei geladen und Du kannst sie mit Rechtsklick, "Speichern unter" lokal speichern.
-
Ich nehme an, Du hast die Dateien von hier herunter geladen:
GitHub - fancyapps/fancybox: jQuery lightbox script for displaying images, videos and more. Touch enabled, responsive and fully customizable.jQuery lightbox script for displaying images, videos and more. Touch enabled, responsive and fully customizable. - GitHub - fancyapps/fancybox: jQuery…github.comUnd im dem Fall passt auch das, was Du auf deiner Seite hast. Warum es nicht funktioniert und wie man es korrigieren kann, habe ich nicht heraus gefunden. Aber anscheinend passt die Doku auf dieser Github-Seite nicht so richtig zu den Dateien, die dort liegen.
-
PS: Außerdem hast Du ein leeres a-Tag im HTML, statt dessen muss dieses den Inhalte des figure-Tags umschließen:
-
In der Doku wird angegeben, dass man das über CDN einbinden soll, d. h. im Head:
Code<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/ui@5.0/dist/fancybox/fancybox.css" />
Und am Ende des Body:
Code<script src="https://cdn.jsdelivr.net/npm/@fancyapps/ui@5.0/dist/fancybox/fancybox.umd.js"></script> <script> Fancybox.bind('[data-fancybox]', { // Your custom options }); </script>
Versuche das zunächst so, wenn Du lieber unabhängig vom CDN sein willst, können wir das noch ändern.
-
Wie oben, Fancybox. Bezüglich der Lizenz finde ich auf Github dies:
ZitatFancybox is licensed under the GPLv3 license for all open source applications. A commercial license is required for all commercial applications (including sites, themes and apps you plan to sell).
GitHub - fancyapps/fancybox: jQuery lightbox script for displaying images, videos and more. Touch enabled, responsive and fully customizable.jQuery lightbox script for displaying images, videos and more. Touch enabled, responsive and fully customizable. - GitHub - fancyapps/fancybox: jQuery…github.com