Войти с помощью github

Подскажите, пожалуйста, то что я верстаю это БЭМ? )) Уж как то классы жирные получаются ((

<!doctype html>

<html>

<head>
    <meta charset="utf-8">
    <title>Some title here</title>
    <meta name="description" content="">
    <meta name="viewport" content="">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <link rel="stylesheet" href="styles/main.css">
<link rel="stylesheet" media="all and (orientation:portrait)" href="portrait.css"> 
<link rel="stylesheet" media="all and (orientation:landscape)" href="landscape.css">

</head>

<body class='body'>

<!--[if lte IE 8]>
      <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
    <![endif]-->

<!--[if lt IE 9]>
    <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->

<!--[if lt IE 9]>
    <script src="http://css3-mediaqueries-js.googlecode.com/svn/trunk/css3-mediaqueries.js"></script>
<![endif]-->

<div id='pagewrap' >

  <header class='header'>

  </header><!-- End of class header -->

  <div class='logo'>

     <div class='logo__block1' >

     </div>  <!-- End of class logo__block1 -->

     <div class='logo__block2' >

     </div>  <!-- End of class logo__block2 -->

  </div><!-- End of class logo -->

  <nav class='nav'>

  </nav><!-- End of class logo -->   


  </header><!-- End of class header -->     


  <section class='mainSection'>

     <div class='mainSection__block1' >

     </div>  <!-- End of class mainSection__block1 -->

     <div class='mainSection__block2' >

        <div class='mainSection__block3' >
        </div><!--End of class mainSection__block3-->

        <div class='mainSection__block4' >
        </div><!--End of class mainSection__block4-->         

     </div>  <!-- End of class mainSection__block2 -->

  </section><!-- End of class mainSection -->

  <section class='BreackingNewsSection'>

      <div class='BreackingNewsSection__header'>
          <p class='BreackingNewsSection__header --center'> BREACKING NEWS </p>
      </div><!-- End of class BreackingNewsSection__header -->

      <div class='BreackingNewsSection__body'>

          <div class='BreackingNewsSection__oneNews --marginleft'> 

          </div><!-- End of class BreackingNewsSection__oneNews -->

          <div class='BreackingNewsSection__oneNews'> 

          </div><!-- End of class BreackingNewsSection__oneNews -->

          <div class='BreackingNewsSection__oneNews'> 

          </div><!-- End of class BreackingNewsSection__oneNews -->

          <div class='BreackingNewsSection__oneNews --marginRight'> 

          </div><!-- End of class BreackingNewsSection__oneNews -->          

      </div><!-- End of class BreackingNewsSection__body -->

  </section><!-- End of class BreackingNewsSection -->

  <section class='LatestStoriesSection'>

      <div class='LatestStoriesSection__header'>

          <p class='LatestStoriesSection__header --center'> LATEST STORIES </p>

      </div><!-- End of class LatestStoriesSection__header -->

      <div class='LatestStoriesSection__block1'>

        <div class='LatestStoriesSection__oneNews'>
            <div class='LatestStoriesSection__oneNews__Img' >
            </div><!-- End of class LatestStoriesSection__oneNews__Img -->
            <div class='LatestStoriesSection__oneNews__text'>

               <p class='LatestStoriesSection__oneNews__header'>
                    Neque porro quisquam est
                </p>
                <p class='LatestStoriesSection__oneNews__body'>
                    Lorem Ipsum is simply dummy text of the printing and typesetting industry.
                </p>         
            </div><!-- End of class LatestStoriesSection__oneNews__text -->
        </div><!-- End of class LatestStoriesSection__oneNews -->

        <div class='LatestStoriesSection__oneNews'>
            <div class='LatestStoriesSection__oneNews__Img' >
            </div><!-- End of class LatestStoriesSection__oneNews__Img -->
            <div class='LatestStoriesSection__oneNews__text'>
                <p class='LatestStoriesSection__oneNews__header'>
                    Neque porro quisquam est 
                </p>
                <p class='LatestStoriesSection__oneNews__body'>
                    Lorem Ipsum has been the industry's standard dummy text 
                </p>
            </div><!-- End of class LatestStoriesSection__oneNews__text -->

        </div><!-- End of class LatestStoriesSection__oneNews -->

      </div><!-- End of class LatestStoriesSection__block1 -->

      <div class='LatestStoriesSection__block2'>

      </div><!-- End of class LatestStoriesSection__block2 -->      

      <div class='LatestStoriesSection__block3'>
          <ul class='gorizontalMenu' >
            <li class='gorizontalMenu__li' > <a>Previous</a> </li>
            <li class='gorizontalMenu__li --chosen' > <a>1</a> </li>
            <li class='gorizontalMenu__li' > <a>2</a> </li>
            <li class='gorizontalMenu__li' > <a>3</a> </li>
            <li class='gorizontalMenu__li' > <a>4</a> </li>
            <li class='gorizontalMenu__li' > <a>5</a> </li>
            <li class='gorizontalMenu__li' > <a>Next</a> </li>
          </ul>
      </div>

  </section><!-- End of class LatestStoriesSection -->

  <article class='article'>

  </article> <!-- End of class article --> 

  <footer class='footer'>

  </footer><!-- End of class footer -->

</div> <!-- End of id pagewrap -->

 <script src="scripts/app.js"></script>


</body>

</html>

Пробовал в списке зависимостей указывать link_animated - не вышло. Подобным образом — то же самое.

modules.define(
    'scroll-top',
    [ 'i-bem__dom', 'jquery' ],
    function(provide, BEMDOM, $) {
        provide(BEMDOM.decl({ block: this.name, baseBlock: { block: 'link', modName: 'animated', modVal: true } }, {
            // ...
        }));
    }
);

Возможно осуществить задуманное?

Всем привет. Расскажите, пожалуйста, какие есть варианты кастомизации bem-components под проект? Хочется отказатья от привязки к теме islands, но в тоже время чтобы блоки имели "основной каркас" и функциональность (выпадающие списки, селекты и т.д), чтобы можно было "додизайнить" под проект.

Один из вариантов решений предлагает @koloskof, он вынес большинство свойств в переменные, с помощью которых можно координально изменить внешний вид темы islands.

Какие существуют еще варианты? Спасибо.

Как я понял в новых deps можно описывать зависимости на yaml. Будет ли работать вперемешку с deps.js? Можно пример описания зависимости на yaml?

Ребята, посмотрите, пожалуйста код. Он рабочий, просто хочу получить feedback. Может есть явные ошибки. Спасибо.

    modules.define('pgc-create', ['i-bem__dom'], function(provide, BEMDOM) {
    provide(BEMDOM.decl(this.name, {
    onSetMod: {

        'js': {
            'inited': function() {
                this.bindTo(this.elem('prev'), 'click', this._onClick); // подписка на DOM-событие "click" по кнопке "Назад"
            }
        },

        step: function(modName, modVal) {
            this
                .delMod(this.elem('step'), 'active')
                .setMod(this.elem('step').eq(modVal - 1), 'active')
                .delMod(this.elem('number'), 'active')
                .setMod(this.elem('number').eq(modVal - 1), 'active')
                .delMod(this.elem('text'), 'active')
                .setMod(this.elem('text').eq(modVal - 1), 'active')
                .delMod(this.elem('arrowgrey'), 'active')
                .setMod(this.elem('arrowgrey').eq(modVal - 1), 'active')
                .delMod(this.elem('arrowwhite'), 'active')
                .setMod(this.elem('arrowwhite').eq(modVal - 1), 'active')
                .delMod(this.elem('fields'), 'visible')
                .setMod(this.elem('fields').eq(modVal -1), 'visible');

            modVal === '4' &&  this
            .delMod(this.elem('next'), 'visible') // прячем кнопку "Продолжить"
            .delMod(this.elem('submit'), 'hidden'); // показываем кнопку "Отправить"
            modVal > '1' && this.delMod(this.elem('prev'), 'hidden'); // на втором шаге показываем кнопку "Назад"
            modVal === '1' && this.setMod(this.elem('prev'), 'hidden'); // на первом шаге прячем кнопку "Назад"

        }
    },
    _onSubmit: function(e) { // Листаем вперед
        e.preventDefault();
        // TODO: валидация примерно здесь
        this.setMod('step', +this.getMod('step') + 1);
    },
    _onClick: function(e) {  // Листаем назад
        e.preventDefault();
        this.setMod('step', +this.getMod('step') - 1); 
    }
    }, {
    live: function() {

        this.liveBindTo('submit', this.prototype._onSubmit);

    }
    }));
    });

Hi. Как скрыть у блока attach: имя файла (элемент text); крестик для отмены выбора (элемент clear)?

Доброго времени суток!

Есть несколько вопрос, на которые, к сожалению, я не нашел ответа. Как известно, в знаменитом project-stub создана папка bundles только для desktop, так вот:

1) Как сгенерировать bundles для touch-pad, например? 2) Слышал в одном из докладов, что у вас есть детектор для определения платформы, можете кинуть пару примеров его использования?

Еще один вопрос, заодно: 3) Опять же в одном из докладов слышал про "тулзу", которой скармливаешь bemjson, а она на его основе генерирует папки блоков и элементов. Как она называется?

Спасибо.

Пример из "Верстка для самых маленьких. Верстаем страницу по БЭМу"

block('menu').elem('item').elemMod('active', true)

Почему не срабатывает elemMod?

ссылка на песочницу

Не получается использовать mix, не указав block или elem:

block('header')(
  mix()([
    { block: 'row', mods: { 'sac': true }},
    { block: 'section' }
  ]),
  content()({
    mix: {
      block: 'row',
      elem: 'col',
      mods: { s: true }
    },
    content: [
      { elem: 'title' },
      { elem: 'intro' }
    ]
  })
)
<div class="header row row_sac section">
    <div>
        <div class="header__title"></div>
        <div class="header__intro"></div>
    </div>
</div>

Песочница С элементом Если указать миксуемый элемент прямой на этой ноде, то придётся явно указывать block у элементов в контенте.

Можно ли заставить работать первый вариант?

Проверил возможность использовать БЭМ-стек в песочницах. Учитывая наличие dist-поставки bem-core-dist и bem-components-dist препятствий для этого быть не должно.

Мотивация

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

Эксперимент

Для эксперимента взял блок hello из статьи Собираем статическую страницу на БЭМ. Вот что получилось:

Шаблоны заворачиваем в модуль:

bemhtml

modules.define('BEMHTML', [], function (provide, BEMHTML) {
  BEMHTML.compile(function() {
    block('hello')(
      js()(true),
      tag()('form')
    );
  });
  provide(BEMHTML);
} );

bh

modules.define('BH', [], function (provide, bh) {
  bh.match('hello', function (ctx) {
    ctx.js(true);
    ctx.tag('form');
  } );
  provide(bh);
} );

Для возможности использовать bemjson реализовал блок:

/**
 * @module bemjson
 */
modules.define(
  'bemjson', ['i-bem__dom', 'BEMHTML'],
  function(provide, BEMDOM, BEMHTML) {

    /**
     * @exports
     * @class bemjson
     * @bem
     */
    provide(BEMDOM.decl(this.name, /** @lends bemjson.prototype */ {
      onSetMod: {
        js: {
          inited: function() {
            BEMDOM.replace(this.domElem, BEMHTML.apply(JSON.parse(this.domElem.text())));
          }
        }
      }
    }));
  }
);

Пример использования:

<script type="text/bemjson" class="bemjson i-bem" data-bem="{&quot;bemjson&quot;: {}}">
{
 "block": "hello",
 "content": ""
}
</script>

Результаты

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

К сожалению в IE8 не работает хотя все необходимые ресурсы (shim, ie.css) для этого подключены в Plunker и CodePen кроме JSFiddle, ошибка:

'modules' is undefined

Вопросы

  • Какие есть варианты оформить bemjson отдельным файлом в Plunker?
  • Может быть кто-то знает более подходящею песочницу для экспериментов с БЭМ-стеком?
  • Тестирование, приветствуется.

UPD: v2

  • Каким образом можно оформить bemhtml в песочнице?

А не задумывались ли вы о самостоятельной i-bem.js? Так сказать лайт версия стека БЭМ. Очень часто встречаю файл scripts.js, main.js, с наиполнейшей лапшой из jquery плагинов, без ленивой инициализации и всех крутых штук которые умеет i-bem.js

Пишу к примеру { tag: 'script', attrs : { src : '?a&b', defer : true }, } На выходе <script src="?a&amp;b" defer></script> Экранирование вообще не нужно. Как это исправить?

Разбирая рекомендации от @blond в pull-request: https://github.com/enb-make/enb/pull/426

Переделал технологию write-file и поменял тест. Тест сделал с проверкой контента в файле и он отвалился!

Реализовал небольшой проектик, в общем провел такой путь: https://github.com/enb-make/enb/pull/426#issuecomment-177334190

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

Поставил console.trace(args); вот в это место: https://github.com/dfilatov/vow-fs/blob/master/lib/fs.js#L28

Вот, что он выдал:

 enb make

Trace: [ '~/Projects/opensource/test-enb/.enb/tmp',
  undefined,
  [Function] ]
    at ~/Projects/opensource/test-enb/node_modules/vow-fs/lib/fs.js:28:25
    at ~/Projects/opensource/test-enb/node_modules/vow-fs/lib/fs.js:316:24
    at Array.<anonymous> (~/Projects/opensource/test-enb/node_modules/vow/lib/vow.js:712:56)
    at Immediate.callFns [as _onImmediate] (~/Projects/opensource/test-enb/node_modules/vow/lib/vow.js:23:35)
    at processImmediate [as _immediateCallback] (timers.js:383:17)
Trace: [ '~/Projects/opensource/test-enb/.enb/tmp',
  [Function] ]
    at Object.stat (~/Projects/opensource/test-enb/node_modules/vow-fs/lib/fs.js:28:25)
    at Object.module.exports.isDir (~/Projects/opensource/test-enb/node_modules/vow-fs/lib/fs.js:234:21)
    at onFailed (~/Projects/opensource/test-enb/node_modules/vow-fs/lib/fs.js:307:28)
    at Array.<anonymous> (~/Projects/opensource/test-enb/node_modules/vow/lib/vow.js:712:56)
    at Immediate.callFns [as _onImmediate] (~/Projects/opensource/test-enb/node_modules/vow/lib/vow.js:23:35)
    at processImmediate [as _immediateCallback] (timers.js:383:17)
03:09:57.177 - build started
Trace: [ '~/Projects/opensource/test-enb/bundle',
  undefined,
  [Function] ]
    at ~/Projects/opensource/test-enb/node_modules/vow-fs/lib/fs.js:28:25
    at ~/Projects/opensource/test-enb/node_modules/vow-fs/lib/fs.js:316:24
    at Array.<anonymous> (~/Projects/opensource/test-enb/node_modules/vow/lib/vow.js:712:56)
    at Immediate.callFns [as _onImmediate] (~/Projects/opensource/test-enb/node_modules/vow/lib/vow.js:23:35)
    at processImmediate [as _immediateCallback] (timers.js:383:17)
Trace: [ '~/Projects/opensource/test-enb/bundle',
  [Function] ]
    at Object.stat (~/Projects/opensource/test-enb/node_modules/vow-fs/lib/fs.js:28:25)
    at Object.module.exports.isDir (~/Projects/opensource/test-enb/node_modules/vow-fs/lib/fs.js:234:21)
    at onFailed (~/Projects/opensource/test-enb/node_modules/vow-fs/lib/fs.js:307:28)
    at Array.<anonymous> (~/Projects/opensource/test-enb/node_modules/vow/lib/vow.js:712:56)
    at Immediate.callFns [as _onImmediate] (~/Projects/opensource/test-enb/node_modules/vow/lib/vow.js:23:35)
    at processImmediate [as _immediateCallback] (timers.js:383:17)

// called builder in techs/write-file.js

Trace: [ '~/Projects/opensource/test-enb/bundle/bundle.md',
  '## Test \n this a test text',
  { encoding: 'utf8' },
  [Function] ]
    at Object.<anonymous> (~/Projects/opensource/test-enb/node_modules/vow-fs/lib/fs.js:28:25)
    at ~/Projects/opensource/test-enb/node_modules/vow-fs/lib/fs.js:46:35
    at Object.vow.invoke (~/Projects/opensource/test-enb/node_modules/vow/lib/vow.js:1050:20)
    at Object.Queue._runTask (~/Projects/opensource/test-enb/node_modules/vow-queue/lib/queue.js:204:27)
    at Object.Queue._run (~/Projects/opensource/test-enb/node_modules/vow-queue/lib/queue.js:186:18)
    at processImmediate [as _immediateCallback] (timers.js:383:17)
03:09:57.201 - [rebuild] [bundle/bundle.md] write-file
Trace: [ '~/Projects/opensource/test-enb/bundle/bundle.md',
  'undefined',
  'utf8',
  [Function] ]
    at Object.<anonymous> (~/Projects/opensource/test-enb/node_modules/vow-fs/lib/fs.js:28:25)
    at ~/Projects/opensource/test-enb/node_modules/vow-fs/lib/fs.js:46:35
    at Object.vow.invoke (~/Projects/opensource/test-enb/node_modules/vow/lib/vow.js:1050:20)
    at Object.Queue._runTask (~/Projects/opensource/test-enb/node_modules/vow-queue/lib/queue.js:204:27)
    at Object.Queue._run (~/Projects/opensource/test-enb/node_modules/vow-queue/lib/queue.js:186:18)
    at processImmediate [as _immediateCallback] (timers.js:383:17)
03:09:57.206 - build finished - 38ms

Так вот и вопрос, это баг или фича гонять по два раза?

Может я чего не так использую?

Назревает такая необходимость. Первое что приходит на ум: создать уровень под названием sb-admin-2, а в нем разместить папки, в которых уже нужно организовать структуру по БЭМ. К примеру есть папка holderjs со следующей структурой:

holderjs\holder.js holderjs\src\augment.js holderjs\src\holder.js holderjs\src\ondomready.js holderjs\src\polyfills.js

Верная структура для БЭМа по идее будет следующей:

holderjs\holder.js holderjs\augment\holderaugment.js holderjs\augment\holderaugment.deps.js holderjs\holder\holderholder.js holderjs\holder\holderholder.deps.js holderjs\ondomready\holderondomready.js holderjs\ondomready\holderondomready.deps.js holderjs\polyfills\holderpolyfills.js holderjs\polyfills\holderpolyfills.deps.js

Где в депсах прописана зависимость от holder.js

Собственно сам вопрос: перебирать все папки и писать депсы как-то муторно, можно ли обойтись малой кровью?

На выходе после BEMTREE шаблонизации выходит примерно такой bemjson

{
    block: 'video'
    content: [
        {
            elem: 'media',
            urls: data.links,
        },
        {
            elem: 'content',
            content: [
                {
                    elem: 'title',
                    content: data.title
                },
                {
                    elem: 'description',
                    content: data.description
                }

            ]
        }
    ]
}

Элемент __media с помощью bemhtml потом оборачивается в блок wrapper-block Что нужно написать в блоке wrapper-block, чтобы он не менял в контексте block, чтобы не делать вот так:

{
    block: 'video'
    content: [
        {
            block: this.block,
            elem: 'media',
            urls: data.links,
        },
        {
            block: this.block,
            elem: 'content',
            content: [
                {
                    block: this.block,
                    elem: 'title',
                    content: data.title
                },
                {
                    block: this.block,
                    elem: 'description',
                    content: data.description
                }

            ]
        }
    ]
}

Статическое свойство, к примеру, понятно, как сделать. А вот элемент — возможно ли?

При сборке enb генерирует кучу промежуточных файлов, есть ли вариант удалить в папке с бандлом все кроме того что явно добавлено в конфиге c помощью addTargets()?

Для чего в bem-components вместо селектора :hover используется модификатор _hovered?

Здравствуйте! Возник такой вопрос: допустим, есть единый css-файл, есть у сайта часть для неавторзованных пользователей, есть для авторизованных, и там, и там, например, есть header, но он выглядит абсолютно по-разному. Как в таком случае лучше быть?

Использовать общий для них .header и частные .header--front / .header--back, но в таком случае у нас просто .header будет без стилей. Или сделать родителя .front и .back, а затем - .frontheader и .backheader, но это добавит лишнюю вложенность, от которой мы как раз-таки стараемся избавиться.

Ну и, конечно же, у каждого из хэдеров есть свои внутренние блоки, которые тоже отличаются, т.е. еще вложенности. Т.е. просто .headeruser, .headerlogo сделать не получится, т.к. на front и back они должны выглядеть по-разному, т.е. опять же возвращаемся к вопросу, который я озвучил выше.

Как следует поступать в таком случае?

Возможно ли сделать ленивую инициализацию блока по событию не на блоке а в канале?

Подскажите, как отобразить код bemjson на странице в браузере. Тэги <pre> и <code> не помогают.

Каким образом можно оформить блоки в виде библиотеки, чтобы на уровне проекта их реализацию возможно было частично переопределить?

Как пример на входе attrs: {onchange: 'mapLayerCheck(this, "route")'}

и на выходе onchange="mapLayerCheck(this, &quot;route&quot;)"/>

Подскажите, пожалуйста. Есть блок, но в разных случая, к нему примиксовываю разные свойства. В случае с elem: 'price', стили блока перекрываются, а в случае с elem: 'heading' - нет. В чем может быть проблема?

    {
    block: 'title',
            mods: { level: 4 },
    mix: { block: 'search-result', elem: 'price' },
    content: '368,00 $'
   },
   {
    block: 'title',
            mods: { level: 4 },
    mix: { block: 'search-result', elem: 'heading' },
    content: '*******'
   },

Всем привет, подскажите, кто как определяет стили для тэгов h1, h2, h3 .....? В блоке page? И второй вопрос. Где Вы подключаете шрифты?

Есть ли какая-нибудь опция? На всякий случай OS Windows 7

Всем привет. У меня почему-то модификаторы со значением true не попадают в сборку. Решил провести эксперимент, к блоку добавил три модификатора

 block : 'content',
 mods : { display : 'block', 'display-block' : true, displayblock : true  },

Вот результат http://i.imgur.com/dGFQyDo.png . Попал только первый.

content_display_block.styl:

.content_display_block {
   display: block;
 }

content_display-block.styl:

.content_display-block {
  display: block;
 }

content_displayblock.styl:

 .content_displayblock {
   display: block;
}

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

  ./node_modules/.bin/enb make

2016-01-25 20 25 53

Кто знает в чем причина?

Хочется в реакт проекте использовать весь браузерный js из bem-core + bem-components this.elem('foo') == что-то такое что реакту понятно

что бы рекваиришь *.browser.js из bem-components и оно работает в реакте

Никто не думал о подобном? Реально ли это? Что нужно предпринять?

Вопрос, который не дает мне покоя. Неужели никто из из тех кто разрабатывает на бэм не пользуется моделями на фронте? Как-то странно эта тема практически не всплывает... В связи с этим хотелось бы узнать использует ли кто-то mvc в своих проектах и каким образом. Или все же хотеть модели на фронте - неправильно? Буду благодарен за развернутый ответ.