Ответы пользователя по тегу HTML
  • Как организовать файлы в библиотеке компонентов?

    qfox
    @qfox
    Ответы есть у меня
    У нас есть блок "Кнопка", у нее есть дочерний элемент "Кнопка__иконка" и модификатор "Кнопка--Иконка-Слева"(уменьшает отступ слева, чтоб иконка смотрелась лучше).
    У этой кнопки есть три модификатора размера (sm,m,l). У каждого размера будет разный отступ слева при модификаторе "Кнопка--Иконка-Слева".


    Легко решается через CSS Custom Properties и типографские константы
    --sm, --m, --l при этом выставляют эти константы, а другие модификаторы и элементы их используют в нужных им местах.

    Добавим изменение размера "Кнопка__иконка" для разных размеров кнопки (если это иконочный шрифт можно использовать font-size всей кнопки, но мы как современные используем svg иконки и размер нужно задавать вручную).


    Лучше делать враппер над иконкой, чтобы не завязываться на svg или нет.
    Если библиотека компонент общая — ситуации могут быть разные.
    Такая структура более менее:
    <Button>
      <Button__icon><Icon ... /></Button__icon>
      <Button__body>Текст на кнопке</Button__body>
    </Button>


    Если иконка есть — выводим `Button__icon`, если нет — не выводим. Стили вешаем на `Button__icon`.

    Для кастомизации — оставляем `Button__body`, потом пригодится в кастомных `Select`.

    В идеале нужна структура, чтоб видеть все связи (пример выше), для быстрого доступа к нужному свойству, но также инструмент, который умеет удалять не нужные стили по связям. Удалив элемент "Кнопка__иконка" в сборку не должны попасть модификаторы "Кнопка--Иконка-Слева" разных размеров.

    Может кто то встречался с решением или рекомендациями по данному вопросу.


    Звучит как сборка стилей по зависимостям из bemjson/jsx. Технически, есть возможность даже из html получить bemjson и инициировать для него сборку css/js.
    Процесс будет выглядеть примерно так:
    const fs = require('fs');
    const miss = require('mississippi');
    const html2bemjson = require('html2bemjson');
    const bemjsonToDecl = require('bemjson-to-decl');
    const src = require('gulp-bem-src');
    const gconcat = require('gulp-concat');
    const vfs = require('vinyl-fs');
    
    src(
        ['path/to/blocks'],
        bemjsonToDecl.convert(
            html2bemjson(
                String(fs.readFileSync('path/to/your.html')))),
        'css',
        { // дополнительные настройки
            skipResolvingDependencies: false, // отключаем зависимости
            {
                'path/to/blocks': { scheme: 'nested' } // у 'path/to/blocks' схема nested 
            }
        }
    ).pipe(gconcat('path/to/your.css')).pipe(vfs.dest('.'))

    Ну и всё
    Ответ написан
    3 комментария
  • Как сочетать BEM и динамический контент?

    qfox
    @qfox
    Ответы есть у меня
    У вас здесь 2 проблемы:
    • нужны ли классы для динамического контента;
    • как, если нужно, модифицировать структуру динамического контента.

    Проблема структуры не относится к BEM, она относится к семантике и SEO.

    Если же не смотреть на структуру и тэги (использовать ли small внутри или span, заворчивать ли в article) — то вопрос в сущности нужны ли классы на динамическом контенте или нет. Учитывая, что контент динамический, и нет необходимости иметь классы на тэгах, то допустимо сделать каскад на тэги от некоторого блока: например, dynamic-content или content, text.

    Почему именно теги? Потому что WYSIWYG по умолчанию генерирует теги. Но вы можете использовать какие-то доп. инструменты, которые подправят итоговый html, расставят классы и т.д. (например, с помощью инструментов типа https://github.com/posthtml/posthtml ).

    При необходимости можно дополнительно пометить стили тегов классами.

    <div class="text">
      <h1>Caption <small>Some Foo Bar</small></h1>
      <article>
        <p>Lorem ipsum...</p>
        <div class="text__p">Dolor sit...</div>
      </article>
    </div>


    .text h1, .text__title { /* main title styles */ }
    .text h1>small, .text__sub-title { /* sub-title styles */ }
    .text p, .text__p { /* paragraph styles */ }


    Таким образом вы инкапсулируете все пользовательские стили в одном месте (одном блоке) и не имеете проблем с созданием контента.
    Ответ написан
    2 комментария
  • Как создать блок по метoдологии BEM?

    qfox
    @qfox
    Ответы есть у меня
    Блок должен находится на уровне переопределения. Например: app.blocks.
    Удобнее блоку сделать свою папку (и все блоки хранить каждый в своей папке): app.blocks/hello-world
    У блока должна быть какая-то реализация. Например, css: app.blocks/hello-world/hello-world.css

    Возвращаясь к вопросу:
    mkdir ./app.blocks/hello-world/ -p
    touch ./app.blocks/hello-world/hello-world.css


    Либо, если хотите использовать bem-tools:
    npm i bem-tools
    bem create level app.blocks
    bem create block -l app.blocks hello-world
    Ответ написан
    1 комментарий
  • Полный цикл жизни проекта: html,css,js > php, шаблоны, изменения, переиспользование?

    qfox
    @qfox
    Ответы есть у меня
    Текущий подход достаточно заморочен, если знаешь все прелести БЭМ.

    Сейчас мы делаем:
    0. Дизайнер нарисовал макет
    1. Верстаем руками html: a.html
    2. пишем руками стили: a.css
    3. пишем руками js: a.js
    4. Это все передаем бекендеру и он:
    5. Доверстывает хтмл и разбивает на шаблоны, из a.html получает A.tmpl, B.tmpl, C.tmpl, ...
    6. Дописывает стили в своих файлах, а часто еще и разбивает их на части: A.scss, B.scss, ...
    7. Дописывает js, и тоже часто разбивает: A.js, B.js, C.js
    8. Какой-то бэкенд собирает из кусков шаблонов страницу, и часто создает css, js только из нужных кусков

    А дальше: Пришел новый макет. И что делать?

    И БЭМ в данном случае решает проблему, поскольку у него есть стек технологий, позволяющий верстальщику работать сразу с шаблонами и разобранными js/css(less/sass/stylus) файлами.

    На практике получается так:
    0. Макет.
    1. Верстальщик смотрит на макет, и разбивает его на куски (компоненты) сразу;
    2. Пишет bemjson (или jsx) вместо html;
    3. Создает шаблоны, стили и js для каждого из блоков;
    4. Передает это все бэкенд программисту (обычно через гит, потому что так удобнее);
    5. Бэкендер без изменений использует эти файлы для генерации страницы, и просто генерирует описанный верстальщиком bemjson (или jsx).

    И, О МАГИЯ, они могут работать над проектом параллельно, даже если придет новый макет.

    C php действительно есть нюансы, которые сложно разглядеть, просто потому, что нет большого кол-ва пользователей и стек не устоялся.
    Мы у себя используем велосипед, который собирает все сам, и почти готовы перейти на enb используя bh-php.
    Большая проблема, как оказалось, использование декларативных шаблонизаторов — верстальщики не сразу въезжают что и как. Но когда въехали — я не знаю тех, кто возвращается на императивные (типа мусташей, джейдов, smarty, etc.).

    Можно начать с https://github.com/bem/project-stub/tree/php-bem-bh и позадавать вопросы на форуме https://ru.bem.info/forum/ — люди поделятся своими историями.
    Ответ написан
    Комментировать
  • Эта верстка соответствует бэм принципам?

    qfox
    @qfox
    Ответы есть у меня
    Нет ;-)

    col-md-6 new-left — лучше унести в модификаторы b-layout

    informers — это разметка? лучше как элемент разметки тогда.

    b-inline — тоже скорее к разметке относится, лучше в элементом в b-layout или в специальный блок для разметки

    auth-line — явно элемент auth-form, я бы сделал .form.form_auth или form_type_auth, а этот элемент — form__field.

    ну и дальше в том же духе.
    Ответ написан
    Комментировать
  • Как разрабатывать при помощи bem-core и bem-tools?

    qfox
    @qfox
    Ответы есть у меня
    Самый простой способ — это склонировать https://github.com/bem/project-stub через git, удалить папку .git, установить node, зависимости (npm install), и начать работать над проектом.

    Чуть сложнее в настройке, но тоже простой — использовать yo и bem-stub, для этого нужно установить ноду, эти два пакета: npm -g install yo generator-bem-stub; и далее в новой папке можно будет запустить yo bem-stub, поотвечать на вопросы, и проект сгенерируется.

    Важно понимать, что bem server скоро начнет внутри использовать enb, так что можно уже сейчас на него переходить и использовать enb server.

    А вообще, на такие вопросы очень быстро можно получить ответ на bem.info и форуме. ;-)
    Ответ написан
    Комментировать
  • Трансляция видео стрима с помощью HTML5 Websockets?

    qfox
    @qfox
    Ответы есть у меня
    Не очень понятно зачем это делать через websocket, но даже если представить какой объем вы будете через них отправлять — качество будет того.

    Можно попробовать посмотреть в сторону решений типа https://github.com/phoboslab/jsmpeg, но это на nodejs и требует ffmpeg/VLC.
    Ответ написан
    4 комментария
  • Как сместить target index в jcarousel с первого слайда на второй?

    qfox
    @qfox
    Ответы есть у меня
    Насколько я понимаю, проще всего подписаться на событие изменения таргета и выставлять свой класс на следующий после таргета элемент. Либо же какие-то другие события посмотреть.
    Я бы читал код и документацию.

    Не очень тянет на вменяемый ответ, но уж коль ничего другого нет ;-)
    Ответ написан
  • Существует ли в природе подобный слайдер?

    qfox
    @qfox
    Ответы есть у меня
    Имхо, это все css3, js тут мало играет.

    Делаете прямоугольный «слайдер», который загибаете, а его элементы наоборот разгибаете. При наличии какого-то класса сдвигаете, опять же, css3 свойствами и ставите нужную прозрачность (или меняете картинку), тени.

    Вариант 2: svg. В этом случае, делаете inline svg, с нужной формой элементов, классы там тоже поддерживаются и при наличии класса active на элементе двигаете его вниз и меняете прозрачность.
    Ответ написан
  • Какие есть методологии верстки независимыми блоками?

    qfox
    @qfox
    Ответы есть у меня
    Инлайн стили это одно, а скрипты это другое, бэм собирает все вместе, и еще и html туда же при помощи i-bem.js

    Примеры — многие проекты яндекса, часть мейл.ру, ну megafon.ru респонсив часть ;-) А вообще уже достаточно много сайтов на бем переходят.
    Ответ написан
    Комментировать
  • Как реализовать БЭМ блоки для jade (pug), stylus?

    qfox
    @qfox
    Ответы есть у меня
    Пожалуй, посоветую следующее:
    1) Иметь хелперы в jade, переменную с названием блока типа b, гененрацию модификатора типа mod(b, 'name', 'val'), переменную content (у меня это объект с toString()) с содержимым блока, и т.п.
    2) Не использовать include вообще, чтобы можно было строить дерево, просчитывать в рилтайме зависимости, и даже собирать assets для страницы. Например, через какието хелперы, опять же. При большом делении на блоки все повиснет, конечно, но надо научиться их умно кешировать.
    3) На вход постарайтесь подавать bemjson-like структуру с доработками под себя. У нас в проекте сейчас это поле data, в которое кладутся любые данные, нужные для блока. Подтягивание внутренних блоков (и их последующую отрисовку) мы делаем либо в самих шаблонах, либо из объекта content, если контент состоит из массива блоков и строк.
    4) Если нужно будет где-то подтянуть блок в элемент — научите хелперы block/element из (2) подмешивать данные при прямом вызове хелпера.
    5) Если все замечательно — в конце все собранные assets можно в заголовке (css) и в подвале (js) страницы, предварительно прогнав через uglifyjs, csso, но только на продакшне, где есть их кеширование на nginx.

    У нас это все на пхп со смарти (так звезды сложились), но вполне подойдет для рантайм js с jade. Работает замечательно.

    Но вообще, если вы используете js, то удобнее использовать bemhtml свежий с js синтаксисом. На bem.info пока не обновляли доку, но базовые блоки в самой библиотеке вполне описывают синтаксис. Будет бонус — шаблоны самодостаточны, и на морде не потребуют подгрузки доп. библиотек, можно будет запускать как есть. В гульп их сборку встроить тоже можно.
    Ответ написан
    4 комментария
  • Есть ли какие-то специальные рекомендации в методологии БЭМ при верстке HTML5?

    qfox
    @qfox
    Ответы есть у меня
    Зайки кушают морковку, волки кушают овес, и все бы замечательно было бы в лесу, если бы не контекст.
    - HTML5 не идеальная штука, верстать в четком соответствии с его стандартнами — равно смертный приговор внешнему виду проекта. Это достаточно сырой продукт, который производители браузеров решили кусочно выложить в свет. Что из этого получится — будет известно через пару лет, когда все грабли познают своего на них наступившего.
    - Количество проблем с кодом будет увеличиваться линейно или даже квадратически, в зависимости от ваших навыков. В любом случае, вы никогда не уйдете от классов и элементов. И скоро работы ваших сайтов при описанном подходе (поиск по тегам, поиск по data-атрибутам, смешанные селекторы и пр.) будет влиять как на первичную отрисовку страницы, так и на все последующие перерисовки достаточно сильно просто потому, что оптимизация, конечно, есть, но от полного перебора дом дерева при его перестройке никто не уйдет.

    Я, как и некоторые, уже давно не считаю html и css чем-то, что стоит писать руками. Если в js можно просто забыть и не использовать неудачный опыт типа with, отстуствия разделителей (;) при переносе строк, и т.п., это все-таки императивная среда, то с декларативной природой css и html — можно абстрагируясь писать языки разметки, вычленять кусочки из целого и реиспользовать много раз где нужно, и прочее.
    Вам HTML5 говорит о том, что хорошо бы вычленить все описание section в отдельное место, всякие стили, скрипты, и прочее?
    Да и ваш подход, с тэг = блок, не приживется. Подойдет только для очень мелких сайтов. Просто потому, что у вас тэги кончатся. Попробуйте заверстать страничку пользуясь своим руководством, и все поймете. Я уже не упоминаю про семантику.

    Если применять БЭМ в чистом виде к HTML5 получиться избыточное количество классов, которые добавляют "независимость блокам" так где она есть или не нужна.

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

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

    Порог входа не низок, не высок, но есть. Все кто против — либо любят наступать на грабли, либо ничего долгосрочного не делали, либо фанаты w3c (а не здравого смысла), либо ваш вариант.
    Ответ написан
    Комментировать
  • Как поступать с тегами, которые генерируются БЭМ?

    qfox
    @qfox
    Ответы есть у меня
    Че-то второй вопрос по бэм и опять 3 подвопроса.

    (1) Поступать с тегами нужно нежно. Лучше всего, если хотите бэм в вордпрессе, поискать готовые плагины/темы, на базе которых делать свое. В контенте без языков разметки бэму делать нечего, ибо это неудобно руками писать. В этом случае удобнее всего завернуть все в некий блок user-content, которому прописать стили для всех каскадов — таким образом у вас получится наибольшая польза от бэм с наименьшим кол-вом проблем от классического подхода. Т.е. вы все эти проблемы локализуете внутри блока user-content, все остальное будет стабильнее, в зависимости от навыков.

    (2). Обертки это немножко другое, чем то, что вы хотите. Для центровки всех элементов можно родительскому блоку пользовательского контента user-content, в который вставляется то, что приходит из админки, выставить text-align: center, и оно разойдется по всем дочерним. А вообще, если такое нужно не везде, то лучше сделать соотв. модификатор или элемент, который можно будет навешивать на тэги контента. Имя блока можно сократить до uc, например: user-content_align_center или uc_align_center, или uc__centered (если использовать, как подмешанный элемент).

    (3) Про вложенные блоки есть такая идея: создаете модификатор _level_N, или depth_K, где N, К — натуральные числа, этим модификаторам задаёте нужные цвета текста. Родительскому блоку по умолчанию выставляете тот самый одинаковый цвет. Профит.
    Про дублирование стилей 7 раз — не очень понимаю, если у вас будет один и тот же блок — просто навешиваете его и нет проблем, если разные — цвета прописываете в модификаторах.
    Кроме прочего, есть csso, который оптимизирует все это богатство и ужаса никакого не будет.
    Кроме прочего, задача какая-то вымученная, потому что color по стандарту передается в дочерние элементы, и его будет достаточно прописать в style="color: red" родительской ноды.
    Независимыми должны быть блоки, а не ноды. Разница между ними такая же, как между классом и объектом, или как между схемой и таблицей, или как между трафаретом и надписью им сделанной, и т.д. Одно — правила, второе — результат. Один и тот же блок может быть навешан на 50 хтмл нодах (тэгах), и все они будут иметь похожее или одинаковое поведение и отображение.
    Например, есть у вас на сайте яндекс.карты, а в них 100 меток, все эти метки разные, но в чем-то сходятся, например, у них одинаковые или похожие стили, а при клике на любой из них выводится попап, в котором разные данные. Так вот метка и попап — это одни блоки, а данные в попапах будут в других блоках. И стили, скрипты про вид метки и про открытие попапа мы описываем в одном месте единожды, сам попап в другом месте и тоже единожды, а когда будем выводить эти данные — это уже будет контент и там уже мы будем выводить многократно один и тот же класс (название блока) в разные дом ноды (тэги).
    В различных инструментах (bem-tools/enb) есть удобные шаблонизаторы как раз для автоматической генерации таких деревьев дом нод, чтобы было меньше путаницы: bemhtml, bh. Кроме того, такой подход позволяет генерировать шаблоны для сборки на клиенте в браузере. Но чтобы интегрировать все вместе — нужно разобраться. А чтобы еще и использовать с wordpress — неплохо знать как сам вордпресс, так и методологию, и инструменты, которыми будете все это собирать.
    Ответ написан
    Комментировать
  • Вопрос верстальщикам. Плюсы и минусы, вёрстка vs. изображение

    qfox
    @qfox
    Ответы есть у меня
    Странно, что никто не сказал про рендеринг.
    Всякие CSS3 фишки весят меньше, но рисуются на клиенте. И каждая перерисовка будет заставлять браузер перерисовывать и эти ваши модные штуки. Таким образом, скорость работы сайта, перегруженного css3 может быть заметна глазу на слабых машинках — это уже не хорошо.
    С другой стороны, как уже много говорили, перекрасить картинку — автоматически крайне сложно, иногда нереально, а перекрасить css3 — не сложнее, чем скушать печеньку.
    Нужно искать золотую середину. Не использовать новомодные штуки там, где они не нужны, и стараться использовать там, где будет полезно, даже если для ie6/7/8/9 придется делать отдельные стили. Их все равно придется делать отдельно.
    Ответ написан
    3 комментария