Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Сложный рандом (https://javascript.ru/forum/misc/84130-slozhnyjj-random.html)

Сергей Ракипов 10.06.2022 10:54

Сложный рандом
 
Я пробую сам написать, и пока до этого сложного рандома еще не дошел столкнулся с небольшой проблемой.

У меня скрипт который должен перебрать все элементы с .sfera и вроде бы все правильно сделал но почему то пишет ошибку.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        main{
            width: 280px;
            margin: 40px auto;
            font-size: 10px;
            font-family: Verdana, Geneva, Tahoma, sans-serif;
        }
        .tema_nastroika {
            margin: 20px 0px 20px 0px;	
        }
        .nastroika_blok {
        }
        .vse {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .sbros {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .sfera_1 {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .sfera_2 {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .sfera_3 {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .sfera_4 {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .sfera_5 {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .vybrano{
            color: blueviolet;
            text-decoration: underline;
        }
        .tema_nazvanie{
            margin: 20px 0px 20px 0px;
            color: #0e9fff;
        }
        .tema_random {
            margin: 20px 0px 20px 0px;
        }
        .knopka_random{
            display: flex;
            justify-content: center;
            align-items: center;
            width: 280px;
            height: 70px;
            border: 1px solid #0e9fff;
            color: #0e9fff;
            cursor: pointer;
        }
        .knopka_random:hover{
            border: 1px solid blueviolet;
            color: blueviolet;
        }
        .tema_vremy {

        }
    </style>
</head>
<body>
    <main>
        <div class="tema_nastroika">
            <div class="nastroika_blok">
                <div class="sfera vse vybrano">Выбрать все</div>
                <div class="sfera sbros">Сброс</div>
                <div class="sfera sfera_1 vybrano">Сфера жизни 1</div>
                <div class="sfera sfera_2 vybrano">Сфера жизни 2</div>
                <div class="sfera sfera_3 vybrano">Сфера жизни 3</div>
                <div class="sfera sfera_4 vybrano">Сфера жизни 4</div>
                <div class="sfera sfera_5 vybrano">Сфера жизни 5</div>
            </div>
        </div>
        <div class="tema_nazvanie">
            <div class="blok_sfera_1">
                <p>Название темы  по  сфере 1 Вопрос №1</p>
                <p>Название темы  по  сфере 1 Вопрос №2</p>
                <p>Название темы  по  сфере 1 Вопрос №3</p>
                <p>Название темы  по  сфере 1 Вопрос №4</p>
                <p>Название темы  по  сфере 1 Вопрос №5</p>
            </div>
            <div class="blok_sfera_2">
                <p>Название темы  по  сфере 2 Вопрос №2</p>
                <p>Название темы  по  сфере 2 Вопрос №3</p>
                <p>Название темы  по  сфере 2 Вопрос №1</p>
                <p>Название темы  по  сфере 2 Вопрос №4</p>
                <p>Название темы  по  сфере 2 Вопрос №5</p>
            </div>
            <div class="blok_sfera_3">
                <p>Название темы  по  сфере 3 Вопрос №1</p>
                <p>Название темы  по  сфере 3 Вопрос №2</p>
                <p>Название темы  по  сфере 3 Вопрос №3</p>
                <p>Название темы  по  сфере 3 Вопрос №4</p>
                <p>Название темы  по  сфере 3 Вопрос №5</p>
            </div>
            <div class="blok_sfera_4">
                <p>Название темы  по  сфере 4 Вопрос №1</p>
                <p>Название темы  по  сфере 4 Вопрос №2</p>
                <p>Название темы  по  сфере 4 Вопрос №3</p>
                <p>Название темы  по  сфере 4 Вопрос №4</p>
                <p>Название темы  по  сфере 4 Вопрос №5</p>
            </div>
            <div class="blok_sfera_5">
                <p>Название темы  по  сфере 5 Вопрос №1</p>
                <p>Название темы  по  сфере 5 Вопрос №2</p>
                <p>Название темы  по  сфере 5 Вопрос №3</p>
                <p>Название темы  по  сфере 5 Вопрос №4</p>
                <p>Название темы  по  сфере 5 Вопрос №5</p>
            </div>
        </div>
        <div class="tema_random">
            <div class="knopka_random">
                Случайная тема
            </div>
        </div>
        <div class="tema_vremy">
            Сколько времени осталось
        </div>  
    </main>
<script>
    const sfera = document.querySelectorAll(".sfera");
    for (let i=0, length = sfera.length; i < length; i++) {
        console.log(sfera);
    }
    sfera_vybr = () => {
        sfera.classList.toggle("vybrano");
    }
    sfera.addEventListener("click", sfera_vybr);
    </script>
</body>
</html>

voraa 10.06.2022 11:34

const sfera = document.querySelectorAll(".sfera");

Обратите внимание на All. All - значит все. Это же не один элемент, их много.
А раз их много, то нельзя делать

sfera.addEventListener("click", sfera_vybr);

addEventListener можно применять к 1 элементу, а не к массиву или списку.
Надо sfera пройти в цикле и к каждому элементу задать обработчик событий.

Так же нельзя делать
sfera.classList.toggle("vybrano");

.classList - это свойство элемента, а не списка.

PS Вы же уже давно пишете какие то программы. Почему Вы до сих пор не пользуетесь инструментами разработчика? Не смотрите в консоль. Там же все ошибки написаны обычно.

Дмитрий Луценко 10.06.2022 11:36

Смотрите, Вы селектором перебираете все ноды с классом sfera. У Вас эта переменная sfera хранит массив нод.

Если прям грубый пример-сравнение:
const sfera это как коробка с телефонами. Вам нужно подключить зарядку к выбранному Вами телефону, а Вы втыкаете эту зарядку прямо в коробку.

Значит, надо коробку открыть, взять выбранный Вами телефон и его зарядить.

На идеальность кода не претендую, но ошибки нет. Соответственно этот код поможет Вам доработать Ваш функционал

const sferes = document.querySelectorAll(".sfera");
    sferes.forEach(function(sfera){
	sfera.addEventListener("click", function (event){
	sfera.classList.toggle("vybrano");
	console.log(sfera);
    });
});

Сергей Ракипов 10.06.2022 11:39

voraa,
понял

Сергей Ракипов 10.06.2022 11:40

Дмитрий Луценко,
Спасибо, пример с коробкой хороший

рони 10.06.2022 12:04

Сергей Ракипов,
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        main{
            width: 280px;
            margin: 40px auto;
            font-size: 10px;
            font-family: Verdana, Geneva, Tahoma, sans-serif;
        }
        .tema_nastroika {
            margin: 20px 0px 20px 0px;
        }
        .nastroika_blok {
        }
        .vse {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .sbros {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .sfera_1 {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .sfera_2 {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .sfera_3 {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .sfera_4 {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .sfera_5 {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .vybrano{
            color: blueviolet;
            text-decoration: underline;
        }
        .tema_nazvanie{
            margin: 20px 0px 20px 0px;
            color: #0e9fff;
        }
        .tema_random {
            margin: 20px 0px 20px 0px;
        }
        .knopka_random{
            display: flex;
            justify-content: center;
            align-items: center;
            width: 280px;
            height: 70px;
            border: 1px solid #0e9fff;
            color: #0e9fff;
            cursor: pointer;
        }
        .knopka_random:hover{
            border: 1px solid blueviolet;
            color: blueviolet;
        }
        .tema_vremy {

        }

    </style>
</head>
<body>
    <main>
        <div class="tema_nastroika">
            <div class="nastroika_blok">
                <div class="sfera vse vybrano">Выбрать все</div>
                <div class="sfera sbros">Сброс</div>
                <div class="sfera sfera_1 vybrano">Сфера жизни 1</div>
                <div class="sfera sfera_2 vybrano">Сфера жизни 2</div>
                <div class="sfera sfera_3 vybrano">Сфера жизни 3</div>
                <div class="sfera sfera_4 vybrano">Сфера жизни 4</div>
                <div class="sfera sfera_5 vybrano">Сфера жизни 5</div>
            </div>
        </div>
        <div class="tema_nazvanie">
            <div class="blok_sfera_1">
                <p>Название темы  по  сфере 1 Вопрос №1</p>
                <p>Название темы  по  сфере 1 Вопрос №2</p>
                <p>Название темы  по  сфере 1 Вопрос №3</p>
                <p>Название темы  по  сфере 1 Вопрос №4</p>
                <p>Название темы  по  сфере 1 Вопрос №5</p>
            </div>
            <div class="blok_sfera_2">
                <p>Название темы  по  сфере 2 Вопрос №2</p>
                <p>Название темы  по  сфере 2 Вопрос №3</p>
                <p>Название темы  по  сфере 2 Вопрос №1</p>
                <p>Название темы  по  сфере 2 Вопрос №4</p>
                <p>Название темы  по  сфере 2 Вопрос №5</p>
            </div>
            <div class="blok_sfera_3">
                <p>Название темы  по  сфере 3 Вопрос №1</p>
                <p>Название темы  по  сфере 3 Вопрос №2</p>
                <p>Название темы  по  сфере 3 Вопрос №3</p>
                <p>Название темы  по  сфере 3 Вопрос №4</p>
                <p>Название темы  по  сфере 3 Вопрос №5</p>
            </div>
            <div class="blok_sfera_4">
                <p>Название темы  по  сфере 4 Вопрос №1</p>
                <p>Название темы  по  сфере 4 Вопрос №2</p>
                <p>Название темы  по  сфере 4 Вопрос №3</p>
                <p>Название темы  по  сфере 4 Вопрос №4</p>
                <p>Название темы  по  сфере 4 Вопрос №5</p>
            </div>
            <div class="blok_sfera_5">
                <p>Название темы  по  сфере 5 Вопрос №1</p>
                <p>Название темы  по  сфере 5 Вопрос №2</p>
                <p>Название темы  по  сфере 5 Вопрос №3</p>
                <p>Название темы  по  сфере 5 Вопрос №4</p>
                <p>Название темы  по  сфере 5 Вопрос №5</p>
            </div>
        </div>
        <div class="tema_random">
            <div class="knopka_random">
                Случайная тема
            </div>
        </div>
        <div class="tema_vremy">
            Сколько времени осталось
        </div>
    </main>
<script>

    const blok = document.querySelector(".nastroika_blok");
    const sfera = Array.from(blok.querySelectorAll(".sfera:nth-child(n + 3)"));

    sfera_vybr = ({target}) => {
        let vse = target.closest(".vse"), sbros = target.closest(".sbros"),
        el = sfera.includes(target);
        if(vse || sbros)sfera.forEach(e => vse ? e.classList.add("vybrano") : e.classList.remove("vybrano"))
        if(el) target.classList.toggle("vybrano");
    }
    blok.addEventListener("click", sfera_vybr);
    </script>
</body>
</html>

Сергей Ракипов 10.06.2022 12:04

По когда страница загружается впервые раз там выделены Выбрать все и все Сфера жизни а Сброс не выделен.

Как сделать что бы когда нажимаешь Сброс выделение у всех пропадает кроме Сброс и кнопка .knopka_random становится не доступна с надписью НУЖНО Выбрать хоть одну сферу

Ну и соответственно когда нажимаешь хоть на одну Сфера жизни то она выделяется и Сброс выделение пропадает. .knopka_random становится доступна с надписью по умолчанию.

А когда снова нажимаешь Выбрать все снова идет выделение как всех Сфера жизни .knopka_random становится доступна с надписью по умолчанию.

И все состоянии этих кнопок записались localStorage

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        main{
            width: 280px;
            margin: 40px auto;
            font-size: 10px;
            font-family: Verdana, Geneva, Tahoma, sans-serif;
        }
        .tema_nastroika {
            margin: 20px 0px 20px 0px;	
        }
        .nastroika_blok {
        }
        .vse {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .sbros {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .sfera_1 {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .sfera_2 {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .sfera_3 {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .sfera_4 {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .sfera_5 {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .vybrano{
            color: blueviolet;
            text-decoration: underline;
        }
        .tema_nazvanie{
            margin: 20px 0px 20px 0px;
            color: #0e9fff;
        }
        .tema_random {
            margin: 20px 0px 20px 0px;
        }
        .knopka_random{
            display: flex;
            justify-content: center;
            align-items: center;
            width: 280px;
            height: 70px;
            border: 1px solid #0e9fff;
            color: #0e9fff;
            cursor: pointer;
        }
        .knopka_random:hover{
            border: 1px solid blueviolet;
            color: blueviolet;
        }
        .tema_vremy {

        }
    </style>
</head>
<body>
    <main>
        <div class="tema_nastroika">
            <div class="nastroika_blok">
                <div class="sfera vse vybrano">Выбрать все</div>
                <div class="sfera sbros">Сброс</div>
                <div class="sfera sfera_1 vybrano">Сфера жизни 1</div>
                <div class="sfera sfera_2 vybrano">Сфера жизни 2</div>
                <div class="sfera sfera_3 vybrano">Сфера жизни 3</div>
                <div class="sfera sfera_4 vybrano">Сфера жизни 4</div>
                <div class="sfera sfera_5 vybrano">Сфера жизни 5</div>
            </div>
        </div>
        <div class="tema_nazvanie">
            <div class="blok_sfera_1">
                <p>Название темы  по  сфере 1 Вопрос №1</p>
                <p>Название темы  по  сфере 1 Вопрос №2</p>
                <p>Название темы  по  сфере 1 Вопрос №3</p>
                <p>Название темы  по  сфере 1 Вопрос №4</p>
                <p>Название темы  по  сфере 1 Вопрос №5</p>
            </div>
            <div class="blok_sfera_2">
                <p>Название темы  по  сфере 2 Вопрос №2</p>
                <p>Название темы  по  сфере 2 Вопрос №3</p>
                <p>Название темы  по  сфере 2 Вопрос №1</p>
                <p>Название темы  по  сфере 2 Вопрос №4</p>
                <p>Название темы  по  сфере 2 Вопрос №5</p>
            </div>
            <div class="blok_sfera_3">
                <p>Название темы  по  сфере 3 Вопрос №1</p>
                <p>Название темы  по  сфере 3 Вопрос №2</p>
                <p>Название темы  по  сфере 3 Вопрос №3</p>
                <p>Название темы  по  сфере 3 Вопрос №4</p>
                <p>Название темы  по  сфере 3 Вопрос №5</p>
            </div>
            <div class="blok_sfera_4">
                <p>Название темы  по  сфере 4 Вопрос №1</p>
                <p>Название темы  по  сфере 4 Вопрос №2</p>
                <p>Название темы  по  сфере 4 Вопрос №3</p>
                <p>Название темы  по  сфере 4 Вопрос №4</p>
                <p>Название темы  по  сфере 4 Вопрос №5</p>
            </div>
            <div class="blok_sfera_5">
                <p>Название темы  по  сфере 5 Вопрос №1</p>
                <p>Название темы  по  сфере 5 Вопрос №2</p>
                <p>Название темы  по  сфере 5 Вопрос №3</p>
                <p>Название темы  по  сфере 5 Вопрос №4</p>
                <p>Название темы  по  сфере 5 Вопрос №5</p>
            </div>
        </div>
        <div class="tema_random">
            <div class="knopka_random">
                Случайная тема
            </div>
        </div>
        <div class="tema_vremy">
            Сколько времени осталось
        </div>  
    </main>
<script>
let vse  = document.querySelector(".vse");

    const sferes = document.querySelectorAll(".sfera");
        sferes.forEach(function(sfera){
            sfera.addEventListener("click", function (event){
            sfera.classList.toggle("vybrano");
            console.log(sfera);

                if (vse.classList.contain("vybrano")) {
                    console.log("выбрано все");
                }
        });
    });

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

Сергей Ракипов 10.06.2022 12:06

рони,
Как вы это сделали? вы мысли умеете читать на расстоянии? я писал пост опубликовал а там ответ)

Сергей Ракипов 10.06.2022 12:15

рони,
Просто вот к чему тема, я могу создать как вывести случайные цифры это одна строка.
Но мне вот что нужно.
Когда выбраны Выбрать все то нужно вывести одну тему из все Название темы по сфере... рандомно. А если выбраны конкретные то сферы к примеру Сфера жизни 1 и Сфера жизни 5 то нужно вывести одну из этого блока, рандомно

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        main{
            width: 280px;
            margin: 40px auto;
            font-size: 10px;
            font-family: Verdana, Geneva, Tahoma, sans-serif;
        }
        .tema_nastroika {
            margin: 20px 0px 20px 0px;
        }
        .nastroika_blok {
        }
        .vse {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .sbros {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .sfera_1 {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .sfera_2 {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .sfera_3 {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .sfera_4 {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .sfera_5 {
            cursor: pointer;
            margin: 10px 0px 10px 0px
        }
        .vybrano{
            color: blueviolet;
            text-decoration: underline;
        }
        .tema_nazvanie{
            margin: 20px 0px 20px 0px;
            color: #0e9fff;
        }
        .tema_random {
            margin: 20px 0px 20px 0px;
        }
        .knopka_random{
            display: flex;
            justify-content: center;
            align-items: center;
            width: 280px;
            height: 70px;
            border: 1px solid #0e9fff;
            color: #0e9fff;
            cursor: pointer;
        }
        .knopka_random:hover{
            border: 1px solid blueviolet;
            color: blueviolet;
        }
        .tema_vremy {

        }
        .skryt > p {
            display: none;
        }
    </style>
</head>
<body>
    <main>
        <div class="tema_nastroika">
            <div class="nastroika_blok">
                <div class="sfera vse vybrano">Выбрать все</div>
                <div class="sfera sbros">Сброс</div>
                <div class="sfera sfera_1 vybrano">Сфера жизни 1</div>
                <div class="sfera sfera_2 vybrano">Сфера жизни 2</div>
                <div class="sfera sfera_3 vybrano">Сфера жизни 3</div>
                <div class="sfera sfera_4 vybrano">Сфера жизни 4</div>
                <div class="sfera sfera_5 vybrano">Сфера жизни 5</div>
            </div>
        </div>
        <div class="tema_nazvanie">
            <div class="skryt blok_sfera_1">
                <p>Название темы  по  сфере 1 Вопрос №1</p>
                <p>Название темы  по  сфере 1 Вопрос №2</p>
                <p>Название темы  по  сфере 1 Вопрос №3</p>
                <p>Название темы  по  сфере 1 Вопрос №4</p>
                <p>Название темы  по  сфере 1 Вопрос №5</p>
            </div>
            <div class="skryt blok_sfera_2">
                <p>Название темы  по  сфере 2 Вопрос №2</p>
                <p>Название темы  по  сфере 2 Вопрос №3</p>
                <p>Название темы  по  сфере 2 Вопрос №1</p>
                <p>Название темы  по  сфере 2 Вопрос №4</p>
                <p>Название темы  по  сфере 2 Вопрос №5</p>
            </div>
            <div class="skryt blok_sfera_3">
                <p>Название темы  по  сфере 3 Вопрос №1</p>
                <p>Название темы  по  сфере 3 Вопрос №2</p>
                <p>Название темы  по  сфере 3 Вопрос №3</p>
                <p>Название темы  по  сфере 3 Вопрос №4</p>
                <p>Название темы  по  сфере 3 Вопрос №5</p>
            </div>
            <div class="skryt blok_sfera_4">
                <p>Название темы  по  сфере 4 Вопрос №1</p>
                <p>Название темы  по  сфере 4 Вопрос №2</p>
                <p>Название темы  по  сфере 4 Вопрос №3</p>
                <p>Название темы  по  сфере 4 Вопрос №4</p>
                <p>Название темы  по  сфере 4 Вопрос №5</p>
            </div>
            <div class="skryt blok_sfera_5">
                <p>Название темы  по  сфере 5 Вопрос №1</p>
                <p>Название темы  по  сфере 5 Вопрос №2</p>
                <p>Название темы  по  сфере 5 Вопрос №3</p>
                <p>Название темы  по  сфере 5 Вопрос №4</p>
                <p>Название темы  по  сфере 5 Вопрос №5</p>
            </div>
        </div>
        <div class="tema_random">
            <div class="knopka_random">
                Случайная тема
            </div>
        </div>
        <div class="tema_vremy">
            Сколько времени осталось
        </div>
    </main>
<script>

    const blok = document.querySelector(".nastroika_blok");
    const sfera = Array.from(blok.querySelectorAll(".sfera:nth-child(n + 3)"));

    sfera_vybr = ({target}) => {
        let vse = target.closest(".vse"), sbros = target.closest(".sbros"),
        el = sfera.includes(target);
        if(vse || sbros)sfera.forEach(e => vse ? e.classList.add("vybrano") : e.classList.remove("vybrano"))
        if(el) target.classList.toggle("vybrano");
    }
    blok.addEventListener("click", sfera_vybr);
    </script>
</body>
</html>

Белый шум 10.06.2022 14:28

Цитата:

Сообщение от Сергей Ракипов (Сообщение 546055)
рони,
Как вы это сделали? вы мысли умеете читать на расстоянии? я писал пост опубликовал а там ответ)

Разница во времени :lol: :lol:

рони 10.06.2022 15:46

вопросник случайный выбор
 
Сергей Ракипов,

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        main {
            width: 280px;
            margin: 40px auto;
            font-size: 10px;
            font-family: Verdana, Geneva, Tahoma, sans-serif;
        }
        /* настройки */
        .parameters .active {
            color: #FF0000;
        }
        .parameters {
            cursor: pointer;
        }
        /* тема */
        .partition {
            border: 1px solid #0e9fff;
            text-align: center;
            border-radius: 8px;
        }
        .partition>p,
        .partition {
            display: none;
        }
        .partition>p.active,
        .partition.active {
            display: block;
        }
        /* кнопка выбора темы */
        .button_random {
            display: flex;
            justify-content: center;
            align-items: center;
            width: 280px;
            height: 70px;
            border: 1px solid #0e9fff;
            color: #0e9fff;
            cursor: pointer;
        }
        .button_random.active {
            border-color: #008000;
        }
        .button_random:hover {
            border: 1px solid blueviolet;
            color: blueviolet;
        }
        .button_random:after {
            content: "НУЖНО Выбрать хоть одну сферу"
        }
        .button_random.active:after {
            content: "Случайная тема"
        }
    </style>
</head>
<body>
    <main>
        <div class="control">
            <div class="parameters">
                <div class="all">Выбрать все</div>
                <div class="reset active">Сброс</div>
                <div class="sfera">Сфера жизни 1</div>
                <div class="sfera">Сфера жизни 2</div>
                <div class="sfera">Сфера жизни 3</div>
                <div class="sfera">Сфера жизни 4</div>
                <div class="sfera">Сфера жизни 5</div>
            </div>
        </div>
        <div class="sections">
            <div class="partition">
                <p>Название темы по сфере 1 Вопрос №1</p>
                <p>Название темы по сфере 1 Вопрос №2</p>
                <p>Название темы по сфере 1 Вопрос №3</p>
                <p>Название темы по сфере 1 Вопрос №4</p>
                <p>Название темы по сфере 1 Вопрос №5</p>
            </div>
            <div class="partition">
                <p>Название темы по сфере 2 Вопрос №2</p>
                <p>Название темы по сфере 2 Вопрос №3</p>
                <p>Название темы по сфере 2 Вопрос №1</p>
                <p>Название темы по сфере 2 Вопрос №4</p>
                <p>Название темы по сфере 2 Вопрос №5</p>
            </div>
            <div class="partition">
                <p>Название темы по сфере 3 Вопрос №1</p>
                <p>Название темы по сфере 3 Вопрос №2</p>
                <p>Название темы по сфере 3 Вопрос №3</p>
                <p>Название темы по сфере 3 Вопрос №4</p>
                <p>Название темы по сфере 3 Вопрос №5</p>
            </div>
            <div class="partition">
                <p>Название темы по сфере 4 Вопрос №1</p>
                <p>Название темы по сфере 4 Вопрос №2</p>
                <p>Название темы по сфере 4 Вопрос №3</p>
                <p>Название темы по сфере 4 Вопрос №4</p>
                <p>Название темы по сфере 4 Вопрос №5</p>
            </div>
            <div class="partition">
                <p>Название темы по сфере 5 Вопрос №1</p>
                <p>Название темы по сфере 5 Вопрос №2</p>
                <p>Название темы по сфере 5 Вопрос №3</p>
                <p>Название темы по сфере 5 Вопрос №4</p>
                <p>Название темы по сфере 5 Вопрос №5</p>
            </div>
        </div>
        <div class="title_random">
            <div class="button_random">
            </div>
        </div>
        <div class="title_time">
            Сколько времени осталось
        </div>
    </main>
    <script>
        const parameter = document.querySelector(".parameters");
        const buttons = Array.from(parameter.querySelectorAll(".sfera"));
        const reset = parameter.querySelector(".reset");
        const all = parameter.querySelector(".all");
        const random = document.querySelector(".button_random");
        const sections = Array.from(document.querySelectorAll(".partition"));

        const select = ({ target }) => {
            let method = "";
            if (target == reset) method = "remove";
            if (target == all) method = "add";
            if (method) buttons.forEach(button => button.classList[method]("active"))
            if (buttons.includes(target)) target.classList.toggle("active");
            let len = parameter.querySelectorAll(".sfera.active").length;
            all.classList.toggle("active", len == buttons.length);
            reset.classList.toggle("active", !len);
            random.classList.toggle("active", len);
            random_title(true);
        }

        const random_title = (reset) => {
            let arr = [];
            buttons.forEach((button, i) => {
                const active = button.classList.contains("active");
                const section = sections[i];
                section.classList.remove("active");
                const items = sections[i].querySelectorAll("p");
                items.forEach((item, i) => item.classList.remove("active"));
                const k = Math.trunc(Math.random() * items.length);
                const item = items[k]
                if(active) arr.push({section, item});

            })
            if(!reset){
               const j = Math.trunc(Math.random() * arr.length);
               const {section, item} = arr[j];
               item.classList.add("active");
               section.classList.add("active");
            }


        }

        parameter.addEventListener("click", select);

        random.addEventListener("click", ()=> {
        let active = random.classList.contains("active");
        if (!active) return;
        random_title();
        });
    </script>
</body>
</html>

Сергей Ракипов 10.06.2022 16:12

рони,
Я почему тему назвал сложного рандома, так как нужно сделать когда человек выбирает примеру из 1 и 3 сферы ему выдается только ОДНИ вопрос то есть из этих сфер не два вопроса, а ОДНА, случайно. И соответственно когда выбраны все сферы нужно из всех выбрать один случайны вопрос, а не 5.

Особенность в том что сфер может быть и 10 и 3, а в каждой сфере может быть и 2 вопроса и 200 вопросов. Но как я посмотрел код вроде он с этим справиться легко.

И еще можно что бы выбранные сферы .sfera .reset .all записывались localStorage, то есть человек зашел сегодня выбрал сферы к примеру 2 и 4 , нажал ему случайно дали вопрос и когда завтра зашел ему не нужно будет снова выбирать эти сферы 2 и 4.

И еще когда высвечивается надпись НУЖНО Выбрать хоть одну сферу, нужно, что бы кнопка была не кликабельна. Но это просто пожелание, так как там задумка в том что когда человек нажал на кнопку ему на 5 секунд заблокировали кнопку выбора темы и внизу таймер из 5 секунд. .title_time Это нужно для того что бы он как сумасшедший не перебирал темы.

рони 10.06.2022 16:20

Сергей Ракипов,
обновите страницу, и далее сами.

Сергей Ракипов 10.06.2022 16:27

рони,
Спасибо, да хорошо, я буду пробовать, как раз завтра выходные

рони 10.06.2022 20:02

Цитата:

Сообщение от Сергей Ракипов
И еще можно что бы выбранные сферы .sfera .reset .all записывались localStorage, то есть человек зашел сегодня выбрал сферы к примеру 2 и 4 , нажал ему случайно дали вопрос и когда завтра зашел ему не нужно будет снова выбирать эти сферы 2 и 4.

И еще когда высвечивается надпись НУЖНО Выбрать хоть одну сферу, нужно, что бы кнопка была не кликабельна. Но это просто пожелание, так как там задумка в том что когда человек нажал на кнопку ему на 5 секунд заблокировали кнопку выбора темы и внизу таймер из 5 секунд. .title_time Это нужно для того что бы он как сумасшедший не перебирал темы.

добавлено...
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        main {
            width: 280px;
            margin: 40px auto;
            font-size: 10px;
            font-family: Verdana, Geneva, Tahoma, sans-serif;
        }
        /* настройки */
        .parameters .active {
            color: #FF0000;
        }
        .parameters {
            cursor: pointer;
        }
        /* тема */
        .partition {
            border: 1px solid #0e9fff;
            text-align: center;
            border-radius: 8px;
        }
        .partition>p,
        .partition {
            display: none;
        }
        .partition>p.active,
        .partition.active {
            display: block;
        }
        /* кнопка выбора темы */
        .button_random {
            display: flex;
            justify-content: center;
            align-items: center;
            width: 280px;
            height: 70px;
            border: 1px solid #0e9fff;
            color: #0e9fff;
            cursor: pointer;
        }
        .button_random.active {
            border-color: #008000;
        }
        .button_random:hover {
            border: 1px solid blueviolet;
            color: blueviolet;
        }
        .button_random:after {
            content: "НУЖНО Выбрать хоть одну сферу";
        }
        .button_random.active:after {
            content: "Случайная тема";
        }
        .button_random.disabled:after {
            content:  attr(data-time)"s";
        }
    </style>
</head>
<body>
    <main>
        <div class="control">
            <div class="parameters">
                <div class="all">Выбрать все</div>
                <div class="reset active">Сброс</div>
                <div class="sfera">Сфера жизни 1</div>
                <div class="sfera">Сфера жизни 2</div>
                <div class="sfera">Сфера жизни 3</div>
                <div class="sfera">Сфера жизни 4</div>
                <div class="sfera">Сфера жизни 5</div>
            </div>
        </div>
        <div class="sections">
            <div class="partition">
                <p>Название темы по сфере 1 Вопрос №1</p>
                <p>Название темы по сфере 1 Вопрос №2</p>
                <p>Название темы по сфере 1 Вопрос №3</p>
                <p>Название темы по сфере 1 Вопрос №4</p>
                <p>Название темы по сфере 1 Вопрос №5</p>
            </div>
            <div class="partition">
                <p>Название темы по сфере 2 Вопрос №2</p>
                <p>Название темы по сфере 2 Вопрос №3</p>
                <p>Название темы по сфере 2 Вопрос №1</p>
                <p>Название темы по сфере 2 Вопрос №4</p>
                <p>Название темы по сфере 2 Вопрос №5</p>
            </div>
            <div class="partition">
                <p>Название темы по сфере 3 Вопрос №1</p>
                <p>Название темы по сфере 3 Вопрос №2</p>
                <p>Название темы по сфере 3 Вопрос №3</p>
                <p>Название темы по сфере 3 Вопрос №4</p>
                <p>Название темы по сфере 3 Вопрос №5</p>
            </div>
            <div class="partition">
                <p>Название темы по сфере 4 Вопрос №1</p>
                <p>Название темы по сфере 4 Вопрос №2</p>
                <p>Название темы по сфере 4 Вопрос №3</p>
                <p>Название темы по сфере 4 Вопрос №4</p>
                <p>Название темы по сфере 4 Вопрос №5</p>
            </div>
            <div class="partition">
                <p>Название темы по сфере 5 Вопрос №1</p>
                <p>Название темы по сфере 5 Вопрос №2</p>
                <p>Название темы по сфере 5 Вопрос №3</p>
                <p>Название темы по сфере 5 Вопрос №4</p>
                <p>Название темы по сфере 5 Вопрос №5</p>
            </div>
        </div>
        <div class="title_random" >
            <div class="button_random">
            </div>
        </div>
    </main>
    <script>
        const parameter = document.querySelector(".parameters");
        const buttons = Array.from(parameter.querySelectorAll(".sfera"));
        const reset = parameter.querySelector(".reset");
        const all = parameter.querySelector(".all");
        const random = document.querySelector(".button_random");
        const sections = Array.from(document.querySelectorAll(".partition"));
        const duration = 10000;
        let timer, beginTime;
        const loop = time => {
        const end = time - beginTime ;
         if(end >= duration) {
           random.classList.add("active");
           random.classList.remove("disabled");
         }
         else {
         random.dataset.time = Math.trunc((duration - end)/1000);
         timer = requestAnimationFrame(loop);
         }


        }
        const select = ({ target }) => {
            let method = "";
            if (target == reset) method = "remove";
            if (target == all) method = "add";
            if (method) buttons.forEach(button => button.classList[method]("active"))
            if (buttons.includes(target)) target.classList.toggle("active");
            let len = parameter.querySelectorAll(".sfera.active").length;
            all.classList.toggle("active", len == buttons.length);
            reset.classList.toggle("active", !len);
            random.classList.toggle("active", len);
            random.classList.remove("disabled");
            random_title(true);
        }

        const random_title = (reset) => {
            cancelAnimationFrame(timer);
            let arr = [];
            buttons.forEach((button, i) => {
                const active = button.classList.contains("active");
                const section = sections[i];
                section.classList.remove("active");
                const items = sections[i].querySelectorAll("p");
                items.forEach((item, i) => item.classList.remove("active"));
                const k = Math.trunc(Math.random() * items.length);
                const item = items[k];
                if(active) arr.push({i, item});

            })
            let arr_section = arr.map(({i}) => i);
            arr_section = JSON.stringify(arr_section);
            localStorage.setItem("arr_section", arr_section);

            if(!reset){
               const j = Math.trunc(Math.random() * arr.length);
               const {i, item} = arr[j];
               item.classList.add("active");
               sections[i].classList.add("active");
               random.classList.remove("active");
               random.classList.add("disabled");
               beginTime = performance.now();
               timer = requestAnimationFrame(loop);
            }


        }
        let arr_section = localStorage.getItem("arr_section") || "[]";
        arr_section = JSON.parse(arr_section);
        arr_section.forEach(i => buttons[i].classList.add("active"));
        select({ target : null});

        parameter.addEventListener("click", select);

        random.addEventListener("click", ()=> {
        let active = random.classList.contains("active");
        if (!active) return;
        random_title();
        });
    </script>
</body>
</html>

Сергей Ракипов 11.06.2022 08:24

рони,
:) спасибо с не кликабельностью кнопки я решил проблему это не сложно было в css

рони 11.06.2022 08:27

Цитата:

Сообщение от Сергей Ракипов
с не кликабельностью кнопки

Цитата:

Сообщение от рони
if (!active) return;

:-?

Сергей Ракипов 11.06.2022 08:33

А вот сделал визуально кнопку не кликабельной во время таймера. А можно сделать еще что бы и .parameters > div тоже были не кликабельны ну значок cursor: not-allowed;
Я пробовал вот тут это как то сделать
const loop = time => {
            const end = time - beginTime;
            if ( end >= duration ) {
                random.classList.add( "active" );
                random.classList.remove( "disabled" );
            } else {
                random.dataset.time = Math.trunc( ( duration - end ) / 1000 );
                timer = requestAnimationFrame( loop );
            }


        }


Но либо я синтекс не правильно писал либо вообще не туда



<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        main {
            width: 280px;
            margin: 40px auto;
            font-size: 10px;
            font-family: Verdana, Geneva, Tahoma, sans-serif;
        }

        /* настройки */
        .parameters .active {
            color: #FF0000;
        }

        .parameters {
            cursor: pointer;
        }
        .parameters > div {
            margin: 20px 0px 20px 0px;
        }
        /* тема */
        .partition {
            border: 1px solid #0e9fff;
            text-align: center;
            border-radius: 8px;
        }

        .partition>p,
        .partition {
            display: none;
        }

        .partition>p.active,
        .partition.active {
            display: block;
        }

        /* кнопка выбора темы */
        .button_random {
            display: flex;
            justify-content: center;
            align-items: center;
            width: 280px;
            height: 70px;
            border: 1px solid #0e9fff;
            color: #0e9fff;
            cursor: pointer;
        }

        .button_random.active {
            border: 1px solid #0e9fff;
            border-color: #008000;
        }

        .button_random:hover {
            color: blueviolet;
        }

        .button_random:after {
            display: flex;
            justify-content: center;
            align-items: center;
            content: "НУЖНО Выбрать хоть одну сферу";
            background-color: #fff;
            border: 1px solid #0e9fff;
            width: 280px;
            height: 70px;
            cursor: not-allowed;
        }
        .button_random:hover::after {
            display: flex;
            justify-content: center;
            align-items: center;
            content: "НУЖНО Выбрать хоть одну сферу";
            background-color: #fff;
            width: 280px;
            height: 70px;
            cursor: not-allowed;
            border: 1px solid #0e9fff;
            color: #0e9fff;
        }

        .button_random.active:after {
            content: "Случайная тема";
            cursor: pointer;
        }

        .button_random.disabled:after {
            content:"Нужно подождать " attr(data-time) " секунд";
        }
    </style>
</head>

<body>
    <main>
        <div class="control">
            <div class="parameters">
                <div class="all">Выбрать все</div>
                <div class="reset active">Сброс</div>
                <div class="sfera">Сфера жизни 1</div>
                <div class="sfera">Сфера жизни 2</div>
                <div class="sfera">Сфера жизни 3</div>
                <div class="sfera">Сфера жизни 4</div>
                <div class="sfera">Сфера жизни 5</div>
            </div>
        </div>
        <div class="sections">
            <div class="partition">
                <p>Название темы по сфере 1 Вопрос №1</p>
                <p>Название темы по сфере 1 Вопрос №2</p>
                <p>Название темы по сфере 1 Вопрос №3</p>
                <p>Название темы по сфере 1 Вопрос №4</p>
                <p>Название темы по сфере 1 Вопрос №5</p>
            </div>
            <div class="partition">
                <p>Название темы по сфере 2 Вопрос №2</p>
                <p>Название темы по сфере 2 Вопрос №3</p>
                <p>Название темы по сфере 2 Вопрос №1</p>
                <p>Название темы по сфере 2 Вопрос №4</p>
                <p>Название темы по сфере 2 Вопрос №5</p>
            </div>
            <div class="partition">
                <p>Название темы по сфере 3 Вопрос №1</p>
                <p>Название темы по сфере 3 Вопрос №2</p>
                <p>Название темы по сфере 3 Вопрос №3</p>
                <p>Название темы по сфере 3 Вопрос №4</p>
                <p>Название темы по сфере 3 Вопрос №5</p>
            </div>
            <div class="partition">
                <p>Название темы по сфере 4 Вопрос №1</p>
                <p>Название темы по сфере 4 Вопрос №2</p>
                <p>Название темы по сфере 4 Вопрос №3</p>
                <p>Название темы по сфере 4 Вопрос №4</p>
                <p>Название темы по сфере 4 Вопрос №5</p>
            </div>
            <div class="partition">
                <p>Название темы по сфере 5 Вопрос №1</p>
                <p>Название темы по сфере 5 Вопрос №2</p>
                <p>Название темы по сфере 5 Вопрос №3</p>
                <p>Название темы по сфере 5 Вопрос №4</p>
                <p>Название темы по сфере 5 Вопрос №5</p>
            </div>
        </div>
        <div class="title_random">
            <div class="button_random">
            </div>
        </div>
    </main>
    <script>
        const parameter = document.querySelector( ".parameters" );
        const buttons = Array.from( parameter.querySelectorAll( ".sfera" ) );
        const reset = parameter.querySelector( ".reset" );
        const all = parameter.querySelector( ".all" );
        const random = document.querySelector( ".button_random" );
        const sections = Array.from( document.querySelectorAll( ".partition" ) );
        const duration = 4000;
        let timer, beginTime;
        const loop = time => {
            const end = time - beginTime;
            if ( end >= duration ) {
                random.classList.add( "active" );
                random.classList.remove( "disabled" );
            } else {
                random.dataset.time = Math.trunc( ( duration - end ) / 1000 );
                timer = requestAnimationFrame( loop );
            }


        }
        const select = ( {
            target
        } ) => {
            let method = "";
            if ( target == reset ) method = "remove";
            if ( target == all ) method = "add";
            if ( method ) buttons.forEach( button => button.classList[ method ]( "active" ) )
            if ( buttons.includes( target ) ) target.classList.toggle( "active" );
            let len = parameter.querySelectorAll( ".sfera.active" ).length;
            all.classList.toggle( "active", len == buttons.length );
            reset.classList.toggle( "active", !len );
            random.classList.toggle( "active", len );
            random.classList.remove( "disabled" );
            random_title( true );
        }

        const random_title = ( reset ) => {
            cancelAnimationFrame( timer );
            let arr = [];
            buttons.forEach( ( button, i ) => {
                const active = button.classList.contains( "active" );
                const section = sections[ i ];
                section.classList.remove( "active" );
                const items = sections[ i ].querySelectorAll( "p" );
                items.forEach( ( item, i ) => item.classList.remove( "active" ) );
                const k = Math.trunc( Math.random() * items.length );
                const item = items[ k ];
                if ( active ) arr.push( {
                    i,
                    item
                } );

            } )
            let arr_section = arr.map( ( {
                i
            } ) => i );
            arr_section = JSON.stringify( arr_section );
            localStorage.setItem( "arr_section", arr_section );

            if ( !reset ) {
                const j = Math.trunc( Math.random() * arr.length );
                const {
                    i,
                    item
                } = arr[ j ];
                item.classList.add( "active" );
                sections[ i ].classList.add( "active" );
                random.classList.remove( "active" );
                random.classList.add( "disabled" );
                beginTime = performance.now();
                timer = requestAnimationFrame( loop );
            }


        }
        let arr_section = localStorage.getItem( "arr_section" ) || "[]";
        arr_section = JSON.parse( arr_section );
        arr_section.forEach( i => buttons[ i ].classList.add( "active" ) );
        select( {
            target: null
        } );

        parameter.addEventListener( "click", select );

        random.addEventListener( "click", () => {
            let active = random.classList.contains( "active" );
            if ( !active ) return;
            random_title();
        } );
    </script>
</body>

</html>

Сергей Ракипов 11.06.2022 08:34

Цитата:

Сообщение от рони (Сообщение 546072)
:-?

Это где?

Сергей Ракипов 11.06.2022 09:15

Просто по факту таймер сбрасывает нажатие .parameters > div

рони 11.06.2022 13:28

Цитата:

Сообщение от Сергей Ракипов
таймер сбрасывает нажатие .parameters > div

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        main {
            width: 280px;
            margin: 40px auto;
            font-size: 10px;
            font-family: Verdana, Geneva, Tahoma, sans-serif;
        }
        /* настройки */
        .parameters .active {
            color: #FF0000;
        }
        .parameters {
            cursor: pointer;
        }
        /* тема */
        .partition {
            border: 1px solid #0e9fff;
            text-align: center;
            border-radius: 8px;
        }
        .partition>p,
        .partition {
            display: none;
        }
        .partition>p.active,
        .partition.active {
            display: block;
        }
        /* кнопка выбора темы */
        .button_random {
            display: flex;
            justify-content: center;
            align-items: center;
            width: 280px;
            height: 70px;
            border: 1px solid #0e9fff;
            color: #0e9fff;
            cursor: pointer;
        }
        .button_random.active {
            border-color: #008000;
        }
        .button_random:hover {
            border: 1px solid blueviolet;
            color: blueviolet;
        }
        .button_random:after {
            content: "НУЖНО Выбрать хоть одну сферу";
        }
        .button_random.active:after {
            content: "Случайная тема";
        }
        .button_random.disabled:after {
            content:  attr(data-time)"s";
        }
    </style>
</head>
<body>
    <main>
        <div class="control">
            <div class="parameters">
                <div class="all">Выбрать все</div>
                <div class="reset active">Сброс</div>
                <div class="sfera">Сфера жизни 1</div>
                <div class="sfera">Сфера жизни 2</div>
                <div class="sfera">Сфера жизни 3</div>
                <div class="sfera">Сфера жизни 4</div>
                <div class="sfera">Сфера жизни 5</div>
            </div>
        </div>
        <div class="sections">
            <div class="partition">
                <p>Название темы по сфере 1 Вопрос №1</p>
                <p>Название темы по сфере 1 Вопрос №2</p>
                <p>Название темы по сфере 1 Вопрос №3</p>
                <p>Название темы по сфере 1 Вопрос №4</p>
                <p>Название темы по сфере 1 Вопрос №5</p>
            </div>
            <div class="partition">
                <p>Название темы по сфере 2 Вопрос №2</p>
                <p>Название темы по сфере 2 Вопрос №3</p>
                <p>Название темы по сфере 2 Вопрос №1</p>
                <p>Название темы по сфере 2 Вопрос №4</p>
                <p>Название темы по сфере 2 Вопрос №5</p>
            </div>
            <div class="partition">
                <p>Название темы по сфере 3 Вопрос №1</p>
                <p>Название темы по сфере 3 Вопрос №2</p>
                <p>Название темы по сфере 3 Вопрос №3</p>
                <p>Название темы по сфере 3 Вопрос №4</p>
                <p>Название темы по сфере 3 Вопрос №5</p>
            </div>
            <div class="partition">
                <p>Название темы по сфере 4 Вопрос №1</p>
                <p>Название темы по сфере 4 Вопрос №2</p>
                <p>Название темы по сфере 4 Вопрос №3</p>
                <p>Название темы по сфере 4 Вопрос №4</p>
                <p>Название темы по сфере 4 Вопрос №5</p>
            </div>
            <div class="partition">
                <p>Название темы по сфере 5 Вопрос №1</p>
                <p>Название темы по сфере 5 Вопрос №2</p>
                <p>Название темы по сфере 5 Вопрос №3</p>
                <p>Название темы по сфере 5 Вопрос №4</p>
                <p>Название темы по сфере 5 Вопрос №5</p>
            </div>
        </div>
        <div class="title_random" >
            <div class="button_random">
            </div>
        </div>
    </main>
    <script>
        const parameter = document.querySelector(".parameters");
        const buttons = Array.from(parameter.querySelectorAll(".sfera"));
        const reset = parameter.querySelector(".reset");
        const all = parameter.querySelector(".all");
        const random = document.querySelector(".button_random");
        const sections = Array.from(document.querySelectorAll(".partition"));
        const duration = 10000;
        let timer, beginTime;
        const loop = time => {
        const end = time - beginTime ;
         if(end >= duration) {
           random.classList.add("active");
           random.classList.remove("disabled");
         }
         else {
         random.dataset.time = Math.trunc((duration - end)/1000);
         timer = requestAnimationFrame(loop);
         }


        }
        const select = ({ target }) => {
            let disabled = random.classList.contains("disabled");
            if (disabled && target) return;
            let method = "";
            if (target == reset) method = "remove";
            if (target == all) method = "add";
            if (method) buttons.forEach(button => button.classList[method]("active"))
            if (buttons.includes(target)) target.classList.toggle("active");
            let len = parameter.querySelectorAll(".sfera.active").length;
            all.classList.toggle("active", len == buttons.length);
            reset.classList.toggle("active", !len);
            random.classList.toggle("active", len);
            random.classList.remove("disabled");
            random_title(true);
        }

        const random_title = (reset) => {
            cancelAnimationFrame(timer);
            let arr = [];
            buttons.forEach((button, i) => {
                const active = button.classList.contains("active");
                const section = sections[i];
                section.classList.remove("active");
                const items = sections[i].querySelectorAll("p");
                items.forEach((item, i) => item.classList.remove("active"));
                const k = Math.trunc(Math.random() * items.length);
                const item = items[k];
                if(active) arr.push({i, item});

            })
            let arr_section = arr.map(({i}) => i);
            arr_section = JSON.stringify(arr_section);
            localStorage.setItem("arr_section", arr_section);

            if(!reset){
               const j = Math.trunc(Math.random() * arr.length);
               const {i, item} = arr[j];
               item.classList.add("active");
               sections[i].classList.add("active");
               random.classList.remove("active");
               random.classList.add("disabled");
               beginTime = performance.now();
               timer = requestAnimationFrame(loop);
            }


        }
        let arr_section = localStorage.getItem("arr_section") || "[]";
        arr_section = JSON.parse(arr_section);
        arr_section.forEach(i => buttons[i].classList.add("active"));
        select({ target : null});

        parameter.addEventListener("click", select);

        random.addEventListener("click", ()=> {
        let active = random.classList.contains("active");
        if (!active) return;
        random_title();
        });
    </script>
</body>
</html>

Сергей Ракипов 11.06.2022 14:59

рони,
Как всегда идеально! спасибо


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