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

BEM-подход и наследование от родителя #2

Open
Spirik opened this issue Feb 17, 2015 · 10 comments
Open

BEM-подход и наследование от родителя #2

Spirik opened this issue Feb 17, 2015 · 10 comments

Comments

@Spirik
Copy link
Member

Spirik commented Feb 17, 2015

Мой вопрос из письма касаемо описанной @a-frolovsky системы.

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

Просто сказать “мы против каскадов” конечно замечательно, но на практике неизбежно будут возникать такие ситуации.

Например. Есть вёрстка блока со списком апдейтов. (У меня тут .block-name, .block-name_element-name, .-modifier).

.feed
  .update
    .update_author
      .user
        .user_avatar
        .user_name
    .update_content
  .update
  .update
  <…>

На Лэндинге нужно вывести этот же фид, но слегка в модифицированном виде (увеличить отступы между апдейтами, увеличить размер аватарки пользователя). Как этого добиться?

Вешать модификаторы на каждый изменённый элемент (т.е., “пробрасывать” их внутрь блока фида)?

.feed.-landing
  .update.-landing
    .update_author
      .user.-landing
        .user_avatar
        .user_name
    .update_content
  .update.-landing
  .update.-landing
  <…>

Завести врапперы-элемены блока .feed, чтобы задавать отступы через них, а не непосредственно через блоки .update?

.feed.-landing
  .feed_update
    .update
      .update_author
        .user.-landing
          .user_avatar
          .user_name
      .update_content
  .feed_update
    .update
  .feed_update
    .update
  <…>

Или, всё-таки, допускается каскад от .feed.-landing (чтобы, скажем, не перегружать паршал фида логикой навешивания классов-модификаторов)? Тогда в файл со стилями какого блока правильнее было бы его определить, feed или в стили блоков, затронутых изменениями?

@antonfrolovsky
Copy link
Contributor

Конечно проще переопределить стили блока .bar внутри блока .foo, но в этом случае появляется зависимость одного блока от другого, и код блоков разбегается по структуре проекта.
Если какой-то класс искать по проекту, он будет встречаться во многих местах и тут приходиться больше думать.
Идея в том что бы структура была понятна сходу.

Поэтому лучше добавить модификатор внутри блока который нужно изменить.

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

P.S.
У блока в идеале не должно быть больше 2х уровней вложенности (иногда конечно бывает 3)

То есть у блока есть элементы, а у элементов не должно быть элементов (иногда допускается).
Пример:
ul.menu
li.menu-item
a.menu-link (элемент menu, но не menu-item-link)

On 17 Feb 2015, at 3:54 pm, Alexander Spiridonov [email protected] wrote:

Мой вопрос из письма касаемо описанной @a-frolovsky https://github.com/a-frolovsky системы.

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

Просто сказать “мы против каскадов” конечно замечательно, но на практике неизбежно будут возникать такие ситуации.

Например. Есть вёрстка блока со списком апдейтов. (У меня тут .block-name, .block-name_element-name, .-modifier).

.feed
.update
.update_author
.user
.user_avatar
.user_name
.update_content
.update
.update
<…>
На Лэндинге нужно вывести этот же фид, но слегка в модифицированном виде (увеличить отступы между апдейтами, увеличить размер аватарки пользователя). Как этого добиться?

Вешать модификаторы на каждый изменённый элемент (т.е., “пробрасывать” их внутрь блока фида)?

.feed.-landing
.update.-landing
.update_author
.user.-landing
.user_avatar
.user_name
.update_content
.update.-landing
.update.-landing
<…>
Завести врапперы-элемены блока .feed, чтобы задавать отступы через них, а не непосредственно через блоки .update?

.feed.-landing
.feed_update
.update
.update_author
.user.-landing
.user_avatar
.user_name
.update_content
.feed_update
.update
.feed_update
.update
<…>
Или, всё-таки, допускается каскад от .feed.-landing (чтобы, скажем, не перегружать паршал фида логикой навешивания классов-модификаторов)? Тогда в файл со стилями какого блока правильнее было бы его определить, feed или в стили блоков, затронутых изменениями?


Reply to this email directly or view it on GitHub #2.

@Spirik
Copy link
Member Author

Spirik commented Feb 17, 2015

@a-frolovsky:

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

Стало быть вариант:

.feed.-landing
  .feed_update
    .update
      .update_author
        .user.-landing
          .user_avatar
          .user_name
      .update_content
  .feed_update
    .update
  .feed_update
    .update
  <…>

Правильно?

При этом ты имеешь в виду исключительно дочерние элементы, не дочерние блоки? Блоки же могут вкладываться в другие блоки без обязательной необходимости оборачивать их во врапперы-элементы, но каскадом я могу добраться только до элементов?

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

@antonfrolovsky
Copy link
Contributor

Да

On 17 Feb 2015, at 5:29 pm, Alexander Spiridonov [email protected] wrote:

@a-frolovsky https://github.com/a-frolovsky:

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

Стало быть вариант:

.feed.-landing
.feed_update
.update
.update_author
.user.-landing
.user_avatar
.user_name
.update_content
.feed_update
.update
.feed_update
.update
<…>
Правильно?

При этом ты имеешь в виду исключительно дочерние элементы, не дочерние блоки? Блоки же могут вкладываться в другие блоки без обязательной необходимости оборачивать их во врапперы-элементы, но каскадом я могу добраться только до элементов?

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


Reply to this email directly or view it on GitHub #2 (comment).

@Spirik
Copy link
Member Author

Spirik commented Feb 17, 2015

@a-frolovsky, а так можно, .-landing .user? Т.е., повесить модификатор на общего родителя всех модифицируемых блоков и элементов, в данном случае .feed.-landing, и от модификатора построить мини-каскад, и, т.о., никуда ничего лишнего не пробрасывать, ограничившись родительским модификатором для построения правила?

@antonfrolovsky
Copy link
Contributor

@Spirik Можно делать что хочешь :) но в таком случае стили блоков расползутся по всей структуре, а оно тебе нужно?

@Spirik
Copy link
Member Author

Spirik commented Feb 18, 2015

@a-frolovsky Почему? Расползутся только модификаторы (а они и так расползутся, если ты будешь придерживаться более-менее конзистентного их именования).

Так что стили блока и все его переопределённые вариации останутся на своём месте - в файле стилей блока. Просто переопределённые правила начнутся с каскада от модификатора.

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

@antonfrolovsky
Copy link
Contributor

@Spirik Не хочешь, а надо :) методология вводит свои правила. Нужно брать и пробовать.

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

@antongunkin
Copy link

Возможно, придётся делать и так и так, жалко будет каша. CSS конечно будет красивее, если писать модификатор у каждого sub-элемента .user.-landing. Но если пробрасывать класс-модификатор через JS, или просто делать &:hover .user, то всё-равно придётся снизу фигачить мини-каскад модификатор. Но я за первый вариант - модификатор к каждому элементу.

@antongunkin
Copy link

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

.block
  color: magenta
  &_user
    color: green
    +breakpoint(tablet)
      color: yellow
    .block:hover &,
    &.-active
      color: red
      +breakpoint(tablet)
        color: blue

@Spirik
Copy link
Member Author

Spirik commented Feb 22, 2015

Собственно, к вопросу о наследовании от родительских модификаторов: https://github.com/a-frolovsky/demoapp/pull/1 .

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants