Javascript-форум (https://javascript.ru/forum/)
-   (X)HTML/CSS (https://javascript.ru/forum/xhtml-html-css/)
-   -   имена классов в html верстке (https://javascript.ru/forum/xhtml-html-css/21840-imena-klassov-v-html-verstke.html)

vflash 26.09.2011 15:51

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

известным аналогом является БЭМ . на текуший момент основные отличия это другие "разделители", подход к префиксам, также отличается понятие модификатор.

в сочетании с domMaster и css_стилей в js коде (пример) получается убойная штука.

x-yuri 29.09.2011 02:51

вообще, для меня основное преимущество подобных подходов - упрощение поддержки, т.е. поменьше наследования и связей. Вот недавно понял, что лучше написать отдельные стили для нескольких контейнеров, пусть и похожих, чем сделать один компонент, который учитывает все варианты. Дизайнеры, они ведь такие люди, что обязательно скажут: "А вот здесь пожалуйста на 1px больше" :) От префиксов сейчас решил попробовать отказаться, по-моему они не дают значительной выгоды. Для имен использую camelCase (имяКомпонента-имяЭлемената), да и вообще на клиентской стороне - в результате проще искать по проекту. И собственно по этой же причине идея с дефисом в именах мне больше всего не нравится, в этом случае vim считает такое имя, состоящим из нескольких слов.

Цитата:

Сообщение от vflash
в сочетании с domMaster и css_стилей в js коде (пример) получается убойная штука.

в чем убойность? Мне такой вариант больше нравится

vflash 29.09.2011 11:30

Цитата:

Сообщение от x-yuri
Дизайнеры, они ведь такие люди, что обязательно скажут: "А вот здесь пожалуйста на 1px больше"

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

Цитата:

Сообщение от x-yuri
От префиксов сейчас решил попробовать отказаться

префиксы нужны хотябы для того чтобы отличить какрас те классы (описал выше) которые модифицируют компонента. еше классы без префиксов использую только для связки с полным именем"
<style>
    .b-project_ubutton--icon .icon {....}
</style>
<button class="b-project_ubutton b-project_ubutton--icon">
    <span class="b-project_ubutton-icon icon">..</span>
</button>.

но это на этапе разработке а позже ".icon" привожу по возможности к полной форме
<style>
    .b-project_ubutton--icon .b-project_ubutton-icon {....}
</style>
<button class="b-project_ubutton b-project_ubutton--icon">
    <span class="b-project_ubutton-icon">..</span>
</button>

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

x-yuri 01.10.2011 07:37

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

x-yuri 10.10.2011 15:01

вообще, наверное, в первую очередь дело в том, что я решил сделать для форм какой-то общий стиль. А потом пожалел. Но в любом случае, я модификаторами почти не пользуюсь, посмотрим...

x-yuri 10.10.2011 15:07

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

vflash 10.10.2011 16:45

лакировка. теперь "компонент" называют "объектом" :) это слово хорошо вписывается и в интернете встречается.

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

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

x-yuri 10.10.2011 22:11

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

а слово объект по-моему не подходит: оно более общее и не обязательно обозначает что-то визуальное. Да и подобных названий и так много: элемент, виджет, компонент. Зачем еще одно?

Seva1986 11.10.2011 00:04

vflash,


А есть ссылка на какойнибудь готовый сайт с использованием этого приёма?

я по коду лучше пойму....

vflash 11.10.2011 02:31

x-yuri,
<div class="clear_fix miniblock">
  <div class="label fl_l">Любимые игры:</div>
  <div class="labeled fl_l">...</div>
</div>

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

Цитата:

Сообщение от x-yuri
а слово объект по-моему не подходит: оно более общее и не обязательно обозначает что-то визуальное. Да и подобных названий и так много: элемент, виджет, компонент. Зачем еще одно?

объект уже употреблялся для верстки как "ОПП верстка", потому решил что лучше не плодить термины. нет такой проблемы как у БЭМ. в БЭМ это блок, а блок уже давно употребляется в верстке как div элемент или display:block; . у меня както с этим путаница, потому не нравиться их термин.

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

тут мои
http://vflash.ru/xm/dev.html
http://mail.rambler.ru/m/beta/#/contacts
есть еше но не покажу.

Seva1986 11.10.2011 09:02

Цитата:

Сообщение от vflash
http://vflash.ru/xm/dev.html
http://newmail.rambler.ru/m/beta/#/contacts


спасибо ознакомлюсь....


По второй ссылке нужна авторизация...

x-yuri 11.10.2011 10:34

Цитата:

Сообщение от vflash
если речь об этом то там вроде только в одном месте.

что-то подобное есть в поиске и списке друзей. Только там другие названия полей (Имя, Выпуск, Факультет) и расстояние между строками немного другое. А вообще я согласен, что это не важно. Если что, можно переделать.

Цитата:

Сообщение от Seva1986
По второй ссылке нужна авторизация...

веб-почта такая веб-почта...

можешь вот это еще почитать...

vflash 11.10.2011 10:59

Цитата:

Сообщение от x-yuri
можешь вот это еще почитать...

этот принцип какбы и был основой развития. ведь по сути способ наименования нужен для того чтобы в итоге получились уникальные имена классов. уникальные классы нужны чтоб соблюсти независимость "css правил" , а эта независимость нужна чтоб можно было строить объектами.
доклад Харисова дал основу. точнее удачное название доклада "Вёрстка независимыми блоками" , а сам доклад очень долго не мог найти. И сейчас документация для БЭМ появилась вот только этой осенью ито если не понимать смысла происходящего то сложно понять о чем она.

Seva1986 11.10.2011 14:40

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

вот кстати способствующие этому нововведения css
http://habrahabr.ru/blogs/css/112101/

x-yuri 11.10.2011 16:15

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

Цитата:

Сообщение от Seva1986
ооп должно быть везед где можно...

нету ничего что должно быть везде где можно ;)

Seva1986 11.10.2011 17:05

Цитата:

Сообщение от x-yuri
нету ничего что должно быть везде где можно

нет ничего что должно быть везде...

НО там где МОЖНО должно быть....

x-yuri 11.10.2011 17:14

можно развести костер прямо в доме, но я бы этого не делал. Твоя фраза пропагандирует бездумное использование. Использовать надо если нужно, а не можно. Я понимаю, что тебе очень нравится ООП, но это не значит, что его нужно пихать во все дыры. ;)

Seva1986 11.10.2011 18:18

x-yuri,


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

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

имелось ввиду где можно (есть необходимость ,надобность) а не можно как разрешение пихать везде где влезит...

x-yuri 18.10.2011 18:03

наткнулся только что:
Цитата:

Примерно тогда же, мы начали использовать что-то типа венгерской нотации, указывая разные префиксы для разных типов блоков. Были разные b-, l-, w-, g- и ещё какие-то, но в итоге можно считать выжившими b- для визуальных самостоятельных блоков и i- для вспомогательных, не использующихся в явном виде самостоятельно. Стоит сказать, что сейчас эти префиксы уже скорее дань истории и та часть, которую мы не меняем по причине сильной распространённости внутри, а вовсе не что-то обязательное (без префиксов легко можно жить!).
http://clubs.ya.ru/bem/replies.xml?i...reply-bem-1124

vflash 20.10.2011 00:47

Цитата:

Сообщение от x-yuri
наткнулся только что:

это был ответ на мой комментарий )

префиксы нужны. без них будет каша как в голове так и на выходе в верстке.
b- это каркас. какбы объект в голом виде. (o- не красиво выглядит)
m- класс от родительского объекта. часто из за лени оставляю как b-. но если выставить то упрощает восприятие результата.
s- использую для классов которые рассчитаны для разных скинов. удалив эти классы каркас не сломается. можно запросто клонировать объекты изменив имя объекта и удаляя эти классы.
i- у меня это картинки в background . можно как в БЭМ сказать что это чтота там.


стоит заметить что у меня префикс не является частью имени объекта. в БЭМ это часть имени объекта. И может по этому в БЭМ префикс дает подсказку на вопрос "что это за объект?" , в моем случаи "что это за класс?"

tenshi 20.10.2011 11:21

префиксы нужны и не только в цсс. как бы ни хотелось "не повторять себя", но при рефакторинге это сильно окупается. http://habrahabr.ru/blogs/personal/97670/

tenshi 20.10.2011 11:25

кстати, обрати внимание на строчку
.b-person-info.m-user { border-color: red }

без пробела между классами означает пересечение, так что если есть возможность забить на ие6, то такой способ предпочтительнее. чем
.b-person-info_user { border-color: red }

vflash 20.10.2011 12:22

Цитата:

Сообщение от tenshi
то такой способ предпочтительнее. чем

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

<style>
.eee.ccc {color:#F00;}
.sss {color:#0F0;}
</style>
<span class="eee ccc sss">text</span>


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

возможно я ошибаюсь.

x-yuri 20.10.2011 16:04

не все могут просмотреть твою ссылку, tenshi

tenshi 21.10.2011 02:38

там регистрацию чтоли требуют?

x-yuri 21.10.2011 02:42

ага
Цитата:

Доступ к публикации ограничен
Вы пытаетесь открыть страницу, доступную только подписчикам блога «Персональные блоги».
Подписка на блог доступна любому пользователю, зарегистрированному на Хабрахабре. Достаточно зайти на страницу блога и присоединиться к нему.
Если у вас есть аккаунт на Хабрахабре, вы можете войти под своим логином.
Подробнее о регистрации можно прочесть в разделе «Помощь».

tenshi 21.10.2011 11:13

вот и публикуй после этого статьи на этом недоресурсе =_="

tenshi 21.10.2011 11:17

скопировал сюда: http://javascript.ru/node/12075

vflash 03.11.2011 15:18

делал маленький "доклад" среди своих в компании.
вот презентация . без озвучки это конечно неочем.

tenshi 04.11.2011 17:52

бэм со своими разделителями? а смысл?

vflash 05.11.2011 01:33

tenshi,
Презентация была про то чтоб верстать объектно (разбить на мелкие части и верстать маленькими кусками). Так сказать для популяризации. Ничего нового в этом нет.

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

приведу пример почему способ наименования принятый в БЭМ не самый удачный:

При верстке каждый объект описывается в своем шаблоне. Имя этому шаблону задаю такоеже как и имя объекта. И тут есть проблема у БЭМ, не все шаблонизаторы позволяют использовать дефис в имени шаблона.

Еше в редакторе (Notepad++) при двойном клике по имени объекта, это имя объекта будет выделено полностью если в нем использовано подчеркивание , а если будет дефис то выделено будет не полностью . Мелочь , но очень удобно в практике.



Еше так нельзя
var column-proxy = document.querySelector(".b-page-layout__column-proxy");

а так можно
var subj_firstline = document.querySelector(".b-mbox_row-subj_firstline");

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

я бы стал использовать правила принятые в БЭМ , потому как его многие стали применять, но он мне неудобен в этих мелочах.

tenshi 05.11.2011 10:31

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

поэтому лучше так:
var subjFirstLine = document.querySelector(".mboxRow_subjFirstLine");

Kolyaj 05.11.2011 10:41

Цитата:

Сообщение от vflash
var subj_firstline

Так нельзя, в JavaScript принят другой стиль наименования переменных.

Цитата:

Сообщение от vflash
var column-proxy

А с этим как раз всё нормально. Есть стандарт преобразования этого в columnProxy.

vflash 05.11.2011 13:05

Цитата:

Сообщение от Kolyaj
Так нельзя, в JavaScript принят другой стиль наименования переменных.

в js есть стандарт допустимых символов и правила их последовательности. а вот стиль это уже прихоть определенной группы или лица.

Цитата:

Сообщение от Kolyaj
А с этим как раз всё нормально. Есть стандарт преобразования этого в columnProxy.

в таком случии если css класс измениться, а такое бывает часто при разработке, то для синхронизации будет достаточно всего один рас сделать замену по документу(ам).
я ведь не про то как правильно назвать, а о том чтобы об этом вообще не думать. Есть имя у элемента , на него уже было потрачено время чтобы придумать так зачем еще тратить когда можно это сделать копипастом.


Цитата:

Сообщение от tenshi
var subjFirstLine = document.querySelector(".mboxRow_subjFirstLine");

в таком случаи двойной клик выделит весь класс. выделить весь класс тоже бывает нужно , но мне както чаше бывает нужно выделить часть. или имя объекта или имя элемента.

можно ведь назвать и так. так класс(css) даже привычней выглядит.
var subjFirstLine = document.querySelector(".b-mboxRow-subjFirstLine");



---
Еще в редакторах Ctrl-[вправо/влево] перемешает курсор по словам, а подчеркивание воспринимают как часть слова. Потому дифис как разделитель и тут оказывается более удобным.


_

Gozar 05.11.2011 14:24

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

Меня сейчас больше интересуют префиксы. Например целесообразно ли использовать префиксы:
f - форум,
p - персональный,
ph - фотосервис ну и т.д.
помимо b и i
?

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

По поводу повторного использования я в курсе.

vflash 05.11.2011 17:44

Цитата:

Сообщение от Gozar
Меня сейчас больше интересуют префиксы. Например целесообразно ли использовать префиксы:
f - форум,
p - персональный,
ph - фотосервис ну и т.д.
помимо b и i
?

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

Цитата:

Сообщение от Gozar
На небольшом проекте ...

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

Цитата:

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

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

Kolyaj 05.11.2011 23:46

Цитата:

Сообщение от vflash
в js есть стандарт допустимых символов и правила их последовательности. а вот стиль это уже прихоть определенной группы или лица.

Угу, и получится месиво как в PHP. Половина функций в одном стиле, половина в другом. В PHP от этого не избавиться, но зачем и в JavaScript такое творить своими руками?


Цитата:

Сообщение от vflash
Есть имя у элемента , на него уже было потрачено время чтобы придумать так зачем еще тратить когда можно это сделать копипастом.

Я поступил проще. У меня есть метод this.getEl(className), который принимает имя класса, возвращает первый элемент с этим классом (внутри виджета). При этом сама кэширует результаты. Поэтому ссылки на элементы я нигде не сохраняю, при необходимости делаю this.getEl() с нужным классом. В результате имя элемента только в CSS.

tenshi 06.11.2011 02:39

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

with( $jam )
with( $wc )
{
// some code
}

Kolyaj 06.11.2011 09:00

Цитата:

Сообщение от tenshi
префиксы нужны для предотвращения конфликтов. поэтому все имена конкретного программиста должны иметь его префикс.

Как это спасёт от того, что ты не помнишь, какие имена со своим префиксом ты использовал год назад?

tenshi 06.11.2011 12:02

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


Часовой пояс GMT +3, время: 21:02.