Русский
Русский
English
Статистика
Реклама

Css reset

Перевод Как обеспечить глассморфизм с помощью HTML и CSS

27.04.2021 16:10:26 | Автор: admin

Вы, наверное, подумаете ну вот еще один тренд дизайна? Разве они у нас не каждый год появляются или около того?

В прошлом году мы познакомились с нейморфизмом, который до сих пор является довольно спорным трендом, который так и не получил широкого распространения. Реакция была неоднозначной, кому-то это очень понравилось, а кому-то совершенно не понравилось.

Но давайте поговорим немного больше о глассморфизме.

Что такое глассморфизм?

Глассморфизм это новое направление в дизайне, использующее прозрачный фон и эффект размытости поверх фона для создания эффекта стекла.

Вот пример:

Это пример из библиотеки CSS UI, основанной на глассморфизме, называемой ui.glass.

Как видите, эффект используется для карточки, которая содержит пример кода справа, в отличие от другой карточки на заднем плане.

Другим примером является редизайн Facebook Messenger App с использованием глассморфизма для MacOS:

Редизайн был выполнен Mikoaj Gaziowski на Dribbble.

Глассморфизм также используется такими компаниями как Apple и Microsoft

Это еще одна причина, по которой эта тенденция, вероятно, не просто проходит мимо, а до сих пор здесь, чтобы остаться. С выходом обновления Big Sur для MacOS, это было первое широкомасштабное распространение этого нового дизайнерского тренда крупной компанией.

Microsoft также использует этот стиль в Fluent Design System, но они называют его "акриловым материалом", а не глассморфизмом.

Вот как это выглядит:

Итак, теперь, когда я вкратце познакомил вас с гласcморфизмом, позвольте показать, как можно применить этот эффект, используя только HTML и CSS.

Давайте начнем

Все, что вам действительно нужно для этого учебного пособия - это редактор кода и веб-браузер. Вы также можете написать этот код, используя только редакторы, такие как Codepen.

Элемент, который мы собираемся построить, будет выглядеть так:

Начнем с создания HTML-файла со следующим кодом:

<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <meta http-equiv="X-UA-Compatible" content="IE=edge">  <meta name="viewport" content="width=device-width, initial-scale=1.0">  <title>Glassmorphism effect</title></head><body>    <!-- code goes here --></body></html>

Здорово! Теперь давайте также добавим пользовательский стиль шрифта, включая Inter из Google Fonts:

<link rel="preconnect" href="http://personeltest.ru/aways/fonts.gstatic.com"><link href="http://personeltest.ru/aways/fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">

Настройка некоторых основных стилей и фона для тега body:

body {  padding: 4.5rem;  margin: 0;  background: #edc0bf;  background: linear-gradient(90deg, #edc0bf 0,#c4caef 58%);  font-family: 'Inter', sans-serif;}

Хорошо. Далее создадим новый элемент карточки, который мы позже будем использовать для нанесения эффекта глассморфизма:

<div class="card">    <h3 class="card-title">Glassmorphism is awesome</h3>    <p>A modern CSS UI library based on the glassmorphism design principles that will help you quickly design and build beautiful websites and applications.</p>    <a href="http://personeltest.ru/aways/ui.glass">Read more</a></div>

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

Перед тем, как применить эффект стекла, давайте сначала приведем в порядок некоторые интервалы и размеры стилей:

.card {  width: 400px;  height: auto;  padding: 2rem;  border-radius: 1rem;}.card-title {  margin-top: 0;  margin-bottom: .5rem;  font-size: 1.2rem;}p, a {  font-size: 1rem;}a {  color: #4d4ae8;  text-decoration: none;}

Здорово! Теперь, когда мы заложили основу для эффекта, давайте посмотрим, как мы сможем его применить.

Создание эффекта глассморфизма, используя HTML и CSS

Для применения эффекта нужны только два важных свойства CSS: прозрачный фон и свойства backdrop-filter: blur(10px); . Степень размытости или прозрачности может быть изменена в зависимости от ваших предпочтений.

Добавьте к элементу .card следующие стили:

.card {/* other styles */background: rgba(255, 255, 255, .7);-webkit-backdrop-filter: blur(10px);backdrop-filter: blur(10px);}

Но вы, наверное, спрашиваете, где эффект? Вы его еще не видите, потому что за картой нет ни формы, ни изображения. Вот как должна выглядеть карта прямо сейчас:

Давайте добавим изображение сразу после запуска тега body :

<img class="shape" src="http://personeltest.ru/aways/s3.us-east-2.amazonaws.com/ui.glass/shape.svg" alt="">

Затем примените следующие стили к элементу .shape с помощью CSS:

.shape {  position: absolute;  width: 150px;  top: .5rem;  left: .5rem;}

Потрясающе! Окончательный результат должен выглядеть так:

Если вам нужен код для этого туториала, посмотрите на этот код.

Поддержка браузера

Одним из недостатков нового тренда дизайна является то, что Internet Explorer не поддерживает свойство backdrop-filter, а Firefox отключает его по умолчанию.

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

Вы можете проверить поддержку браузеров на сайте caniuse.com.

Заключение

Я надеюсь, что эта статья была полезной для вас и помогла понять больше о новом направлении дизайна и о том, как можно достичь эффекта глассморфизма.

Мы с моим другом из Themesberg работали над новой библиотекой CSS UI, которая будет использовать новое направление глассморфизма в дизайне, называемое ui.glass. Она будет иметь открытый исходный код под лицензией MIT.

Вы можете подписаться на получение обновлений о ходе работы и получать уведомления о том, когда проект будет запущен. Он будет доступен через NPM, а также CDN.

Спасибо за чтение! Оставьте свои мысли о глассморфизме в разделе комментариев ниже.


Прямо сейчас в OTUS открыт набор на онлайн-курс "HTML/CSS".

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

- Узнать подробнее о курсе "HTML/CSS"

- Смотреть вебинар CSS Reset ненужный артефакт или спасательный круг

Подробнее..

Перевод Доступный toggle

14.05.2021 14:06:19 | Автор: admin

Перевод подготовлен в рамках онлайн-курса"HTML/CSS".

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


Toggles (или их еще называют "тумблеры"/"переключатели") широко используются в современных интерфейсах. Они, как правило, относительно просты, и их можно рассматривать как простые флажки (checkbox). Тем не менее, их часто делают недоступными тем или иным способом.

В этой статье я покажу небольшую имплементацию доступного toggle на HTML + CSS, которую вы можете применить в своих проектах и доработать по своему усмотрению.

  • Разметка

  • Стилизация

  • Контейнер

  • The toggle и дескриптор handle

  • Стили для фокуса

  • Проверенное состояние

  • Отключенное состояние

  • Поддержка право-лево

  • Иконки

  • Вариант кнопки

  • Завершение

Дисклеймер: Прежде чем использовать toggle, подумайте, насколько это наилучший вариант пользовательского интерфейса для данной ситуации. Toggles могут быть визуально непонятными, и в некоторых случаях кнопка может быть более подходящим решением для данной ситуации.

Разметка

Как всегда, давайте начнем с HTML. В данном случае мы начнем с самых основ, а именно с правильно обозначенного флажка. Это input с <label>, с правильными атрибутами и видимой меткой.

Если toggle вызывает немедленное действие (например, переключение темы) и поэтому зависит от JavaScript, то вместо него следует использовать <button>. Обратитесь к варианту кнопки для получения дополнительной информации о разметке - стили, по сути, одинаковы. Спасибо Adrian Roselli за то, что он обратил наше внимание на это!

<label class="Toggle" for="toggle">  <input type="checkbox" name="toggle" id="toggle" class="Toggle__input" />  This is the label</label>

Стоит отметить, что это не единственный способ разметки такого компонента интерфейса. Например, вместо него можно использовать 2 radio inputs. Sara Soueidan более подробно рассказывает о проектировании и создании toggle.

Теперь нам понадобится немного больше. Чтобы не передавать статус флажка, полагаясь только на цвет (Критерий успеха WCAG 1.4.1 "Использование цвета"), мы собираемся использовать пару иконок.

Мы будем использовать небольшой контейнер между вводом данных и текстовой меткой, который будет содержать 2 иконки: галочку и крестик (взяты из иконок Material UI). Затем мы создадим toggle handle с псевдоэлементом, который будет охватывать одну из иконок за раз.

<label class="Toggle" for="toggle">  <input type="checkbox" name="toggle" id="toggle" class="Toggle__input" />  <span class="Toggle__display" hidden>    <svg      aria-hidden="true"      focusable="false"      class="Toggle__icon Toggle__icon--checkmark"      width="18"      height="14"      viewBox="0 0 18 14"      fill="none"      xmlns="http://personeltest.ru/away/www.w3.org/2000/svg"    >      <path        d="M6.08471 10.6237L2.29164 6.83059L1 8.11313L6.08471 13.1978L17 2.28255L15.7175 1L6.08471 10.6237Z"        fill="currentcolor"        stroke="currentcolor"      />    </svg>    <svg      aria-hidden="true"      focusable="false"      class="Toggle__icon Toggle__icon--cross"      width="13"      height="13"      viewBox="0 0 13 13"      fill="none"      xmlns="http://personeltest.ru/away/www.w3.org/2000/svg"    >      <path        d="M11.167 0L6.5 4.667L1.833 0L0 1.833L4.667 6.5L0 11.167L1.833 13L6.5 8.333L11.167 13L13 11.167L8.333 6.5L13 1.833L11.167 0Z"        fill="currentcolor"      />    </svg>  </span>  This is the label</label>

Следует отметить несколько моментов, связанных с нашей разметкой:

  • Мы используем aria-hidden="true" для наших SVG, потому что они не должны обнаруживаться вспомогательными технологиями, так как являются сугубо декоративными.

  • Мы также используем focusable="false" для наших SVG, чтобы избежать проблем с Internet Explorer, где SVG по умолчанию фокусируются.

  • Мы используем hidden для контейнера .Toggle__display , чтобы скрыть его, когда CSS недоступен, поскольку он должен вернуться к базовому флажку. Его значение отображения будет переопределено в CSS.

Стили

Прежде чем мы углубимся в стилизацию, я хотел бы уточнить терминологию, чтобы было легче следить за развитием событий:

  • Контейнер - это обертка <label>, которая содержит как toggle, так и текстовую метку (.Toggle).

  • Toggle - это визуальный тумблер, зеленый или красный в зависимости от статуса, с 2 иконками (.Toggle__display).

  • Handle - это круглый диск, охватывающий одну из иконок и перемещающийся влево и вправо при взаимодействии с toggle (.Toggle__display::before).

  • Input - Вход - это HTML <input>, который визуально скрыт, но остается доступным и фокусируемым (.Toggle__input).

Контейнер

Давайте начнем с базовых стилей для нашего контейнера.

/** * 1. Vertically center the toggle and the label. `flex` could be used if a  *    block-level display is preferred. * 2. Make sure the toggle remains clean and functional even if the label is *    too wide to fit on one line. Thanks @jouni_kantola for the heads up! * 3. Grant a position context for the visually hidden and absolutely *    positioned input. * 4. Provide spacing between the toggle and the text regardless of layout *    direction. If browser support is considered insufficient, use *    a right margin on `.Toggle__display` in LTR, and left margin in RTL. *    See: https://caniuse.com/flexbox-gap */.Toggle {  display: inline-flex; /* 1 */  align-items: center; /* 1 */  flex-wrap: wrap; /* 2 */  position: relative; /* 3 */  gap: 1ch; /* 4 */}

Toggle и handle

Затем - наш toggle. Чтобы облегчить настройку его стилей, мы используем некоторые пользовательские свойства CSS для перемещения вокруг handle и его диаметра.

/** * 1. Vertically center the icons and space them evenly in the available  *    horizontal space, essentially giving something like: [   ] * 2. Size the display according to the size of the handle. `box-sizing` *    could use `border-box` but the border would have to be considered *    in the `width` computation. Either way works. * 3. For the toggle to be visible in Windows High-Contrast Mode, we apply a *    thin semi-transparent (or fully transparent) border. *    Kind thanks to Adrian Roselli for the tip: *    https://twitter.com/aardrian/status/1379786724222631938?s=20 * 4. Grant a position context for the pseudo-element making the handle. * 5. Give a pill-like shape with rounded corners, regardless of the size. * 6. The default state is considered unchecked, hence why this pale red is *    used as a background color. */.Toggle__display {  --offset: 0.25em;  --diameter: 1.8em;  display: inline-flex; /* 1 */  align-items: center; /* 1 */  justify-content: space-around; /* 1 */  width: calc(var(--diameter) * 2 + var(--offset) * 2); /* 2 */  height: calc(var(--diameter) + var(--offset) * 2); /* 2 */  box-sizing: content-box; /* 2 */  border: 0.1em solid rgb(0 0 0 / 0.2); /* 3 */  position: relative; /* 4 */  border-radius: 100vw; /* 5 */  background-color: #fbe4e2; /* 6 */  transition: 250ms;  cursor: pointer;}/** * 1. Size the round handle according to the diameter custom property. * 2. For the handle to be visible in Windows High-Contrast Mode, we apply a *    thin semi-transparent (or fully transparent) border. *    Kind thanks to Adrian Roselli for the tip: *    https://twitter.com/aardrian/status/1379786724222631938?s=20 * 3. Absolutely position the handle on top of the icons, vertically centered *    within the container and offset by the spacing amount on the left. * 4. Give the handle a solid background to hide the icon underneath. This *    could be dark in a dark mode theme, as long as its solid. */.Toggle__display::before {  content: '';  width: var(--diameter); /* 1 */  height: var(--diameter); /* 1 */  border-radius: 50%; /* 1 */  box-sizing: border-box; /* 2 */  border: 0.1 solid rgb(0 0 0 / 0.2); /* 2 */  position: absolute; /* 3 */  z-index: 2; /* 3 */  top: 50%; /* 3 */  left: var(--offset); /* 3 */  transform: translate(0, -50%); /* 3 */  background-color: #fff; /* 4 */  transition: inherit;}

Переход здесь осуществляется таким образом, что handle плавно скользит из одной стороны в другую. Это может немного отвлекать или настораживать некоторых людей, поэтому рекомендуется отключить этот переход, когда включена функция reduced-motion (уменьшение движения). Это можно сделать с помощью следующего фрагмента:

@media (prefers-reduced-motion: reduce) {  .Toggle__display {    transition-duration: 0ms;  }}

Стили для фокуса

Мы вставили наш контейнер toggle после самого ввода, чтобы использовать комбинатор смежных сиблингов ( + )для стилизации toggle в зависимости от состояния ввода (проверен, сфокусирован, отключен...).

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

/** * 1. When the input is focused, provide the display the default outline *    styles from the browser to mimic a native control. This can be *    customised to have a custom focus outline. */.Toggle__input:focus + .Toggle__display {  outline: 1px dotted #212121; /* 1 */  outline: 1px auto -webkit-focus-ring-color; /* 1 */}

Я заметил одну интересную вещь: при нажатии на родной флажок или его метку контур фокуса не появляется. Это происходит только при фокусировке флажка с помощью клавиатуры. Мы можем имитировать это поведение, удалив стили, которые мы только что применили, когда селектор :focus-visible не подходит.

/** * 1. When the toggle is interacted with with a mouse click (and therefore *    the focus does not have to be visible as per browsers heuristics), *    remove the focus outline. This is the native checkboxs behaviour where *    the focus is not visible when clicking it. */.Toggle__input:focus:not(:focus-visible) + .Toggle__display {  outline: 0; /* 1 */}

Проверенное состояние

Затем нам нужно разобраться с проверенным состоянием. В этом случае мы хотим сделать две вещи: обновить цвет фона toggle с красного на зеленый и сдвинуть handle вправо, чтобы он закрыл крестик и показал галочку (100% собственной ширины).

/** * 1. When the input is checked, change the display background color to a *    pale green instead.  */.Toggle__input:checked + .Toggle__display {  background-color: #e3f5eb; /* 1 */}/** * 1. When the input is checked, slide the handle to the right so it covers *    the cross icon instead of the checkmark one. */.Toggle__input:checked + .Toggle__display::before {  transform: translate(100%, -50%); /* 1 */}

Adrian Roselli справедливо заметил, что эта схема не учитывает возможное "смешанное" (или "неопределенное" состояние). Это справедливо для простоты, поскольку большинство флажков/тумблеров не нуждаются в таком состоянии, но его следует учитывать, когда это необходимо.

Отключенное состояние

Наконец, мы можем добавить несколько пользовательских стилей, чтобы сделать отключенный toggle более явным.

/** * 1. When the input is disabled, tweak the toggle styles so it looks dimmed  *    with less sharp colors, softer opacity and a relevant cursor. */.Toggle__input:disabled + .Toggle__display {  opacity: 0.6; /* 1 */  filter: grayscale(40%); /* 1 */  cursor: not-allowed; /* 1 */}

Поддержка право-лево

Изначально я забыл о поддержке право-лево, и Adrian Roselli был достаточно любезен, чтобы указать мне на это, поэтому я обновил код. В идеале мы должны использовать псевдо-класс :dir() , но, к сожалению, на данный момент браузеры поддерживают его довольно плохо, поэтому нам приходится полагаться на селектор атрибута [dir].

Нам нужно настроить все, что в настоящее время направлено так, чтобы было исходное и проверенное положение handle.

/** * 1. Flip the original position of the unchecked toggle in RTL. */[dir='rtl'] .Toggle__display::before {  left: auto; /* 1 */  right: var(--offset); /* 1 */}/** * 1. Move the handle in the correct direction in RTL. */[dir='rtl'] .Toggle__input:checked + .Toggle__display::before {  transform: translate(-100%, -50%); /* 1 */}

Иконки

Наконец, мы применим некоторые стили к нашим иконкам, как рекомендует Florens Verschelde в своем фантастическом руководстве по SVG-иконкам:

.Toggle__icon {  display: inline-block;  width: 1em;  height: 1em;  color: inherit;  fill: currentcolor;  vertical-align: middle;}/** * 1. The cross looks visually bigger than the checkmark so we adjust its *    size. This might not be needed depending on the icons. */.Toggle__icon--cross {  color: #e74c3c;  font-size: 85%; /* 1 */}.Toggle__icon--checkmark {  color: #1fb978;}

Вариант кнопки

Как упоминалось ранее, использование флажка не обязательно является наиболее подходящей разметкой. Если toggle имеет немедленный эффект (и поэтому полагается на JavaScript), и если он не может иметь неопределенное состояние, то вместо него следует использовать элемент <button> с атрибутом aria-pressed.

Adrian Roselli в своем материале о toggles предлагает дерево решений для выбора между флажком и кнопкой.

К счастью, наш код легко адаптировать, чтобы он работал так же, как и кнопка. Во-первых, мы изменим HTML таким образом, что <label> станет <button>, а <input> будет удален.

<button class="Toggle" type="button" aria-pressed="false">  <span class="Toggle__display" hidden>    <!-- The toggle does not change at all -->  </span>  This is the label</button>

Затем нам нужно убедиться, что <button> не похожа на саму кнопку. Для этого мы сбросим стили кнопки по умолчанию, включая контур фокуса, поскольку он применяется при toggle (переключении).

/** * 1. Reset default <button> styles. */button.Toggle {  border: 0; /* 1 */  padding: 0; /* 1 */  background: transparent; /* 1 */  font: inherit; /* 1 */}/** * 1. The focus styles are applied on the toggle instead of the container, so *    the default focus outline can be safely removed. */.Toggle:focus {  outline: 0; /* 1 */}

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

+ .Toggle:focus .Toggle__display,.Toggle__input:focus + .Toggle__display {  /*  */}+ .Toggle:focus:not(:focus-visible) .Toggle__display,.Toggle__input:focus:not(:focus-visible) + .Toggle__display {  /*  */}+ .Toggle[aria-pressed="true"] .Toggle__display::before,.Toggle__input:checked + .Toggle__display::before {  /*  */}+ .Toggle[disabled] .Toggle__display,.Toggle__input:disabled + .Toggle__display {  /*  */}+ [dir="rtl"] .Toggle[aria-pressed="true"] + .Toggle__display::before,[dir="rtl"] .Toggle__input:checked + .Toggle__display::before {  /*  */}

Вот и все! Таким образом, мы можем использовать либо разметку флажка, либо разметку кнопки, в зависимости от того, что больше подходит для данной ситуации, и иметь одинаковые стили в обоих случаях. Очень удобно!

Заключение

Как видите, ничего особо сложного в этом нет, но все же есть над чем подумать. Вот чего мы добились:

  • Мы используем реальный элемент формы флажка, который мы стилизуем под toggle.

  • Он передает свой статус с помощью иконографии и цвета.

  • Он не оставляет артефактов, когда CSS недоступен.

  • Он имеет собственные стили по фокусу и может быть настроен.

  • У него есть отключенное состояние.

  • При необходимости он имеет поддержку право-лево.

  • Он должен быть относительно легко адаптирован к темному режиму при наличии некоторых глобальных пользовательских свойств.

Здорово! Не стесняйтесь играть с кодом на CodePen, и я надеюсь, что это поможет вам сделать ваши toggles доступными. А также, я рекомендую прочитать эти статьи, чтобы продвинуться дальше:

Примечание

Dion упоминает, что toggle может выглядеть наоборот, и это мнение поддерживает Rawrmonstar, а Mikael Kundert упоминает, что использование флажков обычно проще.


Узнать подробнее о курсе"HTML/CSS"

Смотреть открытый урокCSS Reset ненужный артефакт или спасательный круг

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru