• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zmiana elementów na aktywnym oknie

Object Storage Arubacloud
+1 głos
91 wizyt
pytanie zadane 12 marca 2022 w JavaScript przez Grzegorz Mikina Dyskutant (8,060 p.)

Mam taki skrypt, pobiera kliknięty element i wyszarza background, pojawiają się ikony strzałek itd.
Mam otwarcie tego okna, zamknięcie. W jaki sposób mogę zorganizować galerie na zasadzie następny... następny... wcześniejszy.

<div class="image-container">
                <div class="container-fluid image">
                    <img class="img-fluid"src="{{ asset('assets/img/gallery/pizza1.png') }}" alt="Alternate text image">
                </div>
                <div class="container-fluid image">
                    <img class="img-fluid"src="{{ asset('assets/img/gallery/pizza2.png') }}" alt="Alternate text image">
                </div>
                <div class="container-fluid image">
                    <img class="img-fluid"src="{{ asset('assets/img/gallery/pizza3.png') }}" alt="Alternate text image">
                </div>
                <div class="container-fluid image">
                    <img class="img-fluid"src="{{ asset('assets/img/gallery/pizza4.jpg') }}" alt="Alternate text image">
                </div>
                <div class="container-fluid image">
                    <img class="img-fluid"src="{{ asset('assets/img/gallery/pizza5.jpg') }}" alt="Alternate text image">
                </div>
                <div class="container-fluid image">
                    <img class="img-fluid"src="{{ asset('assets/img/gallery/pizza6.jpg') }}" alt="Alternate text image">
                </div>
                <div class="container-fluid image">
                    <img class="img-fluid"src="{{ asset('assets/img/gallery/pizza1.png') }}" alt="Alternate text image">
                </div>
                <div class="container-fluid image">
                    <img class="img-fluid"src="{{ asset('assets/img/gallery/pizza1.png') }}" alt="Alternate text image">
                </div>
                <div class="container-fluid image">
                    <img class="img-fluid"src="{{ asset('assets/img/gallery/pizza1.png') }}" alt="Alternate text image">
                </div>
            </div>
            <div class="popup-image">
            <span>&times;</span>
            <span class="leftArrow">&LeftArrow;</span>
            <span class="rightArrow">&RightArrow;</span>
                <img class="img-fluid"src="{{ asset('assets/img/gallery/pizza1.png') }}" alt="Alternate text image">
</div>
document.querySelectorAll('.image-container img').forEach(image =>{
    image.onclick = () =>{
        document.querySelector('.popup-image').style.display = "block";
        document.querySelector('.popup-image img').src = image.getAttribute('src');
    }
});

document.querySelector('.popup-image span').onclick = () =>{
    document.querySelector('.popup-image').style.display = 'none';
}

 

komentarz 12 marca 2022 przez Grzegorz Mikina Dyskutant (8,060 p.)
przeniesione 12 marca 2022 przez ScriptyChris
Chce żeby po kliknięciu w strzałkę jedną lub drugą nie chowało mi się to okno, ale żeby pokazało się kolejne zdjęcie następne, lub wcześniejsze.

1 odpowiedź

0 głosów
odpowiedź 12 marca 2022 przez VBService Ekspert (253,300 p.)
edycja 12 marca 2022 przez VBService
const images = document.querySelectorAll('.image-container img');
console.log(images.length);

images.forEach((image) => { ... }

Jak widzisz document.querySelectorAll('.image-container img') można też wykorzystać do "pobrania ilości" obrazków.

Dodaj Event click do strzałek, który będzie ładował kolejny obrazek

document.querySelector('.popup-image img').src = images[0].getAttribute('src');
document.querySelector('.popup-image img').src = images[1].getAttribute('src');
...
document.querySelector('.popup-image img').src = images[images.length - 1].getAttribute('src');

do sprawdzenia indeksu obrazka klikniętego możesz skorzystać np. z e.target i indexOf.

[...images].indexOf(e.target);

 

images.forEach((image) => {
  image.onclick = (e) => {
    document.querySelector('.popup-image').style.display = "block";
    document.querySelector('.popup-image img').src = image.getAttribute('src');
    
    if (images)  
      console.log([...images].indexOf(e.target));
  }
});

 

 

 

P.S.1

 

P.S.2 Ten zapis

elements.forEach((element) => {
  element.onclick = (e) => {
     ...
  }
});

można np. zapisać inaczej "używając":  JavaScript Event Delegation 

komentarz 14 marca 2022 przez VBService Ekspert (253,300 p.)
edycja 14 marca 2022 przez VBService

W odniesieniu do tego co powyżej  wink

<!--
  Kliknij w dowolny obrazek
-->
<div class="image-container">
  <div>
    <img src="https://picsum.photos/500/500/?random=1" />
  </div>
  <div>
    <img src="https://picsum.photos/500/500/?random=2" />
  </div>
  <div>
    <img src="https://picsum.photos/500/500/?random=3" />
  </div>
  <div>
    <img src="https://picsum.photos/500/500/?random=4" />
  </div>
  <div>
    <img src="https://picsum.photos/500/500/?random=5" />
  </div>
  <div>
    <img src="https://picsum.photos/500/500/?random=6" />
  </div>
  <div>
    <img src="https://picsum.photos/500/500/?random=7" />
  </div>
  <div>
    <img src="https://picsum.photos/500/500/?random=8" />
  </div>
  <div>
    <img src="https://picsum.photos/500/500/?random=9" />
  </div>
  <div>
    <img src="https://picsum.photos/500/500/?random=10" />
  </div>
  <div>
    <img src="https://picsum.photos/500/500/?random=11" />
  </div>
  <div>
    <img src="https://picsum.photos/500/500/?random=12" />
  </div>  
</div>
<dialog id="slider-dialog">  
  <span id="left-arrow">&#8678;</span>
  <span id="right-arrow">&#8680;</span>
  <span id="close-button">&times;</span>
  <img src="" />
</dialog>
* {
  box-sizing: border-box;
}
body {
  filter: none;
  transition: filter 0.4s ease;
}
.image-container {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: 1fr 1fr;
  gap: 0.15rem 0.25rem;
  grid-template-areas:
    ". . . ."
    ". . . ."
    ". . . .";
  width: 60vw;
  margin: 1em auto;   
}
.image-container img {
  user-select: none;
  min-width: 200px;
  min-height: 200px;
  width: 100%;
}
dialog {
  position: relative;
  border-radius: 1em;
  user-select: none;
  cursor: default;
}
dialog span {
  position: absolute;
  cursor: pointer;
}
dialog span#left-arrow,
dialog span#right-arrow { 
  top: 50%;
  color: black;
  z-index: 99;
  transition: all 0.2s linear;
}
dialog span#left-arrow {
  left: 0.45rem;
}
dialog span#right-arrow {
  right: 0.45rem;
}
dialog span#close-button {
  top: 0.25rem;
  right: 0.3rem;
  transition: all 0.2s linear;
}
dialog span#left-arrow:hover,
dialog span#right-arrow:hover,
dialog span#close-button:hover {
  color: limegreen;
  border-radius: 100%;
  text-shadow:
    0 0 7px #fff, 0 0 10px #fff,
    0 0 21px #fff, 0 0 42px #0fa,
    0 0 82px #0fa, 0 0 92px #0fa,
    0 0 102px #0fa, 0 0 151px #0fa,
    0 0 162px #0fb, 0 0 171px #0fb;
  transform: scale(2);
}
dialog img {
  display: block;
  width: 400px;
  height: 400px;
  opacity: 1;
  transition: opacity 0.6s ease-in-out;
}
.off {
  filter: blur(5px) grayscale(1);
}
.fade {
  opacity: 0;
}
let slider_dialog, images;
window.addEventListener('load', load);

function load() {
  const image_container = document.querySelector('.image-container');
  images = document.querySelectorAll('.image-container img');
  slider_dialog = document.querySelector('#slider-dialog');

  image_container.addEventListener('click', openSlider);
  image_container.addEventListener('dragstart', (e) => { e.preventDefault(); });
  slider_dialog.addEventListener('click', sliderBox);
  slider_dialog.querySelector('img').addEventListener('dragstart', (e) => { e.preventDefault(); });
}

function sliderBox(e) {
  if (e.target.nodeName == 'SPAN') {
    switch (e.target.id) {
      case 'close-button': slider_dialog.close(); bodyToggle(); break;
      case 'left-arrow':   sliderBoxChangeImage(-1); break;
      case 'right-arrow':  sliderBoxChangeImage(+1); break;
    }
  }
}

function sliderBoxChangeImage(direction) {
  let index = parseInt(slider_dialog.dataset.imageIndex) + direction;
  index = (index < images.length - 1) ? ((index < 0) ?  images.length - 1 : index) : 0;

  const image = slider_dialog.querySelector('img');
  image.classList.add('fade');  
  setTimeout(_=> {
    image.src = images[index].src;
    setTimeout(_=> { image.classList.remove('fade'); }, 50);
  }, 500);

  slider_dialog.dataset.imageIndex = index; 
}

function openSlider(e) {
  if (e.target.nodeName == 'IMG') {
    if (typeof slider_dialog.showModal === "function") {
      slider_dialog.querySelector('img').src = e.target.src;
      slider_dialog.dataset.imageIndex = [...images].indexOf(e.target);
      slider_dialog.showModal();
      bodyToggle('off');
    }    
  }
}

function bodyToggle(cmd = 'on') {
  if (cmd == 'on') {
    document.body.classList.remove('off');
  } else {
    document.body.classList.add('off');
  }
}

 

Podobne pytania

0 głosów
2 odpowiedzi 1,117 wizyt
0 głosów
1 odpowiedź 870 wizyt
0 głosów
1 odpowiedź 94 wizyt
pytanie zadane 14 grudnia 2021 w PHP przez mi-20 Stary wyjadacz (13,190 p.)

92,568 zapytań

141,420 odpowiedzi

319,623 komentarzy

61,956 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...