Управление цепочкой прокрутки окна
Замечали такое, что когда открыто модальное окно, в котором туча текста и есть скролл, мы скроллим модальное окно, а когда доскроллим его до конца, то начинается скроллиться уже окно барузера?
Вот это называется "цепочка прокрутки", когда после окончания одного скролла, идет скролл внешнего элемента.
Победить это дело можно с помощью свойства
С его помощью можно настроить прокрутку так, чтобы вложенные элементы не передавали скролл родителю.
Достаточно указать
Пример работы можно увидеть здесь, попробуйте удалить
Замечали такое, что когда открыто модальное окно, в котором туча текста и есть скролл, мы скроллим модальное окно, а когда доскроллим его до конца, то начинается скроллиться уже окно барузера?
Вот это называется "цепочка прокрутки", когда после окончания одного скролла, идет скролл внешнего элемента.
Победить это дело можно с помощью свойства
overscroll-behavior
.С его помощью можно настроить прокрутку так, чтобы вложенные элементы не передавали скролл родителю.
Достаточно указать
overscroll-behavior: contain;
— скролл только в пределах текущего элемента.Пример работы можно увидеть здесь, попробуйте удалить
overscroll-behavior: contain;
и как говорится, ощутите разницу)👍27🔥13❤3
Предпросмотр картинки перед загрузкой
Если в форму на сайте нужно отправить какую-то картинку, то бывает полезно сделать предпросмотр этой картинки, перед загрузкой.
Давайте, разберем здесь простой пример, как это можно реализовать.
Плюс еще добавим предпросмотр и кнопки.
Без JS здесь обойтись не получится.
Нужно после выбора файла получить временную ссылку на изображение, используем
Ну и оживим кнопку «Отменить», чтобы всё сбрасывалось: картинка скрывалась, поле очищалось.
Конечно, такое себе описание получилось)
Вот здесь готовый код, думаю все будет понятно после просмотра)
Если в форму на сайте нужно отправить какую-то картинку, то бывает полезно сделать предпросмотр этой картинки, перед загрузкой.
Давайте, разберем здесь простой пример, как это можно реализовать.
<div class="upload-container">
<label class="upload-label">Загрузите картинку любого формата (JPG, JPEG, PNG, GIF)</label>
<div class="file-input-wrapper">
<input type="file" id="imageInput" class="file-input" accept="image/*">
<label for="imageInput" class="file-button">Обзор...</label>
<span class="filename" id="filename">Файл не выбран</span>
</div>
</div>
Плюс еще добавим предпросмотр и кнопки.
Без JS здесь обойтись не получится.
Нужно после выбора файла получить временную ссылку на изображение, используем
URL.createObjectURL
, потом отображаем ее в <img>
. Ну и оживим кнопку «Отменить», чтобы всё сбрасывалось: картинка скрывалась, поле очищалось.
Конечно, такое себе описание получилось)
Вот здесь готовый код, думаю все будет понятно после просмотра)
👍14🔥11❤3
Убираем отступ под изображением
Микро лайфхак для новичков.
Когда мы вставляем изображение на страницу, то тег
Чтобы пофиксить этот момент достаточно изображение сделать блочным элементом:
Теперь отступ исчезнет. Мне кажется удобнее и логичнее, чем
Можно даже добавить правило в базовый CSS-сброс:
Это сделает работу с изображениями менее нервной)
Код, на всякий случай оставил здесь.
Микро лайфхак для новичков.
Когда мы вставляем изображение на страницу, то тег
<img src="image.jpg">
по умолчанию является строчным элементом, а поэтому и получаем отступ снизу (для "хвостиков" букв, вроде gjpqy).Чтобы пофиксить этот момент достаточно изображение сделать блочным элементом:
img {
display: block;
}
Теперь отступ исчезнет. Мне кажется удобнее и логичнее, чем
line-height: 0
.Можно даже добавить правило в базовый CSS-сброс:
img {
display: block;
max-width: 100%;
height: auto;
}
Это сделает работу с изображениями менее нервной)
Код, на всякий случай оставил здесь.
❤23👍14🔥6
This media is not supported in your browser
VIEW IN TELEGRAM
Когда сеньор взял фреймворк и быстро сдал в прод, а джуну показал, как всё написать с нуля)
😁63❤1
Убираем скачок контента при появлении полосы прокрутки
Замечали, что контент сайта может сдвигаться в зависимости от того отображается полоса прокрутки или нет?
Например, если у страницы нет скролла, затем нажать на раскрывающийся контент и при появлении этого контента появляется скролл и все сдвигается влево.
Теперь весь этот беспредел можно фиксить всего лишь одним свойством -
Достаточно добавить правило:
Поддержку браузерами можно глянуть тут.
Ну, а сам код из примера здесь.
Замечали, что контент сайта может сдвигаться в зависимости от того отображается полоса прокрутки или нет?
Например, если у страницы нет скролла, затем нажать на раскрывающийся контент и при появлении этого контента появляется скролл и все сдвигается влево.
Теперь весь этот беспредел можно фиксить всего лишь одним свойством -
scrollbar-gutter
.Достаточно добавить правило:
html {
scrollbar-gutter: stable;
}
scrollbar-gutter: stable
резервирует место под скроллбар заранее, даже когда его еще нет и все, контент больше не прыгает)Поддержку браузерами можно глянуть тут.
Ну, а сам код из примера здесь.
🔥39👍12❤7✍1
Видео-шпаргалка: CSS Grid
Нашел еще пару интересных видосов в виде шпаргалки, решил с вами поделиться.
Конечно, здесь только малая часть возможности гридов, но анимировано красиво и показано максимально доходчиво.
Новичкам будет полезно увидеть наглядно, как это работает)
Нашел еще пару интересных видосов в виде шпаргалки, решил с вами поделиться.
Конечно, здесь только малая часть возможности гридов, но анимировано красиво и показано максимально доходчиво.
Новичкам будет полезно увидеть наглядно, как это работает)
👍39🔥18😐2❤1
Использование :empty как заглушки для изображений
Бывают такие ситуации, что во время верстки нет готового контента, особенно это касается изображений. Приходится применять различные заглушки от сервисов типа placeholder.com
Но есть и еще один интересный способ — использование псевдокласса
Псевдокласс
Таким образом заглушки создаются чистым CSS, никаких внешних зависимостей, нет задержек на загрузку изображений-заглушек.
А когда появится настоящий контент, можно просто добавить
Потестить можно здесь.
Бывают такие ситуации, что во время верстки нет готового контента, особенно это касается изображений. Приходится применять различные заглушки от сервисов типа placeholder.com
Но есть и еще один интересный способ — использование псевдокласса
:empty
.Псевдокласс
:empty
срабатывает, когда элемент полностью пустой (без текста, дочерних элементов и даже пробелов). Это отлично подходит для создания заглушек:.image-container:empty::before {
content: "No Image Available";
display: flex;
align-items: center;
justify-content: center;
padding: 1rem;
width: 100%;
height: 100%;
font-size: 1.2rem;
color: #888;
background-color: #ddd;
text-align: center;
}
Таким образом заглушки создаются чистым CSS, никаких внешних зависимостей, нет задержек на загрузку изображений-заглушек.
А когда появится настоящий контент, можно просто добавить
<img>
внутрь контейнера, и заглушка исчезает.Потестить можно здесь.
👍39🔥23❤3
Делаем элемент с margin, который не вылезает за границы родителя
Иногда бывает задача сделать так, чтобы элемент имел margin и растягивался на всю ширину, но при этом не выходил за пределы родительского контейнера.
Логично задать
Простой подход не работает, потому что margin добавляется к ширине, а не вычитается из неё:
■ Ширина элемента = 100% от родителя.
■ Плюс
■ Итого: 100% + 40px = переполнение.
Рабочее решение:
Принцип простой: вычитаем размер всех margin'ов из 100%.
Такие задачи встречаются не особо часто, но все же может пригодиться)
Код можно посмотреть здесь.
Иногда бывает задача сделать так, чтобы элемент имел margin и растягивался на всю ширину, но при этом не выходил за пределы родительского контейнера.
Логично задать
width: 100%
и margin: 20px
, но элемент вылезает за границы.Простой подход не работает, потому что margin добавляется к ширине, а не вычитается из неё:
■ Ширина элемента = 100% от родителя.
■ Плюс
margin 20px
слева и справа.■ Итого: 100% + 40px = переполнение.
Рабочее решение:
calc()
.child {
width: calc(100% - 40px); /* вычитаем margin'ы */
margin: 20px;
}
Принцип простой: вычитаем размер всех margin'ов из 100%.
Такие задачи встречаются не особо часто, но все же может пригодиться)
Код можно посмотреть здесь.
👍28🔥13😐4
Фильтр фона с помощью CSS
Давайте сегодня разберем свойство
Причем, сам элемент остаётся нетронутым, а фон под ним меняется. Например, можно сделать эффект матового стекла.
Работает это свойство просто:
Свойство
Основные фильтры:
■
■
■
■
■
■
■
■
Наглядно посмотреть на работу можно здесь.
Давайте сегодня разберем свойство
backdrop-filter
, оно добавляет эффекты к области за элементом. Причем, сам элемент остаётся нетронутым, а фон под ним меняется. Например, можно сделать эффект матового стекла.
Работает это свойство просто:
.element {
background: rgba(255, 255, 255, 0.2); /* Полупрозрачный фон */
backdrop-filter: blur(5px); /* Размытие фона */
}
Свойство
backdrop-filter
похоже на filter
, но меняет не сам элемент, а его фон.Основные фильтры:
■
blur(px)
— размытие фона.■
brightness(%)
— яркость.■
contrast(%)
— контрастность. ■
grayscale(%)
— переводит фон в оттенки серого. ■
opacity(%)
— прозрачность фона. ■
sepia(%)
— придаёт фону тёплый, коричневатый оттенок. ■
hue-rotate(deg)
— изменяет оттенок фона. ■
invert(%)
— инвертирует цвета.Наглядно посмотреть на работу можно здесь.
👍37🔥13❤5
This media is not supported in your browser
VIEW IN TELEGRAM
Если вас кто-то спросит, что такое div с классом wrapper)
😁46👏4🗿4❤1
Стилизация кнопки выбора файла
Раньше, для того, чтобы поменять стили для кнопки загрузки файлов, приходилось скрывать стандартный
Но теперь в современных браузерах появилась поддержка псевдоэлемента
Разметка:
Стилизация:
Согласитесь, стало удобнее)
Поддержку браузерами можно глянуть здесь.
Ну, а сам код из примера ждёт вас тут.
Раньше, для того, чтобы поменять стили для кнопки загрузки файлов, приходилось скрывать стандартный
input
и запиливать свою красивую кнопку. Т.к. браузеры ограничивают возможности прямой стилизации этой кнопки.Но теперь в современных браузерах появилась поддержка псевдоэлемента
::file-selector-button
, который дает возможность стилизовать эту кнопку)Разметка:
<input type="file" class="styled-file-input" />
Стилизация:
.styled-file-input::file-selector-button {
background-color: #4CAF50;
color: white;
padding: 10px 15px;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 16px;
transition: background-color 0.3s ease;
}
Согласитесь, стало удобнее)
Поддержку браузерами можно глянуть здесь.
Ну, а сам код из примера ждёт вас тут.
🔥39👍16❤3
Надеюсь, вы ответите именно так, после прочтения этого поста)
Наш канал вырос до 3000 подписчиков, вашу активность, вопросы и поддержку я ценю больше всего — это то, что делает наш канал таким уютным и живым!
Поэтому сейчас хочу открыто поделиться планами по развитию нашего канала.
Чтобы канал рос дальше и становился еще лучше, мне нужно покупать рекламу, а для этого нужны деньги.
Поэтому буду иногда размещать рекламные посты в нашем канале, такой вот круговорот)
Но не переживайте, рекламы будет немного, максимум пару постов в неделю)
Без спама и мусора, только по нашей теме.
Многие из вас, тоже пришли сюда через рекламу, и это нормально, так работает развитие.
Если есть вопросы, критика или предложения — всегда готов обсудить)
Наш канал вырос до 3000 подписчиков, вашу активность, вопросы и поддержку я ценю больше всего — это то, что делает наш канал таким уютным и живым!
Поэтому сейчас хочу открыто поделиться планами по развитию нашего канала.
Чтобы канал рос дальше и становился еще лучше, мне нужно покупать рекламу, а для этого нужны деньги.
Поэтому буду иногда размещать рекламные посты в нашем канале, такой вот круговорот)
Но не переживайте, рекламы будет немного, максимум пару постов в неделю)
Без спама и мусора, только по нашей теме.
Многие из вас, тоже пришли сюда через рекламу, и это нормально, так работает развитие.
Если есть вопросы, критика или предложения — всегда готов обсудить)
4👍48👌25❤11
This media is not supported in your browser
VIEW IN TELEGRAM
Скрываем текст на кнопках при нехватке места
Иногда в карточках бывает несколько кнопок в ряд, при адаптиве их нельзя переносить одну под другую, а если просто уменьшать их размер, то это выглядит мягко говоря не очень.
Выходом может быть скрытие текста кнопки и отображение только ее иконки, чтобы было понятно, что это вообще за кнопка)
Следить за моментом, когда нужно скрывать текст, удобно с помощью контейнерных запросов (container queries).
Просто указываем при каком размере контейнера скрыть текст и все:
Container queries следят за размером карточки и скрывают текст, когда места мало.
Кнопки всегда выглядят аккуратно, не ломаются и не переносят текст.
Затестить код можно здесь.
Иногда в карточках бывает несколько кнопок в ряд, при адаптиве их нельзя переносить одну под другую, а если просто уменьшать их размер, то это выглядит мягко говоря не очень.
Выходом может быть скрытие текста кнопки и отображение только ее иконки, чтобы было понятно, что это вообще за кнопка)
Следить за моментом, когда нужно скрывать текст, удобно с помощью контейнерных запросов (container queries).
Просто указываем при каком размере контейнера скрыть текст и все:
.card {
container-type: inline-size; /* Превращаем элемент в контейнер для адаптивных стилей */
}
@container (max-width: 320px) {
.btn-text {
display: none; /* Скрываем текст */
}
}
Container queries следят за размером карточки и скрывают текст, когда места мало.
Кнопки всегда выглядят аккуратно, не ломаются и не переносят текст.
Затестить код можно здесь.
👍41🔥17👎2
Основные способы добавить иконку в input
Иногда требуется отображать в
1) Background-image
Самый простой способ, всего одно CSS-правило, но не самый гибкий.
2) Псевдоэлемент ::before
Тоже простой способ, но поскольку к
3) Отдельный SVG
Добавляется дополнительная разметка, но имеем полную гибкость — меняем цвет через
В общем можно подобрать нужный способ по ситуации)
Пощупать код можно здесь.
Иногда требуется отображать в
input
иконку поиска и т.п., собрал здесь 3 основных способа сделать это)1) Background-image
.bg-icon {
background-image: url('...');
background-repeat: no-repeat;
background-position: 10px center;
background-size: 16px;
}
Самый простой способ, всего одно CSS-правило, но не самый гибкий.
2) Псевдоэлемент ::before
.wrapper::before {
content: "";
background-image: url('...');
position: absolute;
}
Тоже простой способ, но поскольку к
input
не может иметь псевдоэлементы, то требуется обёртка.3) Отдельный SVG
<div class="input-wrapper">
<input type="text">
<svg class="icon">...</svg>
</div>
Добавляется дополнительная разметка, но имеем полную гибкость — меняем цвет через
fill
, анимируем, добавляем hover-эффекты и т.п.В общем можно подобрать нужный способ по ситуации)
Пощупать код можно здесь.
👍26🔥16
Автоотступ для выравнивания элементов
При верстке часто возникает задача — разместить несколько элементов в строку, а один из них вытолкнуть, чтобы он не зависел от остальных.
Например: логотип, меню и кнопка входа справа.
Flexbox с этим делом справляется на ура)
Разберем на примере:
Контейнеру зададим
Браузер заполнит всё свободное пространство слева от элемента, тем самым выталкивая его вправо.
Пример можно увидеть здесь.
При верстке часто возникает задача — разместить несколько элементов в строку, а один из них вытолкнуть, чтобы он не зависел от остальных.
Например: логотип, меню и кнопка входа справа.
Flexbox с этим делом справляется на ура)
Разберем на примере:
<div class="header">
<div class="logo header-block">лого</div>
<div class="menu header-block">меню</div>
<div class="login header-block">вход</div>
</div>
Контейнеру зададим
display: flex
, а чтобы блок <div class="login header-block">вход</div>
отлетел вправо, добавим ему margin-left: auto
..header {
display: flex;
}
.header-block {
display: flex;
align-items: center;
justify-content: center;
}
.login {
margin-left: auto;
width: 100px;
}
Браузер заполнит всё свободное пространство слева от элемента, тем самым выталкивая его вправо.
Пример можно увидеть здесь.
👍20🔥5❤3
Шпаргалка по Emmet
Все знают про Emmet и про то, как он ускоряет процесс верстки. Но обычно в работе используется лишь малая часть того, что он позволяет делать.
Конечно, все его сокращения запомнить трудно, поэтому вот вам официальная шпаргалка — https://docs.emmet.io/cheat-sheet/
Освежите в памяти или может быть, найдете то, что раньше не замечали.
Там же есть ссылка pdf, если нужно распечатать)
Все знают про Emmet и про то, как он ускоряет процесс верстки. Но обычно в работе используется лишь малая часть того, что он позволяет делать.
Конечно, все его сокращения запомнить трудно, поэтому вот вам официальная шпаргалка — https://docs.emmet.io/cheat-sheet/
Освежите в памяти или может быть, найдете то, что раньше не замечали.
Там же есть ссылка pdf, если нужно распечатать)
👍17🔥8❤4😐1
This media is not supported in your browser
VIEW IN TELEGRAM
Как владельцы макбуков в модной кофейне видят твой Lenovo)
😁57❤8🔥5🗿2😐1
This media is not supported in your browser
VIEW IN TELEGRAM
Аккордеон на чистом HTML и CSS
Сделаем такой аккордеон, чтобы одновременно был открыт только один элемент. В этом нам поможет старый добрый
Будем использовать атрибут
И еще добавим атрибут
Получаем такой код:
Благодаря одинаковому значению атрибута name, браузер сам позаботится о том, чтобы одновременно был открыт только один элемент — отлично подходит для разделов FAQ на лендингах)
Поддержку браузерами можно посмотреть тут.
Код из примера можно найти здесь.
Сделаем такой аккордеон, чтобы одновременно был открыт только один элемент. В этом нам поможет старый добрый
<details>
, но с улучшением)Будем использовать атрибут
name
, который превращает <details>
в группу элементов.И еще добавим атрибут
open
у первого элемента, чтобы сделать его раскрытым по умолчанию.Получаем такой код:
<div class="accordion">
<details name="my-accordion" open>
<summary>Первый пункт</summary>
<div class="content">
<p>Текст</p>
</div>
</details>
<details name="my-accordion">
<summary>Второй пункт</summary>
<div class="content">
<p>Текст</p>
</div>
</details>
</div>
Благодаря одинаковому значению атрибута name, браузер сам позаботится о том, чтобы одновременно был открыт только один элемент — отлично подходит для разделов FAQ на лендингах)
Поддержку браузерами можно посмотреть тут.
Код из примера можно найти здесь.
🔥27👍17❤3