Ответы пользователя по тегу JavaScript
  • Как динамически уменьшать размер шрифта и увеличивать его?

    KarnaDev
    @KarnaDev
    Frontend developer
    У вас не сохранен исходный размер. Он нам нужен чтоб знать до каких пределов увеличивать.
    Допустим, нам надо проверить длину поля после ввода и удаления символов.
    document.addEventListener('DOMContentLoaded', () => {
        const inputElement = document.querySelector("input");
        const originalFontSize = parseFloat(getComputedStyle(inputElement).fontSize);
        let currentSize = originalFontSize;
        // переменная для последнего значения поля input
        let lastValue = '';
    
        inputElement.addEventListener("input", () => {
            const value = inputElement.value;
    
            if (value.length > lastValue.length) {
                // добавлен символ
                if (inputElement.scrollWidth > inputElement.clientWidth) {
                    // текст не помещается, уменьшаем шрифт
                    currentSize -= 1;
                }
            } else if (value.length < lastValue.length) {
                // удалён символ
                if (currentSize < originalFontSize) {
                    // восстанавливаем размер шрифта до начального
                    currentSize += 1;
                }
            }
    
            inputElement.style.fontSize = `${currentSize}px`;
            // console.log(`Размер шрифта: ${currentSize}px`);
            lastValue = value;
        });
    
        // инициализация размера шрифта
        inputElement.style.fontSize = `${originalFontSize}px`;
    });

    Если ширина поля ввода фиксированная, то примерно так. Если она динамическая, надо добавить проверку на ширину input
    В обработчик можно еще добавить value.length === lastValue.length (например, для замены моноширинного символа или копипаста с цифрами). Но если у вас символы разной ширины (например, Ш и W занимают больше места), то лучше проверить влезают ли буквы даже если длина строки не менялась.
    Ответ написан
    Комментировать
  • Почему не работает проверка ответов?

    KarnaDev
    @KarnaDev
    Frontend developer
    У вас в разметке на 26 строке не закрытый li и на 121 строке лишний div

    Можно немного изменить и отделить структуру от логики:
    // ждем пока контент будет полностью загружен
    document.addEventListener('DOMContentLoaded', function() {
      // находим кнопку и добавляем обработчик
      const applyButton = document.getElementById('apply');
      applyButton.addEventListener('click', function() {
          summary();
      });
    
      function summary() {
          let questions = document.querySelectorAll('.question');
          let score = 0;
          let rightAnswers = ["a_2", "a_5", "a_9", "a_10", "a_13", "a_18", "a_19", "a_24", "a_27", "a_28"];
    
          questions.forEach(function(question, index) {
              let chosenAnswer = question.querySelector("input[type='radio']:checked");
              if (chosenAnswer && chosenAnswer.id === rightAnswers[index]) {
                  score++;
              }
    
              console.log("Выбранный ответ: " + (chosenAnswer ? chosenAnswer.parentNode.textContent : "Нет ответа выбрано"));
              console.log("Правильный ответ: " + rightAnswers[index]);
              console.log("Очки: " + score);
          });
          alert("Количество правильных ответов: " + score);
      }
    });

    из html убираем onclick="summary();"
    Ответ написан
    Комментировать
  • Почему не всегда изменяется изображение в блоке при наведении указателя мыши?

    KarnaDev
    @KarnaDev
    Frontend developer
    Я бы предложила небольшой рефакторинг, чтоб сделать код более читаемым
    // объект с путями к изображениям для нормального и hover состояний чтоб не засорять основной код ссылками
    // предполагаю, что в сумме у вас их 6, по 2 на каждый элемент motionPlitka
    const imageSources = {
      preim1: {
        normal: "https://i.ibb.co/ZdHgXTm/green.png",
        hover: "https://i.ibb.co/g6mNxm8/white.png"
      },
      preim2: {
        normal: "https://i.postimg.cc/6pKDm5Lq/green2.png",
        hover: "https://i.postimg.cc/2SPBDMy1/white2.png"
      },
      preim3: {
        normal: "https://ltdfoto.ru/images/2024/06/13/green3.png",
        hover: "https://ltdfoto.ru/images/2024/06/13/white3.png"
      }
    };
    
    // выносим функцию изменения картинки в зависимости от состояния (normal или hover)
    const setImageSrc = (element, state) => {
      // находим элемент <img> внутри элемента motionPlitka, на котором у нас курсор
      const img = element.querySelector("img"); 
    
      // извлекаем список классов элемента и ищем класс, который есть в imageSources
      // в вашем случае preim1, preim2 или preim3
      const className = [...element.classList].find(cls => imageSources[cls]); 
    
      // меняем src элемента <img> на значение из объекта imageSources для нужного класса и состояния
      img.src = imageSources[className][state];
    };
    
    // получаем все элементы .motionPlitka и добавляем обработчики
    document.querySelectorAll(".motionPlitka").forEach(elem => {
      // при наведении мыши вызываем setImageSrc с состоянием hover
      elem.addEventListener('mouseenter', () => setImageSrc(elem, 'hover'));
      // при уходе мыши вызываем setImageSrc с состоянием normal
      elem.addEventListener('mouseleave', () => setImageSrc(elem, 'normal'));
    });

    Здесь mouseenter и mouseleave срабатывают один раз при входе и выходе мыши из родительского элемента motionPlitka. В вашем варианте обработчики срабатывали на действия с дочерними элемементами тоже
    Ответ написан
    2 комментария
  • Как создать новый object из key и value?

    KarnaDev
    @KarnaDev
    Frontend developer
    Вы в index используете Object.assign для создания объекта, но не севсем правильно оборачиваете результат в map.
    Я бы, честно говоря, заменила на reduce, семантически он там логичнее:
    } else if (Array.isArray(value)) {
      return value.reduce((acc, key) => {
        acc[key] = indexs[key];
        return acc;
      }, {});
    }

    И вначале, где indexs создаете, можно тоже через reduce и c константой
    const indexs = index.reduce((acc, key, i) => {
      acc[key] = arr[i];
      return acc;
    }, {});

    Еще я бы предложила отказаться от let arrs и indexs, вы их не переиспользуете, почему бы не сразу const
    Ответ написан
    1 комментарий