Логово верстальщика – Telegram
Логово верстальщика
8.07K subscribers
996 photos
48 videos
4 files
1.7K links
Канал для верстальщиков с инфой о HTML и CSS, а так же JavaScript на уровне верстальщиков.

Канал на бирже - https://telega.in/c/webdevlair

По вопросам рекламы или разработки: @g_abashkin
Download Telegram
🗓 Как написать Google Calendar на коленке? Обзор FullCallendar

Статья рассказывает о создании раздела с календарем и задачами с использованием библиотеки FullCalendar. Разбираются её возможности, преимущества и опыт интеграции для внутренних проектов.

Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
2
👩‍💻 Валидация формы с обратной связью

Создайте форму с одним полем ввода для имени и кнопкой "Отправить". При отправке формы выполните следующие условия:

1. Если поле пустое, отобразите сообщение об ошибке под полем.
2. Если поле заполнено, отобразите сообщение "Форма успешно отправлена!".
3. Сообщение об ошибке исчезает при вводе текста.

Решение задачи🔽

<form id="myForm">
<input type="text" id="nameInput" placeholder="Введите имя" />
<button type="submit">Отправить</button>
<p id="error" style="color: red; display: none;">Поле не должно быть пустым</p>
</form>
<p id="success" style="color: green; display: none;">Форма успешно отправлена!</p>

const form = document.getElementById('myForm');
const nameInput = document.getElementById('nameInput');
const error = document.getElementById('error');
const success = document.getElementById('success');

form.addEventListener('submit', (e) => {
e.preventDefault();
if (nameInput.value.trim() === '') {
error.style.display = 'block';
success.style.display = 'none';
} else {
error.style.display = 'none';
success.style.display = 'block';
nameInput.value = '';
}
});

nameInput.addEventListener('input', () => {
if (nameInput.value.trim() !== '') {
error.style.display = 'none';
}
});
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍21
🤔 Народный браузер — каким он мог бы быть?

Статья раскрывает идеи и обсуждения, связанные с развитием сборки Хромиума Ultimatum. Автор стремится понять реальные запросы пользователей и обсудить востребованные функции.

Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Playbook CSS scroll animation w/ subgrid

Сцена с интересной реализацией анимированного скролла. Сделана на Svg, CSS и JavaScript.

Открыть код...
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2
➡️ Разбираем стандарты нейминга на примерах

Статья рассматривает случаи стандартизированного нейминга переменных и функций. Примеры сгруппированы по категориям для лучшей наглядности и помогут улучшить читаемость и согласованность кода.

Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
➡️ Frontend в 2025 году: тренды, которые изменят разработку

В этой статье мы подводим итоги 2024 года и делимся нашими прогнозами на 2025 год. Приводим мнение трех экспертов по ключевым трендам фронтенд‑разработки и фреймворков, которые будут актуальными в следующем году.

Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Переключение видимости пароля

Создайте поле для ввода пароля и кнопку "Показать/Скрыть". При нажатии на кнопку символы пароля должны переключаться между скрытым (type="password") и видимым (type="text") состоянием.

Требования:

Кнопка переключает тип поля ввода пароля между "password" и "text".
Текст кнопки меняется в зависимости от текущего состояния видимости пароля.

Решение задачи🔽

<input type="password" id="password" placeholder="Введите пароль">
<button id="toggleBtn">Показать</button>

const password = document.getElementById('password');
const toggleBtn = document.getElementById('toggleBtn');

toggleBtn.addEventListener('click', () => {
const isHidden = password.type === 'password';
password.type = isHidden ? 'text' : 'password';
toggleBtn.textContent = isHidden ? 'Скрыть' : 'Показать';
});
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1
⚙️ Как устроен Next.js: разбираем ключевые особенности фреймворка на примере небольшого pet-проекта

Статья знакомит с фреймворком Next.js, рекомендованным командой React для новых проектов. На примере pet-проекта рассматриваются базовые возможности и преимущества использования Next.js.

Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Confetti Button

Кнопка с вылетающими конфетти при нажатии. Сделана на CSS и JavaScript.

Открыть код...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
⚙️ Что такое event delegation в JavaScript и зачем его использовать?

Event delegation — это техника, позволяющая обрабатывать события на родительском элементе вместо установки обработчиков на каждый дочерний элемент. Это особенно полезно, если дочерние элементы динамически добавляются или их много.

➡️ Пример:

// Родительский элемент
const parent = document.querySelector('#parent');

// Используем делегирование
parent.addEventListener('click', (event) => {
if (event.target.matches('.child')) {
console.log(`Клик по элементу: ${event.target.textContent}`);
}
});

// Динамическое добавление дочерних элементов
const newChild = document.createElement('div');
newChild.className = 'child';
newChild.textContent = 'Новый элемент';
parent.appendChild(newChild);


🗣️ В этом примере обработчик событий на родительском элементе обрабатывает клики по дочерним элементам, включая добавленные динамически. Это упрощает код и повышает производительность.


🖥 Подробнее тут
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
👩‍💻 Как мы мигрируем с JQuery на React

Обсуждаем миграцию с jQuery на React. В статье — реальный опыт, причины перехода, основные шаги и способы преодоления сложностей.

Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
👩‍💻 Фильтрация списка через поле ввода

Создайте поле ввода и список элементов. При вводе текста в поле должны отображаться только те элементы списка, которые содержат введённый текст. Игнорируйте регистр символов.

Требования:

При вводе текста выполняется фильтрация: сравниваем введённую строку с каждым элементом списка.
Элементы, соответствующие фильтру, остаются видимыми, остальные скрываются.

Решение задачи🔽

<input type="text" id="filterInput" placeholder="Фильтр...">
<ul id="items">
<li>Яблоко</li>
<li>Банан</li>
<li>Апельсин</li>
<li>Груша</li>
</ul>

const input = document.getElementById('filterInput');
const listItems = document.querySelectorAll('
#items li');

input.addEventListener('input', () => {
const filter = input.value.toLowerCase();
listItems.forEach(li => {
li.style.display = li.textContent.toLowerCase().includes(filter) ? '' : 'none';
});
});
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1
👩‍💻 Новые возможности CSS за 2024 год

Центрирование без боли, улучшенный тёмный режим, анимация скрытых элементов и даже решения математических задач — меньше сложностей, больше возможностей.

Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
👩‍💻 Broken Glass Effect

Сцена с эффектом сломанного стекла в месте клика. Сделана на CSS и JavaScript.

Открыть код...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
⚙️ Vite 6.0: Новые возможности и будущее веб-разработки

Новая мажорная версия Vite от 26 ноября 2024 года — первый релиз после анонса VoidZero. Рассмотрим ключевые изменения и будущие векторы развития инструмента для сборки приложений.

Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
⚙️ Что такое теневые DOM-деревья (Shadow DOM) и как они работают?

Shadow DOM — это ключевая часть технологии Web Components, которая позволяет создавать инкапсулированные области DOM с собственным стилем и поведением. Теневые DOM-деревья изолированы от остального документа, что предотвращает конфликты стилей и упрощает создание переиспользуемых компонентов.

➡️ Пример:

// Создание элемента с Shadow DOM
const host = document.createElement('div');
const shadowRoot = host.attachShadow({ mode: 'open' });

// Добавление стилей и контента
shadowRoot.innerHTML = `
<style>
p {
color: blue;
}
</style>
<p>Это текст внутри Shadow DOM</p>
`;

document.body.appendChild(host);
console.log(document.querySelector('p')); // null (элемент скрыт из глобального DOM)


🗣️ В этом примере текст внутри Shadow DOM изолирован. Стили из Shadow DOM не влияют на остальную страницу, и наоборот. Shadow DOM полезен для создания самодостаточных UI-компонентов.


🖥 Подробнее тут
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Forwarded from Frontender's notes [ru]
↔️ CSS Container Queries — адаптивность без костылей

Адаптивность через @media — привычная вещь, но неудобная: когда один компонент используется в разных местах, его поведение зависит от размера окна браузера, а не от его контейнера. В итоге — хаки и дублирование стилей.

ℹ️ Как было раньше (через media queries):

.card .noscript {
font-size: 1rem;
}

@media (min-width: 768px) {
.card .noscript {
font-size: 2rem;
}
}


ℹ️ Как стало с Container Queries:

.card {
container-type: inline-size;
container-name: card;
}

.noscript {
font-size: 1rem;
}

@container card (min-width: 400px) {
.noscript {
font-size: 2rem;
}
}


Проблема: Если компонент .card вставить в узкий сайдбар на широком экране, стили могут «сломаться», так как адаптивность зависит от окна браузера, а не от контейнера. Теперь .noscript реагирует на размер контейнера, а не на размер вьюпорта. Это решение убирает все костыли и делает компоненты более гибкими.


Теперь можно создавать по-настоящему адаптивные компоненты без костылей. Поддержка в Chrome, Edge и Safari уже есть, так что пора пробовать в продакшене!

🚪 Frontender's notes
Please open Telegram to view this post
VIEW IN TELEGRAM
👍42
👩‍💻 TS Extend: полезная утилитарная функция для расширения type

Статья объясняет ограничения TypeScript 5.7 в работе с расширением типов, демонстрирует проблему интерсекции с одинаковыми свойствами и предлагает утилиту Extend для корректной обработки таких случаев.

Читать...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
👩‍💻 Уникальные значения из массива

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

Пример:

const numbers = [1, 2, 2, 3, 4, 4, 5];
const uniqueNumbers = getUniqueValues(numbers);
console.log(uniqueNumbers); // [1, 2, 3, 4, 5]


Решение задачи🔽

function getUniqueValues(arr) {
return [...new Set(arr)];
}

// Пример использования
const numbers = [1, 2, 2, 3, 4, 4, 5];
const uniqueNumbers = getUniqueValues(numbers);
console.log(uniqueNumbers); // [1, 2, 3, 4, 5]
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1