Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Объединить несколько изображений в галерею (https://javascript.ru/forum/css-html/83274-obedinit-neskolko-izobrazhenijj-v-galereyu.html)

De12 05.11.2021 22:25

Объединить несколько изображений в галерею
 
Привет, есть ли такая возможность, чтобы был скрипт, который если идет несколько тегов img подряд, он им добавлял контейнер и объединял в галерею? Т.е. если в статье несколько таких блоков, то каждый - это отдельная галлерея. Куда копать?

рони 06.11.2021 00:25

De12,
иди циклом по картинкам и оборачивай, в чём проблема ...

[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

voraa 06.11.2021 08:52

Скрип то написать несложно, но постановка задачи неправильная.
А что делать с одиночным <img> ?
А разве не может быть нескольких <img> подряд, которые не надо оборачивать, например, в шапке документа?

De12 06.11.2021 09:11

Цитата:

Сообщение от voraa (Сообщение 541243)
Скрип то написать несложно, но постановка задачи неправильная.
А что делать с одиночным <img> ?
А разве не может быть нескольких <img> подряд, которые не надо оборачивать, например, в шапке документа?

Спасибо за вопрос.

Если одиночный - ничего.

По поводу несколько подряд <img> - проверять только в контентной части, например если в контейнере <div class="content">

De12 06.11.2021 09:12

Цитата:

Сообщение от рони (Сообщение 541241)
De12,
иди циклом по картинкам и оборачивай, в чём проблема ...

[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

Мне кажется, вы не совсем поняли, что я хочу, либо я не правильно понял вашего ответа..

рони 06.11.2021 09:42

De12,
мини html до и после сделайте.

De12 06.11.2021 09:44

Цитата:

Сообщение от рони (Сообщение 541247)
De12,
мини html до и после сделайте.

Привет это первый абзац
<img src="img1.jpg">
<img src="img2.jpg">
<img src="img3.jpg">
Это второй абзац
<img src="img1.jpg">
<img src="img2.jpg">


Пример? Или что, я тупой наверное... Вот пример выше, того как будет в статье и нужно, чтобы если идет несколько подряд img, их оборачивало в контейнер какой-то например, чтобы из этого потом слайдер сделать.

voraa 06.11.2021 09:54

Примерно так это делается
const images = document.querySelectorAll('div.content img');

for (let i = 0; i < images.length; i++) {
    const imgf = images[i];
    const arri = [imgf];
    let img = imgf.nextElementSibling;
    while (img?.tagName === 'IMG') {
        arri.push(img);
        img = img.nextElementSibling;
        i++;
    }
    if (arri.length > 1) {
        const gal = document.createElement('div')
        gal.className = 'gal';
        imgf.parentElement.replaceChild(gal, imgf);
        gal.append(...arri)
    }
    
}

De12 06.11.2021 10:14

Цитата:

Сообщение от voraa (Сообщение 541249)
Примерно так это делается
const images = document.querySelectorAll('div.content img');

for (let i = 0; i < images.length; i++) {
    const imgf = images[i];
    const arri = [imgf];
    let img = imgf.nextElementSibling;
    while (img?.tagName === 'IMG') {
        arri.push(img);
        img = img.nextElementSibling;
        i++;
    }
    if (arri.length > 1) {
        const gal = document.createElement('div')
        gal.className = 'gal';
        imgf.parentElement.replaceChild(gal, imgf);
        gal.append(...arri)
    }
    
}

Спасибо, попробовал, но почему-то не сработало.

De12 06.11.2021 10:18

Цитата:

Сообщение от voraa (Сообщение 541249)
Примерно так это делается
const images = document.querySelectorAll('div.content img');

for (let i = 0; i < images.length; i++) {
    const imgf = images[i];
    const arri = [imgf];
    let img = imgf.nextElementSibling;
    while (img?.tagName === 'IMG') {
        arri.push(img);
        img = img.nextElementSibling;
        i++;
    }
    if (arri.length > 1) {
        const gal = document.createElement('div')
        gal.className = 'gal';
        imgf.parentElement.replaceChild(gal, imgf);
        gal.append(...arri)
    }
    
}



<div class="col-12 text">
<img data-src="/uploads/posts/2021-11/1636154460_default-good-1.png" class="fr-fic fr-dii lazy-loaded" alt="" src="/uploads/posts/2021-11/1636154460_default-good-1.png">
<img data-src="/uploads/posts/2021-11/1636154460_default-good-1.png" class="fr-fic fr-dii lazy-loaded" alt="" src="/uploads/posts/2021-11/1636154460_default-good-1.png">
<img data-src="/uploads/posts/2021-11/1636154460_default-good-1.png" class="fr-fic fr-dii lazy-loaded" alt="" src="/uploads/posts/2021-11/1636154460_default-good-1.png"> 

test test 
<img data-src="/uploads/posts/2021-11/1636154460_default-good-1.png" class="fr-fic fr-dii lazy-loaded" alt="" src="/uploads/posts/2021-11/1636154460_default-good-1.png">
<img data-src="/uploads/posts/2021-11/1636154460_default-good-1.png" class="fr-fic fr-dii lazy-loaded" alt="" src="/uploads/posts/2021-11/1636154460_default-good-1.png">
		</div>


вот такой текст был, класс контейнера с .content на .text в начале менял.

рони 06.11.2021 11:50

обернуть элементы идущие подряд
 
De12,
<!DOCTYPE html>
<html>

<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
        .gal {
            border: #0000FF 1px solid;
            counter-reset: num;
        }

        .gal img:before {
            counter-increment: num;
            content: counter(num)' картинка';
        }
    </style>
    <script>
        document.addEventListener("DOMContentLoaded", function() {
            const images = document.querySelectorAll('div.text img');
            for (let i = 0; i < images.length; i++) {
                const imgf = images[i];
                const arri = [imgf];
                let img = imgf.nextSibling;
                while (img = img.nextSibling) {
                    if (img && img.nodeType === 3 && !(img.data.trim())) continue;
                    if (img == images[i + 1]) arri.push(images[++i]);
                    else break;
                }
                if (arri.length > 1) {
                    const gal = document.createElement('div')
                    gal.className = 'gal';
                    imgf.parentElement.replaceChild(gal, imgf);
                    gal.append(...arri)
                }
            }
        });
    </script>
</head>

<body>
    <div class="col-12 text">
        <img data-src="/uploads/posts/2021-11/1636154460_default-good-1.png" class="fr-fic fr-dii lazy-loaded" alt="" src="/uploads/posts/2021-11/1636154460_default-good-1.png">
        <img data-src="/uploads/posts/2021-11/1636154460_default-good-1.png" class="fr-fic fr-dii lazy-loaded" alt="" src="/uploads/posts/2021-11/1636154460_default-good-1.png">
        <img data-src="/uploads/posts/2021-11/1636154460_default-good-1.png" class="fr-fic fr-dii lazy-loaded" alt="" src="/uploads/posts/2021-11/1636154460_default-good-1.png"> test test
        <img data-src="/uploads/posts/2021-11/1636154460_default-good-1.png" class="fr-fic fr-dii lazy-loaded" alt="" src="/uploads/posts/2021-11/1636154460_default-good-1.png">
        <img data-src="/uploads/posts/2021-11/1636154460_default-good-1.png" class="fr-fic fr-dii lazy-loaded" alt="" src="/uploads/posts/2021-11/1636154460_default-good-1.png">
        <b>test</b>
        <img data-src="/uploads/posts/2021-11/1636154460_default-good-1.png" class="fr-fic fr-dii lazy-loaded" alt="" src="/uploads/posts/2021-11/1636154460_default-good-1.png">
        <img data-src="/uploads/posts/2021-11/1636154460_default-good-1.png" class="fr-fic fr-dii lazy-loaded" alt="" src="/uploads/posts/2021-11/1636154460_default-good-1.png">
        <img data-src="/uploads/posts/2021-11/1636154460_default-good-1.png" class="fr-fic fr-dii lazy-loaded" alt="" src="/uploads/posts/2021-11/1636154460_default-good-1.png">
    </div>
</body>

</html>

voraa 06.11.2021 13:30

Цитата:

Сообщение от De12
Спасибо, попробовал, но почему-то не сработало.

Все прекрасно работает
<!DOCTYPE html>
<html>
 
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
        img {
            height: 40px;
            margin: 8px;
        }
        .gal {
            border: #0000FF 1px solid;
            counter-reset: num;
        }
 
        .gal img:before {
            counter-increment: num;
            content: counter(num)' картинка';
        }
    </style>
</head>
 
<body>
    <div class="content">
        <p>
        <img src="http://kangax.github.io/compat-table/logo.png">
        <img src="http://kangax.github.io/compat-table/logo.png">
        <img src="http://kangax.github.io/compat-table/logo.png">
        <img src="http://kangax.github.io/compat-table/logo.png">
        <img src="http://kangax.github.io/compat-table/logo.png">
        <b>test</b>
        <img src="http://kangax.github.io/compat-table/logo.png">
        <p>
        <div>
        <img src="http://kangax.github.io/compat-table/logo.png">
        <img src="http://kangax.github.io/compat-table/logo.png">
        <img src="http://kangax.github.io/compat-table/logo.png">
        </div>
        <p>
        <img src="http://kangax.github.io/compat-table/logo.png">
        </p>
        <div>
        <img src="http://kangax.github.io/compat-table/logo.png">
        <img src="http://kangax.github.io/compat-table/logo.png">
        <img src="http://kangax.github.io/compat-table/logo.png">
        </div>
    </div>
<script>
const images = document.querySelectorAll('div.content img');
 
for (let i = 0; i < images.length; i++) {
    const imgf = images[i];
    const arri = [imgf];
    let img = imgf.nextElementSibling;
    while (img?.tagName === 'IMG') {
        arri.push(img);
        img = img.nextElementSibling;
        i++;
    }
    if (arri.length > 1) {
        const gal = document.createElement('div')
        gal.className = 'gal';
        imgf.parentElement.replaceChild(gal, imgf);
        gal.append(...arri)
    }
     
}

</script>   
</body>
 
</html>

De12 09.11.2021 01:24

Цитата:

Сообщение от voraa (Сообщение 541256)
Все прекрасно работает
<!DOCTYPE html>
<html>
 
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
        img {
            height: 40px;
            margin: 8px;
        }
        .gal {
            border: #0000FF 1px solid;
            counter-reset: num;
        }
 
        .gal img:before {
            counter-increment: num;
            content: counter(num)' картинка';
        }
    </style>
</head>
 
<body>
    <div class="content">
        <p>
        <img src="http://kangax.github.io/compat-table/logo.png">
        <img src="http://kangax.github.io/compat-table/logo.png">
        <img src="http://kangax.github.io/compat-table/logo.png">
        <img src="http://kangax.github.io/compat-table/logo.png">
        <img src="http://kangax.github.io/compat-table/logo.png">
        <b>test</b>
        <img src="http://kangax.github.io/compat-table/logo.png">
        <p>
        <div>
        <img src="http://kangax.github.io/compat-table/logo.png">
        <img src="http://kangax.github.io/compat-table/logo.png">
        <img src="http://kangax.github.io/compat-table/logo.png">
        </div>
        <p>
        <img src="http://kangax.github.io/compat-table/logo.png">
        </p>
        <div>
        <img src="http://kangax.github.io/compat-table/logo.png">
        <img src="http://kangax.github.io/compat-table/logo.png">
        <img src="http://kangax.github.io/compat-table/logo.png">
        </div>
    </div>
<script>
const images = document.querySelectorAll('div.content img');
 
for (let i = 0; i < images.length; i++) {
    const imgf = images[i];
    const arri = [imgf];
    let img = imgf.nextElementSibling;
    while (img?.tagName === 'IMG') {
        arri.push(img);
        img = img.nextElementSibling;
        i++;
    }
    if (arri.length > 1) {
        const gal = document.createElement('div')
        gal.className = 'gal';
        imgf.parentElement.replaceChild(gal, imgf);
        gal.append(...arri)
    }
     
}

</script>   
</body>
 
</html>

Спасибо, работает отлично, осталось сделать, чтобы еще img оборачивало в <li> </li>, чтобы в слайдер это обернуть все

De12 09.11.2021 01:57

Почти отлично работает, одна проблема. если не тегов разделительных <div> или <p> например, между ними, то все в одну пачку собирает.

рони 09.11.2021 07:32

Цитата:

Сообщение от De12
если не тегов разделительных

безтеговый текст - не айс, смотрите #11
Цитата:

Сообщение от De12
чтобы еще img оборачивало в <li> </li>, чтобы в слайдер это обернуть все

вам показали как оборачивать в div, сделайте по этому примеру


Часовой пояс GMT +3, время: 15:45.