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

    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 занимают больше места), то лучше проверить влезают ли буквы даже если длина строки не менялась.
    Ответ написан
    Комментировать
  • Как реализовать такую же трапецию на CSS с закруглёнными углами?

    KarnaDev
    @KarnaDev
    Frontend developer
    Самый простой вариант, наверное, сделать SVG.

    Немного корявый способ на css - наложить две фигуры друг на друга.
    <div class="container">
      <div class="shape box"></div>
      <div class="shape parallelogram"></div>
    </div>

    .shape {
      width: 1000px;
      height: 100px;
      background-color: grey;
      position: relative;
    }
    .box {
      border-radius: 20px 20px 0 0;
      z-index: 1;
    }
    .parallelogram {
      transform: skewY(-4deg);
      border-radius: 0 0 20px 20px;
      overflow: hidden;
      margin-top: -35px; /* степень перекрытия объектов*/
      z-index: 2;
    }
    Ответ написан
    Комментировать
  • Почему не работает проверка ответов?

    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 комментария
  • Можно ли задать свой шаблон фрейма в фигме?

    KarnaDev
    @KarnaDev
    Frontend developer
    К этой панели добавить шаблоны произвольных размеров, увы, нельзя

    Можно сделать шаблон для отдельного проекта:
    1. Создать нужный фрейм с заголовками, сеткой и т.п.
    2. Правой кнопкой, выбрать create component
    3. Теперь он доступен в Assets, можно его бесконечно переиспользовать
    4. Или создать библиотеку компонентов (pro подписка) чтобы использовать этот шаблон/набор шаблонов в разных проектах
    Ответ написан
    Комментировать
  • Как создать новый 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 комментарий
  • Как поставить картинку на один уровень с текстом?

    KarnaDev
    @KarnaDev
    Frontend developer
    .user-avatar {
      vertical-align: middle;
      width: 30px;
      height: 30px;
      margin-right: 10px; /* расстояние между иконкой и именем пользователя  */ 
    }
    Ответ написан
  • Как правильно задать градиент?

    KarnaDev
    @KarnaDev
    Frontend developer
    Можно попробовать так
    div {
      border-radius: 32px;
      height: 515px;
      max-width: 1228px;
      width: 100%;
      background: radial-gradient(circle at bottom left, 
        rgb(80, 71, 64), 
        rgb(92, 67, 89) 16.363%, 
        rgb(56, 43, 63) 42.194%, 
        rgb(23, 23, 23) 100%);
      /* Градиент начинается от нижнего левого угла и идет к правому верхнему углу */
    }

    radial-gradient позволяет указать начальную точку градиента. В вашем случае circle at bottom left, чтобы установить начало в нижнем левом углу
    Ответ написан
    Комментировать