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

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

По вопросам рекламы или разработки: @g_abashkin
Download Telegram
👩‍💻 Создание анимированного переключателя темы (светлая/тёмная)

Создайте переключатель, позволяющий пользователю менять тему страницы между светлой и тёмной. При переключении должна происходить плавная анимация перехода. Реализуйте переключение тем с помощью CSS-переменных и JavaScript.

➡️ Пример: Переключатель переключает тему страницы между светлой и тёмной, изменяя цвета фона и текста. При смене темы фон плавно меняется за 0.3 секунды.

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

<div class="theme-toggle">
<label class="switch">
<input type="checkbox" id="theme-switcher">
<span class="slider"></span>
</label>
<p>Нажмите, чтобы переключить тему</p>
</div>

/* Переменные для тем */
:root {
--bg-color-light:
#ffffff;
--bg-color-dark: #333333;
--text-color-light: #000000;
--text-color-dark:
#ffffff;
--transition-duration: 0.3s;
}

/* Общие стили */
body {
background-color: var(--bg-color-light);
color: var(--text-color-light);
transition: background-color var(--transition-duration), color var(--transition-duration);
}

/* Тёмная тема */
body.dark-theme {
background-color: var(--bg-color-dark);
color: var(--text-color-dark);
}

/* Стили для переключателя */
.theme-toggle {
display: flex;
align-items: center;
gap: 10px;
margin-top: 20px;
}

.switch {
position: relative;
display: inline-block;
width: 50px;
height: 24px;
}

.switch input {
opacity: 0;
width: 0;
height: 0;
}

.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color:
#ccc;
border-radius: 24px;
transition: background-color var(--transition-duration);
}

.slider:before {
position: absolute;
content: "";
height: 18px;
width: 18px;
left: 4px;
bottom: 3px;
background-color: white;
border-radius: 50%;
transition: transform var(--transition-duration);
}

input:checked + .slider {
background-color:
#2196F3;
}

input:checked + .slider:before {
transform: translateX(26px);
}

document.getElementById('theme-switcher').addEventListener('change', (event) => {
document.body.classList.toggle('dark-theme', event.target.checked);
});
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Создание карточки с изображением и текстом, выровненным по нижнему краю

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

Ожидаемое поведение:

Изображение занимает верхнюю часть карточки.
Текст закреплён внизу карточки, даже если изображение маленькое.

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

<div class="card">
<img src="
https://via.placeholder.com/150" alt="Placeholder Image" class="card-img">
<div class="card-text">Текст внизу карточки</div>
</div>

.card {
width: 200px;
height: 300px;
display: flex;
flex-direction: column;
justify-content: space-between;
border: 1px solid
#ccc;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}

.card-img {
width: 100%;
height: auto;
max-height: 70%; /* Ограничиваем высоту изображения */
}

.card-text {
padding: 10px;
background-color:
#f9f9f9;
text-align: center;
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Центрирование текста внутри блока

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

Ожидаемое поведение:

Блок имеет фиксированные размеры: 200px на 200px.
Текст находится в центре блока.

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

<div class="centered-block">
Центрированный текст
</div>

.centered-block {
width: 200px;
height: 200px;
background-color:
#f0f0f0;
display: flex;
justify-content: center;
align-items: center;
text-align: center;
border: 1px solid
#ccc;
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Создание адаптивной карточки с изображением и текстом

Создайте карточку, которая содержит изображение сверху и текст ниже. Карточка должна быть адаптивной: на больших экранах занимать 25% ширины контейнера, а на мобильных устройствах — всю ширину.

Ожидаемое поведение:

Изображение всегда занимает всю ширину карточки.
Текст расположен под изображением.
Карточка адаптируется к размеру экрана.

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

<div class="card">
<img src="
https://via.placeholder.com/300x200" alt="Image" class="card-image">
<div class="card-text">
<h3>Заголовок</h3>
<p>Описание карточки. Это адаптивная карточка с текстом и изображением.</p>
</div>
</div>

/* Контейнер карточки */
.card {
display: flex;
flex-direction: column;
width: 25%; /* Для больших экранов */
border: 1px solid
#ccc;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
transition: transform 0.3s;
}

.card:hover {
transform: scale(1.05);
}

/* Изображение в карточке */
.card-image {
width: 100%;
height: auto;
display: block;
}

/* Текст карточки */
.card-text {
padding: 16px;
text-align: center;
background-color:
#f9f9f9;
}

/* Адаптивность для мобильных устройств */
@media (max-width: 768px) {
.card {
width: 100%; /* Занимает всю ширину на маленьких экранах */
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Реализация кнопки с таймером блокировки

Создайте кнопку, которая становится недоступной (disabled) на 5 секунд после каждого нажатия. Отображайте обратный отсчёт времени на кнопке, чтобы пользователь видел, когда её можно будет нажать снова.

Ожидаемое поведение:

При нажатии на кнопку она становится недоступной.
На кнопке отображается обратный отсчёт времени: 5... 4... 3....
Через 5 секунд кнопка снова становится активной и текст возвращается в исходное состояние.

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

<button id="timer-button">Нажми меня</button>


#timer-button {
padding: 10px 20px;
font-size: 16px;
cursor: pointer;
}

#timer-button:disabled {
background-color:
#ccc;
cursor: not-allowed;
}


const button = document.getElementById('timer-button');

button.addEventListener('click', () => {
let countdown = 5;

// Деактивируем кнопку и запускаем таймер
button.disabled = true;
const interval = setInterval(() => {
button.textContent = `Ждите... ${countdown}`;
countdown--;

if (countdown < 0) {
clearInterval(interval);
button.disabled = false;
button.textContent = 'Нажми меня';
}
}, 1000);
});
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Анимация загрузочного индикатора

Создайте кнопку, при нажатии на которую появляется анимация загрузочного индикатора (спиннера) на 3 секунды. После завершения загрузки спиннер исчезает, а на кнопке отображается текст "Готово!".

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

<button id="loadButton">Начать загрузку</button>
<div id="spinner" class="spinner" style="display: none;"></div>

button {
padding: 10px 20px;
font-size: 16px;
cursor: pointer;
}

.spinner {
margin-top: 10px;
width: 30px;
height: 30px;
border: 4px solid
#ccc;
border-top: 4px solid
#007bff;
border-radius: 50%;
animation: spin 1s linear infinite;
}

@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}

const button = document.getElementById('loadButton');
const spinner = document.getElementById('spinner');

button.addEventListener('click', () => {
button.disabled = true;
button.textContent = 'Загрузка...';
spinner.style.display = 'block';

setTimeout(() => {
button.textContent = 'Готово!';
spinner.style.display = 'none';
button.disabled = false;
}, 3000);
});
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Создание карточки с изображением и текстом, выровненным по нижнему краю

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

Ожидаемое поведение:

Изображение занимает верхнюю часть карточки.
Текст закреплён внизу карточки, даже если изображение маленькое.

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

<div class="card">
<img src="
https://via.placeholder.com/150" alt="Placeholder Image" class="card-img">
<div class="card-text">Текст внизу карточки</div>
</div>

.card {
width: 200px;
height: 300px;
display: flex;
flex-direction: column;
justify-content: space-between;
border: 1px solid
#ccc;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}

.card-img {
width: 100%;
height: auto;
max-height: 70%; /* Ограничиваем высоту изображения */
}

.card-text {
padding: 10px;
background-color:
#f9f9f9;
text-align: center;
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Создание анимированного переключателя темы (светлая/тёмная)

Создайте переключатель, позволяющий пользователю менять тему страницы между светлой и тёмной. При переключении должна происходить плавная анимация перехода. Реализуйте переключение тем с помощью CSS-переменных и JavaScript.

➡️ Пример: Переключатель переключает тему страницы между светлой и тёмной, изменяя цвета фона и текста. При смене темы фон плавно меняется за 0.3 секунды.

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

<div class="theme-toggle">
<label class="switch">
<input type="checkbox" id="theme-switcher">
<span class="slider"></span>
</label>
<p>Нажмите, чтобы переключить тему</p>
</div>

/* Переменные для тем */
:root {
--bg-color-light:
#ffffff;
--bg-color-dark: #333333;
--text-color-light: #000000;
--text-color-dark:
#ffffff;
--transition-duration: 0.3s;
}

/* Общие стили */
body {
background-color: var(--bg-color-light);
color: var(--text-color-light);
transition: background-color var(--transition-duration), color var(--transition-duration);
}

/* Тёмная тема */
body.dark-theme {
background-color: var(--bg-color-dark);
color: var(--text-color-dark);
}

/* Стили для переключателя */
.theme-toggle {
display: flex;
align-items: center;
gap: 10px;
margin-top: 20px;
}

.switch {
position: relative;
display: inline-block;
width: 50px;
height: 24px;
}

.switch input {
opacity: 0;
width: 0;
height: 0;
}

.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color:
#ccc;
border-radius: 24px;
transition: background-color var(--transition-duration);
}

.slider:before {
position: absolute;
content: "";
height: 18px;
width: 18px;
left: 4px;
bottom: 3px;
background-color: white;
border-radius: 50%;
transition: transform var(--transition-duration);
}

input:checked + .slider {
background-color:
#2196F3;
}

input:checked + .slider:before {
transform: translateX(26px);
}

document.getElementById('theme-switcher').addEventListener('change', (event) => {
document.body.classList.toggle('dark-theme', event.target.checked);
});
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Создание адаптивной карточки с изображением и текстом

Создайте карточку, которая содержит изображение сверху и текст ниже. Карточка должна быть адаптивной: на больших экранах занимать 25% ширины контейнера, а на мобильных устройствах — всю ширину.

Ожидаемое поведение:

Изображение всегда занимает всю ширину карточки.
Текст расположен под изображением.
Карточка адаптируется к размеру экрана.

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

<div class="card">
<img src="
https://via.placeholder.com/300x200" alt="Image" class="card-image">
<div class="card-text">
<h3>Заголовок</h3>
<p>Описание карточки. Это адаптивная карточка с текстом и изображением.</p>
</div>
</div>

/* Контейнер карточки */
.card {
display: flex;
flex-direction: column;
width: 25%; /* Для больших экранов */
border: 1px solid
#ccc;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
transition: transform 0.3s;
}

.card:hover {
transform: scale(1.05);
}

/* Изображение в карточке */
.card-image {
width: 100%;
height: auto;
display: block;
}

/* Текст карточки */
.card-text {
padding: 16px;
text-align: center;
background-color:
#f9f9f9;
}

/* Адаптивность для мобильных устройств */
@media (max-width: 768px) {
.card {
width: 100%; /* Занимает всю ширину на маленьких экранах */
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Реализация кнопки с таймером блокировки

Создайте кнопку, которая становится недоступной (disabled) на 5 секунд после каждого нажатия. Отображайте обратный отсчёт времени на кнопке, чтобы пользователь видел, когда её можно будет нажать снова.

Ожидаемое поведение:

При нажатии на кнопку она становится недоступной.
На кнопке отображается обратный отсчёт времени: 5... 4... 3....
Через 5 секунд кнопка снова становится активной и текст возвращается в исходное состояние.

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

<button id="timer-button">Нажми меня</button>


#timer-button {
padding: 10px 20px;
font-size: 16px;
cursor: pointer;
}

#timer-button:disabled {
background-color:
#ccc;
cursor: not-allowed;
}


const button = document.getElementById('timer-button');

button.addEventListener('click', () => {
let countdown = 5;

// Деактивируем кнопку и запускаем таймер
button.disabled = true;
const interval = setInterval(() => {
button.textContent = `Ждите... ${countdown}`;
countdown--;

if (countdown < 0) {
clearInterval(interval);
button.disabled = false;
button.textContent = 'Нажми меня';
}
}, 1000);
});
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Анимация загрузочного индикатора

Создайте кнопку, при нажатии на которую появляется анимация загрузочного индикатора (спиннера) на 3 секунды. После завершения загрузки спиннер исчезает, а на кнопке отображается текст "Готово!".

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

<button id="loadButton">Начать загрузку</button>
<div id="spinner" class="spinner" style="display: none;"></div>

button {
padding: 10px 20px;
font-size: 16px;
cursor: pointer;
}

.spinner {
margin-top: 10px;
width: 30px;
height: 30px;
border: 4px solid
#ccc;
border-top: 4px solid
#007bff;
border-radius: 50%;
animation: spin 1s linear infinite;
}

@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}

const button = document.getElementById('loadButton');
const spinner = document.getElementById('spinner');

button.addEventListener('click', () => {
button.disabled = true;
button.textContent = 'Загрузка...';
spinner.style.display = 'block';

setTimeout(() => {
button.textContent = 'Готово!';
spinner.style.display = 'none';
button.disabled = false;
}, 3000);
});
Please open Telegram to view this post
VIEW IN TELEGRAM