Skip to content

Instantly share code, notes, and snippets.

@iAdramelk
Last active June 4, 2024 05:34
Show Gist options
  • Save iAdramelk/d328b73c72cab92ef95f to your computer and use it in GitHub Desktop.
Save iAdramelk/d328b73c72cab92ef95f to your computer and use it in GitHub Desktop.
Длинная телега про Бутстрап

Английская версия: https://evilmartians.com/chronicles/bootstrap-an-intervention

Вводная часть

У CSS есть несколько базовых проблем, которые позволяют очень быстро отстрелить себе ногу при неправильном использовании:

  1. Глобальный неймспейс – в серверном программировании все что написано в файле, в файле и остается. Все же что написано в css и js засирает глобальное пространство имен со всеми вытекающими. В JS эту проблему сейчас побороли всякими модульными системами, а вот с css сложнее. В идеальном мире это должен починить Shadow DOM и настоящие Web Components, но пока их нет единственный способ с этим бороться – следовать какой-то системе именований селекторов, которая по возможности уменьшает и исключает возможные конфликты.

  2. Каскадность – если на один элемент может сработать несколько правил, то они все и сработают последовательно. Если есть элемент h1.title, на него сработают все правила для тегов h1 и все правила для класса .title. Так как весь html состоит из тегов, то правил которые применяются на теги без классов будут работать на все вообще.

Соответственно назначать или переназначать стили у тегов – это примерно то же самое, что править прототипы объектов в JS, чем в свое время печально славился Prototype.js. Эти стили унаследует вообще все объекты и если их потом захочется поменять, то результат будет такой же, как если ты решил в прототипе объекта поменять результаты какого-то метода, который используют все дети этого объекта. Вероятность что-то сломать почти 100%.

  1. Вложенные селекторы. Можно написать селекторы .nav .item {...} и .menu .item и .item в зависимости от места вывода будет показываться по-разному. Все хорошо пока тебе не нужно поместить блок menu внутрь блока nav. Тогда сайдэффекты становятся совершенно непредсказуемые. По сути аналог вложенных селекторов из программирования – это функция которая в зависимости от места где её вызывают, выдает разный результат. Например в одном месте sum(2,2) может возвращать 3, а в другом 5.

Зачем нужны методологии

Хорошая методология занимает предотвращением этих проблем. Покажу как это делает БЭМ, но CSS Modules, Polymer или всякие решения с инлайновыми стилями для Реакта тоже решают именно их, только другим способом.

Как именование классов по БЭМу помогает решать эти проблемы:

  1. БЭМ запрещает применять стили на теги, максимум ресет. На id тоже нельзя, потому что такие элементы нельзя на странице использовать 2 раза, а сколько раз он тебе понадобится ты не всегда знаешь заранее. Все стили можно применять только к классам.
  2. БЭМ создает для всех компонентов глобальный неймспейс – все классы которые относятся к компоненту начинаются с одного префикса. Это позволяет исправить второй пример таким образом: .nav__item, .menu__item. Если один вложить в другой не будет конфликта правил.
  3. Под каждый компонент в БЭМ создается своя папка – это защищает тебя от конфликтов в именах компонентов и при правильном использовании дает гарантию, что в глобальном неймспейсе будет только один компонент с таким префиксом.
  4. В БЭМ есть только один вид вложенных селекторов: модификатор > элемент. Оба начинаются с одного префикса, оба живут в одном файле, оба никак не влияют на другие компоненты.

Что делает Bootstrap

Bootstrap нарушает КАЖДОЕ из этих правил:

  1. Bootstrap переназначает стили тэгов.
  2. Bootstrap в куче случаев меняет способ отображения элемента в зависимости от того, кто его родители. Хорошо хоть сейчас делает это через >, а не просто так. Но вот https://github.com/twbs/bootstrap/blob/master/less/button-groups.less такие штуки все равно сильно уменьшают предсказуемость и усложняют редизайн.
  3. Bootstrap загрязняет глобальный неймспейс сотнями классов с очень generic именами: .table, .dropdown, .row, .left, и т. д. Которые надо все помнить и ни в коем случае не использовать самому.

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

Когда Boostrap можно использовать

Чтобы не отстрелить себе ногу Bootstrap'ом и получить от него пользу нужно чтобы проект соответствовал ряду требований:

  1. На проекте много страниц.
  2. Страницы собираются из простых базовых элементов. Базовый – это кнопка или таблица. Сложный – это пост в фейсбуке или комментарий к нему, они состоят из нескольких тегов и их нужно переносить и реиспользовать все вместе.
  3. Нет мест, где изменение и эксперименты с дизайном могут сильно повышать/понижать конверсию или другие важные метрики. Как корзина или страница товара в интернет магазине.
  4. Никогда не будет глобального редизайна.
  5. Типизация страниц окупается скоростью их внедрения.

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

Примеры ситуаций когда Bootstrap НЕ подходит

1. Большие интернет-магазины и новостные сайты

У интернет-магазина есть главный KPI – конверсия в покупки. Покупки очень сильно зависят от дизайна страницы товара и корзины/процесса оформления заказа. Изменение конверсии во многом зависят от дизайна, прибавка на полпроцента может тебе позволить удвоить размер команды фронтендеров.

Тут ты дизайнера не запинаешь в гайды. Наоборот ему нужно давать максимум возможностей для экспериментов и изменений, брать эти варианты и гонять 50 сплит-тестов одновременно. С разными отступами, размерами шрифтов, кастомными элементами и прочим.

Если делать такое на Бутстрапе без использования какой-нибудь методологии, то очень просто незаметно сломать что-то в какой-то невидимой сейчас части сайта или в каком-то редком состоянии текущей страницы. Ну и процесс подгонки по большей части будет состоять из борьбы с Бутстрапом и его локальными переназначениями.

Примеры:

http://www.amazon.com/ – тысячи страниц, сотни сплиттестов, постоянный ползучий редизайн. http://www.gog.com/ – мало стандартных элементов и много кастомных под этот сайт. http://www.nytimes.com/ – очень много сложных компонентов и исключений. Несколько ключевых экранов от дизайна которых зависят KPI. Сюда же большинство сайтов больших СМИ. http://arzamas.academy/ – так, до кучи.

2. Сайты со сложными реиспользуемыми в разных местах компонентами

Довольно часто компоненты которые тебе надо реиспользовать – это не кнопки и формы, а что-нибудь сильно больше по размеру. Например пост на Фейсбуке или лента с комментариями оттуда же. Бутстрап тебе никак не поможет тебе выделить этот компонент и защитить его от сайдэффектов. Тебе все равно придется использовать какую-нибудь методологию.

А вот вызвать проблемы, когда ты вставляешь этот элемент в какое-то новое место можно довольно легко.

Самый простой вариант взять сложный компонент в котором используется .form-control или label и поместить его в какую-нибудь форму с модификаторами. Куча разнообразный сайдэффектов обеспечена: https://github.com/twbs/bootstrap/blob/master/less/forms.less

Также много интересного можно получить если ты хочешь сделать выпадающий компонент (как непрочитанные сообщения в фейсбуке) и разместить его в закрытом состоянии в шапке, рядом с кнопкой которая его открывает: https://github.com/twbs/bootstrap/blob/master/less/navbar.less

Примеры:

https://mail.yandex.ru/ – мало стандартных контролов, куча кастумных контролов, много исключений, поддержка легаси. http://trello.com/ – много сложных компонентов, не очень много стандартных бутстраповских. Для http://try.discourse.org/ польза тоже весьма относительная будет.

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

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

Допустим ты решил поменять кегль у заголовков на каком-нибудь http://www.e1.ru . Ты переназначил стили h1 и h2. Ну ой, теперь тебе надо протыкаться по 100+ типам страниц и убедиться что у тебя не сломалось ничего: Ничего не вылазит за границы блоков.

При этом помня что еще https://github.com/twbs/bootstrap/blob/master/less/jumbotron.less и другие переназначатели и что изменения базовых стилей их скорее всего поломает.

Постепенно (постранично или даже по частям страниц) переводить сайт на новый дизайн при этом продолжая использовать стандартные бутстраповские элементы не получится.

Примеры:

https://www.kickstarter.com/ – за последние пару лет сайт как минимум дважды глобально передизайнивали, не считаю отдельных локальных экспериментов.

4. Промосайты и лэндинги

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

Как пример: http://um.mos.ru/promo/gosudarstvennyy_istoricheskiy_muzey/

5. Игры в браузерах

No comments.

Резюме

Да, у Бутстрапа есть своя зона применения. Но она точно не 80% сайтов. К 20-30% он подходит хорошо. Еще на столько же его можно натянуть, с весьма вероятными потенциальными проблемами. В остальных случаях сразу нет.

ну и надо всегда помнить, что проект обычно начинается как что-то простое и предсказуемое, а потом в процессе мутирует во что-то совсем другое. В случае с Bootstrap это будет большой проблемой, в случае с BEM или CSS Modules оно будет просто работать.

@irebane
Copy link

irebane commented Jun 4, 2016

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

@KleinMaximus
Copy link

KleinMaximus commented Apr 12, 2017

Берем Vue.js и радуемся scoped-стилям и модульному JavaScript :)
А Bootstrap на самом деле зло!

@DmitryPacificAtion
Copy link

DmitryPacificAtion commented Apr 27, 2017

В общем самое идеальное применение бутстрапа - это верстка админ панели сайта, или какого-нибудь опросника.
А так препроцессор + ваша любимая методология + мозг = любовь)

@snap44
Copy link

snap44 commented Oct 27, 2017

Но не весь сайт делать на флоатах, изверги!

А на чем? На таблицах? Если учесть что бс обрёл популярность когда ни о каких флексах/гридах в продакшн и речи быть не могло.

@ikenfin
Copy link

ikenfin commented Nov 17, 2017

Не хочу топить за бутстрап (поддержка этих здоровенных структур тот ещё подарочек), однако некоторые коменты труЪ–фронтендеров заставили улыбнуться, особенно тот, что про композер и плагины — давай–ка расскажи мне, что жаваскрипт–фронтендеры не юзают npm на каждый чих:)

Как по мне — если делаете что–то с нуля, то, очевидно, бутстрап, особенно в 2к17, это не лучший выбор (насколько мне известно, даже для админок есть уже полностью готовые решения). Сейчас у нас есть flex (у некоторых, даже grid) и тонны генераторов и миксинов практически на все случаи жизни. Однако почему-то тут никто не берёт в расчёт реальную жизнь, где всё далеко не так лампово, и пони не срут радугой и 80% (а то и больше) заказчиков не готовы переплатить, просто потому что bootstrap/jquery/bitrix говно.

БЭМ — это конечно классно и удобно, и при возможности его, конечно же, нужно использовать, но в реальном мире, увы, мы сталкиваемся с одной неприятной проблемой.
Возьмём, к примеру, среднего e-commerce заказчика. В нашем залупинске (думаю, в вашем тоже, если вы не из зажравшейся) в проект, как правило, люди не готовы вкидывать больше 100-150к, и, естественно, тут даже и речи быть не может о серьёзной разработке с нуля. При этом, любому бизнесу всегда нужно "вчера". Поэтому берётся некая готовая тема в качестве скелета и перепиливается под дизайн.

Берём мы готовую тему (и даже не бесплатную).
А на чём у неё строится вёрстка? Правильно — как правило, это bootstrap 3.
А почему бутстрап? Правильно, потому–что каждая собака его знает на зубок и в него уже встроена куча прикольного дерьма.


Забавно было внедрять БЭМ вёрстку в битрикс e-shop. Выяснилось, что у них куча стандартных компонентов (довольно сложных, если переделывать, да и нафиг это не нужно) сильно завязана на бутстрапе, и проще всего оказалось тупо добавить импорты необходимых bootstrap модулей, чем перевёрстывать эти компоненты и переписывать их js говнокод.

@Globik
Copy link

Globik commented Dec 16, 2017

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

@Globik
Copy link

Globik commented Dec 16, 2017

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

@Globik
Copy link

Globik commented Dec 16, 2017

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

@Globik
Copy link

Globik commented Dec 16, 2017

А spa сайты с бутстрапом , джиквери, модернайзером, с вебкомпонентами вообще тихий ужас.

@IlyaBaudin
Copy link

Интересно было почитать все доводы и мнения. Всем большое спасибо.

Единственное, что хотел бы сказать, как сказал @ikenfin все что тут написано для бизнеса никакой ценности не имеет.
Для бизнеса главное чтобы заработало, быстро и не дорого. Потом когда бизнес развивается уже нанимаются люди, профессионалы и все пишется по канонам и отваливается не малая котлета $. Опять же если этот бизнес крупный (веб сервисы, платформы и т.д). Если это сайт для кондитерской, для юр агенства и т.д. то стандартного быстрого лэндинга вполне достаточно на бустрапчике. И он будет работать и задачу свою выполнять. И даже переделывать его не особо будет нужно.

Те же магазины с интернет-покупками - они продают товары в физическом магазине. А сайт как дополнение. Многие магазины, которые ориентированы на интернет покупки (юлмарт, exist распавшийся) не особо то адаптированы и грамотно написаны с точки зрения frontenda. Потому что бизнесу это особо и не надо. Все это ценится среди разработчиков, которые могут понтанутся и такому же разработчику доказать что он дно, потому что делает на бутстрапе, а сам выпендриться что верстает в чистую с БЭМом со своим блэкджеком и... ну вы поняли.

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

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

Copy link

ghost commented Jun 5, 2018

Использование бутстрапа в своем проекте, это как купить белые кроссовки выйти из магазина и наступить в ...

@nin-jin
Copy link

nin-jin commented Sep 14, 2018

Не хватает кнопки лайка :-) Пробуйте публиковать такие статьи как issue. Тут инструкция и даже читалка: https://github.com/nin-jin/habhub

@kcgmss
Copy link

kcgmss commented Dec 24, 2020

Вот тут видел Bootstrap конструктор шаблонов сайта из готовых блоков.

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