Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Добавляет статью про Псевдоприватные кастомные свойства #5577

Open
wants to merge 22 commits into
base: main
Choose a base branch
from

Conversation

Alex-Andr-19
Copy link

@Alex-Andr-19 Alex-Andr-19 commented Dec 6, 2024

Описание

Создание статьи в раздел Рецепты про перенос миксинов SASS'а на переменные CSS в атомарных классах.

Превью: https://content-5577.dev.doka.guide/css/pseudo-private-custom-property/

Чек-лист

  • Текст оформлен согласно руководству по стилю
  • Ссылки на внутренние материалы начинаются со слеша и заканчиваются слэшем либо якорем на заголовок (/css/color/, /tools/json/, /tools/gulp/#kak-ponyat)
  • Ссылки на картинки, видео и демки относительные (images/example.png, demos/example/, ../demos/example/)

@github-actions github-actions bot added the рецепт Контент для Рецептов label Dec 6, 2024
recipes/virtual-variables/index.md Outdated Show resolved Hide resolved
recipes/virtual-variables/index.md Outdated Show resolved Hide resolved
recipes/virtual-variables/index.md Outdated Show resolved Hide resolved
recipes/virtual-variables/index.md Outdated Show resolved Hide resolved
@solarrust solarrust changed the title feat: Create article about virtual variables Добавляет статью про Виртуальные переменные Dec 6, 2024
@Alex-Andr-19 Alex-Andr-19 changed the title Добавляет статью про Виртуальные переменные Добавляет статью про Псевдоприватные кастомные свойства Dec 6, 2024
@ra1nbow1

This comment was marked as resolved.

@Alex-Andr-19

This comment was marked as resolved.

Inventoris

This comment was marked as resolved.

@Alex-Andr-19
Copy link
Author

@Inventoris Хорошо, спасибо за совет

@Alex-Andr-19

This comment was marked as resolved.

@github-actions github-actions bot added the статья Расширенный материал label Dec 25, 2024
@TatianaFokina

This comment was marked as resolved.

@Alex-Andr-19

This comment was marked as resolved.

solarrust

This comment was marked as resolved.

@github-actions github-actions bot added the css Контент по CSS label Jan 9, 2025
@Alex-Andr-19
Copy link
Author

Alex-Andr-19 commented Jan 17, 2025

@solarrust Переработал статью под формат CSS статей. За основу взял кастомные свойства. Надеюсь в этот раз получилось по лучше)

@TatianaFokina TatianaFokina removed the рецепт Контент для Рецептов label Jan 22, 2025
Copy link
Member

@solarrust solarrust left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Получилось очень круто! Спасибо тебе =)

От меня аппрув.
Зову @skorobaeus помочь с демками 🧚‍♀️

Copy link
Member

@skorobaeus skorobaeus left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Привет! С демками всё хорошо :) К ним только нужно прикрутить стили отсюда: https://github.com/doka-guide/content/blob/main/docs/demos/style.md

Нам потребуются цвета и шрифты. Если возникнут сложности, я сделаю всё сама, но, видимо, уже после того, как уйдёт рассылка :)

Copy link

Превью контента из 2981f7f опубликовано.

Copy link
Member

@skorobaeus skorobaeus left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Привет ещё раз!

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

У док и статей есть типовая структура, давай попробуем её соблюсти.

Эту статью очень украсит вводная часть, но не формальная, для галочки, а по существу. В такой вводной части первым делом стоит объяснить простыми словами что такое псевдоприватные кастомные свойства. Рассказать, зачем они нужны: чтобы изолировать стили, избегать конфликтов, давать пользователям рычаги для настройки компонентов, не трогая внутреннюю логику, и т.д. И наконец, отметить, что это синтаксический сахар и показать, как пишется. Чем чётче и яснее здесь пример кода, тем лучше; он не обязан быть связан с демкой.

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

Наконец, завершаем статью: договариваем всё, о чём не договорили, делаем выводы.

Прости, пожалуйста, за такую простыню фидбека 😅 Я очень обрадовалась возможности избавиться от миксинов и теперь очень хочу, чтобы из этой статьи получилась конфетка :)

Comment on lines +104 to +108
При таком подходе объём кода увеличился и читаемость стала значительно ниже. Также прямое использование кастомных свойств не дало возможности увеличить количество классов.

В таком случае очень хочется применить миксины или функции из препроцессоров.

Приносить в проект препроцессоры для решения задачи перекраски карточек не выглядит как разумное решение.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Поставим себя на место читателя. Это человек, который слышал про "псевдоприватные кастомные свойства" вскользь, а, может, и не слышал вовсе, и вот теперь он пришёл к нам узнать, что же это такое.

К этому моменту читатель промотал уже 4 экрана, и всё ещё не увидел ответа на вопрос: что такое псевдоприватные кастомные свойства? Мы добавим вводную часть и обязательно ответим на этот и другие вопросы, а пока поработаем с примером, в код которого читателю предлагается вникнуть.

Вообще, пример — это очень хорошо! Фронтенд это не теория :) Но не очень хорошо, когда пример сопровождается такими пояснениями как "очевидно", "очень хочется применить N", "не выглядит как разумное решение". Давай по-маленьку избавимся от таких "заходов" и станет лучше :)

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

Не будем говорить "очень хочется применить миксины или функции препроцессоров, но это неразумное решение", а подтолкнём читателя к тому, чтобы сделать этот вывод самостоятельно. Ведь если всё то же самое можно сделать на чистом CSS, то зачем тянуть препроцессоры?

Comment on lines +110 to +168
## Что такое псевдоприватность?

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

Например, в JavaScript и Python принято писать нижнее подчёркивание перед самим именем поля или метода:

```js
const someObj = {
publicValue: 42,
_privateValue: "42"
}
```

Также существует вариант с подчеркиванием в конце имени.

Если разработчик захочет напрямую обратиться к полям с подобным названием, то TypeScript будет выбрасывать ошибки.

## Псевдоприватность в CSS

Кастомные свойства CSS наследуются внутрь всех дочерних элементов по умолчанию.

Также нет возможности инкапсулировать свойство для конкретного класса:

```html
<div class="first second"></div>
```

Все кастомные свойства, которые определены в классе `first`, будут также доступны для чтения и изменения в классе `second`.

В этот момент и возникает необходимость псевдоприватности кастомных свойств.

```html
<div class="product-card new">
Карточка 1
</div>
```

```css
.product-card {
--_background-color: #46ad8e;
--_border-radius: 12px;

background-color: var(--_background-color);
border-radius: var(--_border-radius);
box-shadow: 4px 5px 5px 1px hsl(from var(--_background-color) h s calc(l * 0.8));
}

.new {
--background-color: #45b9bb;

box-shadow: 4px 5px 5px 1px hsl(from var(--background-color) h s calc(l * 0.8));
}
```

В данном случае мы видим, что в разных классах существуют незвисимые кастомные свойства. В классе `product-card` свойства «закрыты» псевдоприватностью.

При всём этом цвет тени напрямую зависит от цвета фона в каждом из классов.

Фактически значение [`box-shadow`](/css/box-shadow/) зависит только от кастомного свойства.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Эти две секции могут стать основой для вводной части статьи.

Comment on lines +213 to +244
## Решение поставленной задачи

```css
.product-card {
/* Псевдоприватное кастомное свойство */
--_background-color: var(--background-color, #123E66);
/* ---------------------------------- */

display: flex;
justify-content: center;
align-items: center;

background-color: var(--_background-color);
box-shadow: 2px 5px 5px 0 hsl(from var(--_background-color) h s calc(l * 0.7));

font-size: 48px;
color: hsl(from var(--_background-color) 0 0 calc((50 - l) * 100));

&.new {
/* Значение псевдоприватного кастомного свойства */
--background-color: #2E9AFF;
/* --------------------------------------------- */
}
&.top {
/* Значение псевдоприватного кастомного свойства */
--background-color: #F498AD;
/* --------------------------------------------- */
}
}
```

<iframe title="Решение с псевдоприватными свойствами" src="demos/pseudo-privates/" height="350"></iframe>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Comment on lines +200 to +211
## Как псевдоприватность может заменить миксины препроцессоров?

Выше описан способ «передачи» кастомных свойств в другие между смежными классами.

Такое можно сравнить с передачей аргументов функции или, в контексте стилей, миксину препроцессора.

Аналогия с миксинами:

1. Имя миксина — имя атомарного класса.
1. Стили миксина — стили атомарного класса.
1. Аргумент — кастомное свойство, принимаемое псевдоприватным.
1. Внутренняя переменная — псевдоприватное кастомное свойство.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Это завершающая часть статьи: проводим аналогии и подводим итог.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
css Контент по CSS статья Расширенный материал
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants