Попытка завоевать мир сделать лучший Web Framework, действительно облегчающий разработку и поддержку сайта. А так же систематизировать подходы к вёрстке и описать удобную схему вёрстки сайтов, как больших, так и маленьких.
|
премодерируемый клуб |
О клубе | 6 февраля 2009 года, 23:25 |
Попытка |
записи по месяцам · меткам · типам |
toivonens написала | изменено 1 февраля, в 12:01 |
СоциальщинаМы сделали группу в Facebook, присылайте заявки. Актуальные задачиВ трекере библиотеки bem-bl всегда есть задачи. Сейчас важно перевести существующую документацию на английский, вот список тасков: https://github.com/bem/be Workflow работы такой:
ВакансияУ нас в команде есть вакансия разработчика интерфейсов. Но сначала надо сделать Pull Request. |
toivonens поделилась ссылкой | 21 ноября 2011 года, 16:54 |
Большая статья о том, что такое БЭМ. С картинками. |
toivonens написала | 18 ноября 2011 года, 18:56 |
Блок b-menu-vert - это меню с вертикальной ориентацией. На странице документации блока видно, что у блока есть разные элементы. Но не все они обязательны к использованию. Простое вертикальное менюВ простейшем случае в BEMJSON достаточно объявить блок и перечислить его элементы item в свойстве content: {В получившемся HTML появляются не только узлы для блока и явно заданных элементов item, но и разметка для элементов layout и layout-unit. Эти элементы отвечают за геометрическую отрисовку блока. В качестве контента элементов item в простых случаях используются ссылки: {Кроме того, у одного из элементов item может быть модификатор { state : 'current' }, отмечающий выделенный пункт меню. Модификатор используется как для визуального выделения пункта при помощи CSS-правил для этого модификатора, так и для описания функционального поведения. {
В BEMJSON описании меню может быть указано свойство title, задающее элемент title для заголовка меню: {
Предусмотрена и возможность создания пустого элемента списка для отделения одних пунктов меню от других. За это отвечает элемент separator. {Пример простого меню со ссылками содержится и в рпепозитории библиотеки bem-bl. Вертикальное js-меню с псевдо-ссылкамиЕсли вместо ссылок нужно использовать псевдо-ссылки, BEMJSON меню должен отличаться содержанием элементов item: {Кроме внешнего вида, js-меню отличается и клиентской функциональностью: оно способно по клику левой кнопкой мыши переключать соответствующий пункт меню в состояние { state : 'current' } и генерировать на js-объекте, соответствующем блоку, событие о факте переключения пункта меню. {
Пример простого вертикального js-меню есть в папке блока в библиотеке bem-bl. Вертикальное js-меню со сложным контентомПункты меню могут содержать не один, а несколько блоков. В библиотеке bem-bl есть пример такого меню. Его пункты помимо ссылок содержат иконки. Поскольку реакция на клик необходима для всего содержания пункта меню, элемент item-selector используется в таком случае в явном виде, являясь контейнером для содержания пункта меню. В этом случае он представлен в DOM-дереве узлом span: {
Раскрывающееся вертикальное js-менюПереключение активного пункта меню - не единственная реализованная динамическая функциональность. Пункты меню также могут содержать элементы trigger, клик по которым открывает или скрывает дочерний контент. С помощью таких элементов можно реализовать скрывающиеся вложенные меню. Так же, как и элемент item-selector, элемент trigger может использоваться не явно, а через mix. {
Кроме элемента item-selector здесь используется свойство item-content, описывающее элемент item-content с содержанием, которое показывается или скрывается в зависимости от кликов по элементу item-selector. Элемент trigger-icon используется только для обозначения иконки. На уровне переопределения соответствующего примера в bem-bl реализованы CSS-правила, показывающие одну иконку для триггера с открытым состоянием и другую для триггера с закрытым состоянием. По умолчанию элемент trigger не содержит модификатора state, а элемент item-content не содержит модификатора visibility. В этом состоянии содержание элемента item-content не видно. Если нужно сразу показать вложенное меню раскрытым, эти модификаторы следует явно задать в BEMJSON-описании блока: {'item-content': {
В библиотеке bem-bl также есть пример меню с неоднократной вложенностью триггеров. Вложенные менюBEMJSON позволяет вкладывать одни блоки в другие. Содержанием пункта меню может быть другое меню, и тогда естественным образом образуется вложенность. Если есть необходимость визуально представить меню как вложенное, но функционально - как один блок (например, со сквозным поведением активного пункта меню), нужно воспользоваться элементом submenu. Элемент submenu должен содержаться в элементе item-content и включать в себя описание элементов item для "подменю". Пример для вложенного меню в библиотеке bem-bl демонстрирует такое BEMJSON-описание. Сквозные вложенные меню работают и с триггером, BEMJSON для такого случая можно посмотреть в соответствующем примере. |
toivonens написала | 16 ноября 2011 года, 14:16 |
JavaScript реализация блока b-menu-horiz обеспечивает следующее поведение:
Точно такая же функциональность нужна и для вертикального меню. Поэтому она реализована в блоке-хелпере i-menu (абстрактное меню). ( Как реализовано JavaScript-меню )Для начала рекомендуется ознакомиться с базовыми понятиями JavaScript-реализации в библиотеке bem-bl: bem.github.com/.../i-bem.ru.html. JavaScript-реализация блока b-menu-horiz в этом случае сводится к декларации блока с указанием базы: BEM.DOM.decl({ name: 'b-menu-horiz', baseBlock: 'i-menu' });Такая запись означает, что все методы и свойства JavaScript-объекта блока будут унаследованы от i-menu. JavaScript блока i-menuБлок i-menu задекларирован как блок, имеющий DOM-представление: BEM.DOM.decl('i-menu', У блока есть динамические и статические методы и свойства. Наличие статического метода live блока означает, что bem-объект (JavaScript объект в памяти браузера) создаётся не сразу при общей инициализации блоков на странице, а при возникновении определённых условий. live : function() { В теле метода использован метод liveBindTo, позволяющий инициализировать блок при возникновении события. В данном случае - при возникновении события leftclick на любом из элементов item-selector блока. Метод onItemSelectorClick относится к конкретному инстансу блока и, соответственно, реализован как динамический метод блока: onItemSelectorClick : function(e) { В результате работы этого метода соответствующий пункт меню приобретает модификатор { state : 'current' }. Для вычисления соответствующего пункта меню используется метод _getItemByEvent: _getItemByEvent : function(e) { Поскольку клик случается не на элементе item, его нужно вычислять относительно элемента, на котором возникло событие. При переключении какого-либо пункта меню в активное состояние на bem-объекте блока возникает событие trigger. Код, обеспечивающий это, записан в декларативном стиле в свойстве onElemSetMod блока: onElemSetMod : { Эта функция исполняется при любой попытке приобретения элементом item модификатора state в значении current (не только при клике). Например, если существует какой-то другой блок, который в ходе своей работы меняет текущий пункт меню, функция исполнится. Функция возвращает false в том случае, если данный элемент находится в состоянии disabled (это тоже значение модификатора state). Возвращение функцией значения false отменяет установку модификатора. То есть неактивный пункт меню не может стать выделенным. В результате работы функции при каждом переключении активного пункта меню на блоке возникает событие trigger с данными о предыдущем и текущем активном пункте меню. Это событие может слушать другой блок, и по факту возникновения этого события выполнять какие-либо действия. Дополнительная информация по JavaScript-реализациям в библиотеке bem-bl: |
Блок b-menu-horiz создаёт HTML-разметку для горизонтального меню. Кроме того, у блока есть JavaScript-функциональность, позволяющая создавать скрипты с реакцией на выбор пункта меню. Сложность HTML-разметки меню зависит от модификатора, с которым используется блок. Реализован модификатор блока layout с тремя возможными значениями:
Без модификатоора layout блок использоваться не может. ( Как использовать разные горизонтальные меню )Простое горизонтальное менюВходные данные для блока с любым из этих модификаторов похожи: нужно описать блок, модификатор layout, в качестве свойства content блока перечислить пункты меню, которые выражаются элементами item: {Содержанием элементов меню может быть что угодно: ссылки на страницы, псевдо-ссылки, иконки и вообще любые блоки. В примере выше каждый пункт меню - это просто строка текста. Такое же меню со ссылками будет выглядеть следующим образом: {Кроме того, у одного из пунктов меню может быть указан модификатор { state: 'current' }, этот модификатор помечает текущий пункт меню. У меню также может быть необязательное свойство title, содержащее описание элемента title - заголовка меню. {Горизонтальное меню с клиентской функциональностьюНе всегда меню на сайте подразумевает ссылки, уводящие пользователя на другую страницу. Меню может использоваться и для клиентского JavaScript-приложения. В этом случае содержанием пунктов меню обычно бывают псевдо-ссылки: {Приведённый выше BEMJSON блока обеспечит нужный внешний вид. {JavaScript код блока реализован так, что активный пункт меню переключается при клике левой кнопкой мыши на соответствующем элементе item-selector. При явном использовании этот элемент представлен в DOM в виде span, в который можно положить блоки, составляющие пункт меню. Если же содержание пункта меню состоит всего из одного блока (как в примере с псевдо-ссылками), для экономии разметки разумно применять mix. Кроме того, что соответствующий элемент item в результате клика приобретает модификатор { state : 'current' }, на bem-объекте блока возникает событие current, сопровождающееся данными о текущем и предыдущем активных пунктах. В HTML по умолчанию блок представлен как имеющий JavaScript-реализацию (он смешан с блоком i-bem и имеет соответствующие параметры в атрибуте onclick). Но если в блоке отсутствуют элементы item-selector, bem-объект блока не создаётся. Меню без подмешивания блока i-bem{Горизонтальное меню с табличной разметкойИспользование блока с модификатором { layout: 'complex' } принципиально ничем не отличается. Для блока в такой модификации создаётся разметка на основе таблицы. Такое решение может потребоваться при некоторых дизайнах. Аскетичное горизонтальное менюВ некоторых случаях для вывода меню не нужны даже DOM-узлы списка, а достаточно просто перечислить ссылки, разделив их пробелом, запятой или каким-либо специальным символом. Для вывода такого меню подходит реализация с модификатором { layout : 'simple' }: {BEMJSON меню отличается наличием свойства separator - того самого специального символа, который разделяет пункты меню. Примеры всех описанных здесь применений блока b-menu-horiz можно найти в директории блока в репозитории библиотеки bem-bl: bem.github.com/bem-bl/.../b-menu-horiz/examples. |
У меня есть мечта. Вообще у меня их много, но сейчас я хочу поделится одной Мой рабочий компьютер — это linux машина. На десктопе я использую Ubuntu 10.04 LTS и я считаю это очень удобным и правильным. В большинстве док рассказывается как работать с BEM с мака, с линукса все очень похоже, но есть небольшие различия. Я поставил перед собой следующие цель создать самое элементарное приложение на BEM. В своем докладе tadatuta рассказывал о создании темы для wordpress. Но поднимать веб сервер с wordpress на своей машине я не стал. Ограничился тем что у меня просто создаются php файлы. Установка необходимых штукДля работы BEM нужен node.js, на убунту он ставится очень просто:
Проверяю что эта балалайка работает. Создаю файл hello.js со следующим содержанием:
Запускаю:
Захожу браузером, все работает. Зашибенно. =) ![]() Судя по шпаргалке к мастерклассу нужно использовать пакетный менеджер nodejs - http://npmjs.org/ Использовать какой-либо другой пакетный менеджер кроме как нативного дебиановского мне не кажется хорошей идеей, но я тем не менее делаю:
В системе появилась команда 'bem', и она работает:
Еще в проекте используется uglifyjs. Чуть-чуть забегаю вперед скажу, что он у меня не заработал, но ставится на убунту он так:
Поехали! Начал фигичать.Создаю папку для проекта:
Забираю нужные файлы:
После получения этого репозитория с github проект выглядит так:
README.md — понятно, чуть-чуть описания. Для тех кто не знаком с github, расширение md - это сокращение от markdown, в этом файле можно использовать специальный синтаксис. make-page — файл для сборки страниц. У меня почему-то не заработал uglifyjs, поэтому последнюю строку в этом файле я закоментил. Дальше заходим в папку — это вот то действие, которое на Яке Володя не сделал, поэтому не сразу все получилось.
Магическая команда:
На самом деле она выполняет очень простое действие - просто создает папку pages и пустой файл pages/.bem/level.js. После выполнения этого действия структура проекта выглядит так:
В папке pages будут находится файлы, которые описывают страницы. Создадим вот это описание:
Это создаст пустой файл pages/index/index.bemjson.js и проект будет выглядеть так:
Дальше в этот файл впишем следующее описание страницы:
В этом описании мы используем 3 блока: header, content, footer, но пока у нас их нет. Самое время создать:
Это создает папочку blocks и шаблоны файлов указанных блоков. Структура проекта:
Файлы *.php пустые, а в css файлах уже есть заготовка, типа такой:
В файлы *.php пишем какой-нибудь текст. В качестве примера в каждый из этих файлов я просто написал его имя, а в css файлы тоже пишем что-то экспериментальное. Дальше - самый интересный этап. Нужно все это собрать. Для этого для начала создаем папку куда все это сложится:
И собираем страницу index (еще раз скажу что в файле make-page я закоментил вызов uglifyjs, так как он у меня не работал):
Па-пам! Команда ничего не выдала - все удачно собралось. Проект выглядит так:
В папке bempress/pages/index/ появилось 2 файла index.bemdecl.js и index.deps.js, а так же в папке wp-content/themes/yac/ появилось много файлов. index.php содержит в себе всю html часть, которая содержится в файлах header.php, content.php и footer.php и в моем случае выглядит так:
А файл style.css содержит в себе пожатый css и выглядит так:
Можно поиграться поменять php и css файлы, а потом пересобрать страницу index и насладится результатом. Так же очень просто создать еще одну страницу.
Это команда создает пустой файл pages/404/404.bemjson.js.
Пишем туда нечто похожее на index страницу:
И собираем страницу:
Файл wp-content/themes/yac/404.php выглядит вполне ожидаемо:
На этом этот подход к BEM для меня закончился. На github есть небольшая библиотека блоков и в следующем подходе я планирую подключить эту библиотеку к этому мега проекту, но пока мне совсем непонятно как это делать. Спасибо что дочитали до этого места =) ![]() |
toivonens написала | 24 октября 2011 года, 17:45 |
Блок i-jquery помогает подключить jQuery на страницу и упорядочивает хранение js-кода плагинов. На уровне blocks-common блок i-jquery состоит из нескольких элементов, которые содержат плагины к jQuery. Декларация этих элементов обеспечивает подключение этих плагинов в страничный js. На уровне blocks-desktop есть дополнительный элемент core. BEMHTML-реализация этого элемента позволяет подключать на страницы нужную версию библиотеки jQuery. ({Таким образом, для того, чтобы поддерживаемая версия jQuery оказалась на страницах, нужно использовать такой bemjson: Этот шаблон не продуцирует DOM-представление элемента. Он декларирует использование на странице элемента js, блока b-page, подключающего js с jQuery. Если мы решим перейти на новую версию библиотеки, просто изменим этот шаблон. И тогда у всех проектов, подключавших jQuery не вручную, а через блок i-jquery, своевременно изменится версия. Можно перезаписать этот шаблон bemhtml-шаблоном на своём уровне переопределения (для всего проекта или только для некоторых страниц). В этом случае, используя те же самые входные данные, можно получать более подходящий проекту результат. block i-jquery, elem core, default: { |
lento4ka написала | 21 октября 2011 года, 14:10 |
Блок b-layout-table — таблица со 100% шириной, для создания раскладки. block b-layout-table { Ячейки блока могут быть представлены либо елементом cell, либо элементом gap. {По умолчанию в блоке не задаются ширины ячейкам. Доопределить блок своими стилями можно следующим образом: добавляем модификатор блоку — mods: { layout: '58-40'} и ячейке — elemMods: { position: 'r'}. .b-layout-table_layout_58-40 .b-layout-table__cell_position_r Обратите внимание, что нельзя задавать самому блоку никаких дополнительных CSS свойств, это может привести к конфликтам в верстке, так как блок может быть использован в реализации других блоков. Важно: использовать блок нужно, задавая ему модификатор или миксируя его с другим блоком/элементом. |
toivonens написала | 20 октября 2011 года, 11:12 |
Видео мастер-классов про БЭМ, проходивших в 3м Зале на конференции YAC 2011, выложены на Vimeo. Можно смотреть на iOS: через браузер и через приложение.
|
toivonens написала | 19 октября 2011 года, 16:51 |
Видео доклада "BEMHTML. Not yet another шаблонизатор" со встречи разработчиков в Политехе (Питер). Материал аналогичен одноимённому докладу на конференции YAC2011, но отличается большой секцией вопросов и ответов. Это же видео опубликовано в коллекции БЭМ на Яндекс.Видео. |
| β-версия |
© 2007—2012 «Яндекс»
|
| Подписаться на комментарии к записи | ||
|---|---|---|
Получать уведомления о всех ответах в этом обсуждении. Форма не заполнена | ||
| Отписаться от комментарев к записи | ||
|---|---|---|
Получать уведомления только о тех ответах в этом обсуждении, которые адресованы лично вам. Форма не заполнена |
