Comments 59
>>Преимущество использования CSS фреймворков заключается в том, что верстальщику не нужно думать о многих нюансах верстки

Это не так. Если верстальщик сам не будет продумывать разное поведение интерфейса, никакой фреймворк не поможет.

>>Данный подход может сильно ускорить вёрстку сайта.

Не соглашусь, наоборот использование фреймворков там, где это не нужно лишь, увеличивает время разработки. Часто обращаются заказчики, с тем чтобы переверстать проект который изначально был сверстан на Bootstrape. Смотришь код — там каша, часть Bootstrapа, часть писали сами, потом видать решили перейти на БЭМ… ужас :)

Конечно, на вкус и цвет товарищей нет, но не вижу смысла использовать бутстрап, даже для прототипирования. Зачем, когда можно для того же прототипирования подключить БЭМ-компонент и вуаля. А диз потом нарисуют, компонент внутри обновлю, а хтмл-код и структура документа останется нетронутой :)
Если у вас нет уникального интерфейса и он не планируется — используйте бутстрап.

Иначе (если будет уникальный интерфейс) — верстайте самостоятельно, без всяких сторонних фреймворков.
При чём тут вообще уникальный интерфейс? Основная идея Bootstrap — это построение сайтов, которые одинаково хорошо функционируют как на мобильных устройствах, так и на компьютерах. Bootstrap даёт в руки все необходимые инструменты для этого, а уж как они используются — это дело верстальщика.

Можно, разумеется, пользоваться только встроенными компонентами и никак не менять их внешний вид. Тогда да, с уникальностью будут проблемы. Но никто не мешает настроить внешний вид под себя или сделать свои. Смотря на сайты, сделанные с помощью Bootstrap, как-то не похоже, чтобы у них с уникальностью интерфейса были какие-то проблемы.
>>Основная идея Bootstrap — это построение сайтов, которые одинаково хорошо функционируют
>>как на мобильных устройствах, так и на компьютерах

Это отлично делается и без бутстрапа.

>>Но никто не мешает настроить внешний вид под себя или делать свои.

Зачем что-то «настраивать», когда можно взять и написать, что именно нужно и как именно нужно.

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

>>Смотря на сайты, сделанные с помощью Bootstrap, как-то не похоже,
>>чтобы у них с уникальностью интерфейса были какие-то проблемы.

Вы уж извините, но они все как под одну копирку, похожи. Простенькие лендинги.
Я уж не говорю про код, заглянул в первый попавшийся exosource.com и что там видим?
id=«page» id=«header» id=«exo_logo» id=«main-content» — без комментариев
Делается. И самому можно писать. Только почему не воспользоваться уже готовым, чтобы сэкономить на своём времени? Какой-то странный спор.

Сайт Grunt — это просто лендинг-страница? Или сайт Sentry? Или вот этот инструмент? Вот ещё одна коллекция сайтов, сделанных на Bootstrap. По-моему, очевидно, что на Bootstrap можно делать не только лендинг-страницы.

Я уж не говорю про код, заглянул в первый попавшийся exosource.com

Да, кто-то сделал кривой сайт. При чём тут сам Bootstrap?
Чем ближе к концу вашей статьи, тем больше вредных советов попадается. Особенно я бы не советовал использовать такую убер-вложенность
body footer .container .footer-logo a {
text-decoration: underline;
}
Такие стили — не есть гуд с любой точки зрения. Можно ограничиться чем-то вроде .footer-logo a {..}
Жизнь никогда и не было сложной, уже давно есть несколько хороших и актуальных sass-портов.
А расскажите, почему вы использвали winless? Просто я пытаюсь найти адекватную программу для компиляции less файлов, но ни winless, ни simpless меня не устраивают
Попробуйте prepros, до того как перешел на grunt я им пользовался.
На самом деле, на практике я использую плагин для phpStorm. Во время создания статьи я просмотрел несколько вариантов и мне показалось, что для новичка использование WinLess будет самым простым вариантом. Расскажите, чем они вас не устраивают и мы всем сообществом попробуем вам помочь.
simpless часто зависает, иногда добавляю 2 less файла, но компилится только один. в winless можно добавить только папку, а потом снимать галочки. у меня, например десятки less, которые включены в один основной и только его нужно компилить
А чем вас winless не устраивает? Я использую, отлично работает.
Prepros, о коем говорили выше, тоже вполне себе.
bootstrap хорошая вещь, но сколько же он несет с собой ненужных стилей… даже через firebug трудно инспектировать
простите мне мой нубский вопрос, но неужели нельзя вообще никак избавиться от этих стилей? потереть их как-нибудь, файлы поудалять?
В гуглохроме наблюдается следующий занятный косяк:

Сразу после открытия страницы форма поиска выглядит так.

Если, к примеру, вернуться назад и снова вперед (имею в виду хистори браузера) — форма возвращается на законное место.

При нажатии «обновить страницу» — снова сползает.
Косяк из-за того, что внутри одного блока расположили и inline-level, и block-level элементы.

Вот что происходит в таких случаях: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Visual_formatting_model#Anonymous_block_boxes

Хотя почему хром себя так неоднозначно ведёт — вопрос. Вот наглядный пример, когда при первоначальной отрисовке получается одно, а при перерисовке — озвученная выше ситуация: http://thican.net/~camusensei/chromium_bug/floatProblem.html (надо дважды кнопку нажать)
Если не ошибаюсь, то в случае с формой достаточно поменять местами блоки в html (форму и лого)
Думаю, было бы неплохо написать еще про миксины для сетки. С ними можно обойтись без лишних, на мой взгляд, классов вроде .col-md-offset-1, что делает верстку семантичнее. Но это дело вкуса.
Недостатком использования фреймворков является тот факт, что странице придется целиком «нести» за собой лишние стили фреймворка, даже если она использует лишь их малую часть.

Bootstrap позволяет использовать отдельные компоненты фреймворка.
Конечно, именно по-этому написано «лишние», а не «все», так как все-равно в проекте окажутся некоторые ненужные стили.
Откуда они там возьмутся?
Если я выберу только сетку, то и в css я получу только сетку и не более.
Допустим у вас есть html, в котором вы используете 2 раза только класс col-md-6 и все, однако, подключив компонент сетки к вам приедут классы col-md-1, col-md-2… col-md-12 и это не считая аналогичных классов других разрешений экранов.
Но зачем тянуть сетку ради одного класса? Стрельба из пушки по воробьям.
Когда я подключаю сетку, мне нужна вся сетка, с почти всеми её фичами. Иначе я просто напишу свой собственный css.
И случай, который привели вы, вполне реализуем. Я могу настроить переменные при кастомизации так, чтобы у меня было только две колонки в шаблоне.
По-хорошему если, такие вещи нужно продумывать на уровне самих веб-стандартов, чтоб люди не морочили голову написанием и использованием подобных средств. К примеру, по-моему ещё со времён третьего html можно было додуматься до необходимости тэга типа article. Про header вообще молчу…
Простите, но вы неправильно готовите LESS и бутстрап :)

Про LESS:

— Идея отображать структуру HTML в стилях не очень удачна, т.к. при изменении структуры придётся переписывать и сами стили. Взять те же социальные кнопки — они вполне могут быть расположены в шапке или в сайдбаре.

Про бутстрап:

— Если статья для новичков, с LESS бы я вообще не заморачивался. Идём в конструктор, отмечаем только нужные компоненты, тут же выставляем нужные значения переменных, забираем скомпилированную CSS-ку.

— Собственно, одна из основных фишек играет против вас: макет разваливается при уменьшении размеров окна браузера. Если адаптивность не предполагается — надо отключать.

PS: новичкам, которые познакомиться с бутстрапом (или с вёрсткой в целом, хотя начинать лучше без фреймворков), я бы посоветовал посмотреть примеры на сайте фреймворка, почитать документацию (она очень даже неплоха) и уже после этого пробовать верстать макеты.
<div class="row">
    <div class="col col-md-4">
        ...
    </div>
    <div class="col col-md-4 col-md-offset-1">
        ...
    </div>
    <div class="col col-md-4 col-md-offset-1">
        ...
    </div>
</div>


И далее повторяющиеся блоки.
Вопрос 1: Для чего оборачивать это все в div.row? Для того кто будет интегрировать такой макет нужно просчитывать дополнительно каждый 5-й элемент и закрывать и открывать теги? Это не на столько серьезная проблема, но все же. Интересно. почему так?

Вопрос 2: Каждый первый элемент имеет классы «col col-md-4», а все последующие «col col-md-4 col-md-offset-1». Это обусловлено фреймворком? Т.е. тут возникает снова проблема (ну ок, не такая уж и большая) при интеграции, высчитывать каждый первый элемент и назначать ему отличный от других класс.
  1. Существует правило, по которому все элементы с float желательно оборачивать элементом с так называемым clearfix — это хак, который «очищает поток», искусственно выставляет у контейнера с плавающими элементами высоту, равную высоте самого крупного из них. Без него контейнер будет иметь нулевую высоту (т.к. в нем нет статического содержимого), а это может привести к тому, что последующие за ним элементы как бы «протекут» внутрь него:

    jsfiddle.net/h2k3q/

    В случае Bootstrap то же самое: сеточные «колонки» .col.col-md-4 делаются на float, а для .row задается «micro clearfix» вида

    .row:before, .row:after{
        display: table;
        content: " "
    }
    


    Кроме этого, для .row также задаются отрицательные горизонтальные отступы, равные постоянному «зазору» сетки — это необходимо для создания «full-width layout», а в некоторых css-фреймворках (например, Foundation) для .row задается также max-width, что ограничивает ширину всей сетки, и выравнивание по центру (margin: 0 auto) — по сути, то же самое, что делает .container у Bootstrap.
  2. Это обусловлено фреймворком?

    Скорее, это обусловлено структурой макета :) Но, как уже писал выше, от этих классов можно избавиться, используя миксины:

    {селектор для нужного "row"} > div{
        .make-md-column( 4 )
    }
    {селектор для нужного "row"} > div:not(:first-child){
        .make-md-column-offset( 1 )
    }
    


По п1. имелось ввиду: зачем группировать блоки по 5, а не использовать один общий блок с div.row и один clearfix?
А, прошу прощения, не так вас понял :) В принципе — незачем, можно использовать и один .row.

В том же Foundation, кстати говоря, для таких вещей сделали Block grid. Не знаю, есть ли нечто подобное в Bootstrap.
Раз уж тут так много верстальщиков, объясните почему все делают так:
<nav>
	<ul>
		<li>
			<a href="#">Link 1</a>
		</li>
		<li>
			<a href="#">Link 2</a>
		</li>
	</ul>
</nav>

а не так:
<nav>
	<a href="#">Link 1</a>
	<a href="#">Link 2</a>
</nav>

Стилей меньше, мусора меньше, да и парсить анализатору — тоже проще.
Ну и уже к автору статьи: зачем все в wrap`ер обернул? Например ту же навигацию можно было выровнять так:
nav { 
	display:block;
	width: 60em;
	margin: 0 auto;
}
Спецификация W3C говорит, что

A nav element doesn't have to contain a list

но

In cases where the content of a nav element represents a list of items, use list markup to aid understanding and navigation.

А вообще, существует два мнения по этому вопросу:

  1. (в пользу списков) — списки внутри nav делают верстку более структурированной и семантичной. Если буквально, то мы видим перед собой «список ссылок», следовательно, и верстаем его как список ссылок. Кроме того, со списками можно легко делать навигацию, если в ней есть вложенные подразделы.
  2. (в пользу «listless» nav) — списки могут затруднять пользование сайтом людям с ограниченными возможностями, которые пользуются Screen Reader-ами (http://css-tricks.com/navigation-in-lists-to-be-or-not-to-be/).


Однако, последнее утверждение достаточно спорное, если почитать комментарии к этой статье:

css-tricks.com/navigation-in-lists-to-be-or-not-to-be/#comment-689246

(...)

(1) semantics: at the UL JAWS pauses and announces that I’ve entered a list, it tells me at least that the next items go together; NAV is better but a list of links is not necessarily a navigation, (2) JAWS understands li tags as separate items and stops after reading each item, (3) more semantics: hierarchy is clear if one list is nested inside another (subnav) – JAWS announces nesting. For nested navigation/links, I would lean towards nested lists. (4) Not sure how people use this exactly, but JAWS does have a shortcut key that detects any lists on the page. Lists are more discoverable.
Верстка в этой статье была сделана настолько близко к правилам, диктуемым фреймворком, насколько возможно. Многие блоки кода брались целиком из примеров, описанных в документации Bootstrap. По первому вопросу, могу предположить, что списки в меню сейчас используются для того, чтобы поисковикам было легче парсить и такой подход считается более семантичным.
UFO landed and left these words here
Ребят, а есть что-нибудь промежуточное между скелетоном и бутстрапом? одного мало, второго слишком много
А зачем использовать всё? Есть ведь раздел Customize, при помощи которого можно скомпилировать только то, что вам нужно. Обычно я изначально беру по минимуму компонентов. Если по ходу верстки оказалось, что чего-то не хватает, не проблема ведь взять необходимые стили/js из полной версии. Это лучше, чем взять все и большая часть кода будет просто висеть мертвым грузом.

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

Если использовать бездумно/не разобравшись, то любой, даже самый хороший инструмент может показаться плохим.
Bootstrap — это «не стандарт», всё что не стандарт -только запутывает разработчиков и еще много негативных моментов возникает.
Особенно когда делала одна компания сайт на Bootstrap, а избавляла от ошибок первой другая.

Как сказали бы в авиа сфере — стандарты написаны кровью, в прямом смысле слова. Если бы самолеты делали бы как угодно в стиле Bootstrap и не по стандартам, они падали бы как яблоки осенью.
Mirantus, можешь ставить минусов сколько захочешь, но bootstrap — это мода ведущая в некуда. Она совершенно запутывает всё что можно а не упрощает. Если в языках программирования можно понять FW и они там нужны, то в верстке — извините, это какое-то убожество и примитивизм разработчиков на нем.
Почему вы считаете, что я должен ставить вам минусы? Моя задача была описать как сейчас верстают сайты на самом популярном css фреймворке. Это отнюдь не означает, что я являюсь его евангелистом.
Я вам опишу ситуацию с opencart, наверно вы знакомы с этой e-commers cms.
Разработчик её, Даниэль Керр (китаёза европейский, только китайцы и раскрутили это архитектурное недоразумение под названием opencart, поверьте на слово я знаю архитектуру от «а» до «я» opencart, а модули мои официально приобрели более чем 1000 интернет-магазинов)), решил сделать версию opencart 2.0 и перевел её на bootstrap.

Итог — ничего в архитектуре не поменялось, ошибки он архитектурные так и не исправил (как были детские ляпы так и остались), а сама 2.0 версия уже более года «разрабатывается» (если можно назвать перевод opencart на bootstrap).
Но… мало того 50% модулей всех разработчиков привязаны к «старой» сетке классов и id дизайна. И что будет далее. Всем все темы и модули по новой переделывать? Из-за чего! Из-за моды. Хотя там bootstrap и [censored] не нужен.

Вот до чего доходит мода маразма с fw в верстке!

Поэтому я и ответил, на основе опыта и анализа, правдиво, за что постоянно «получаю» не заслуженно имхо (с 250 карма уже до -12 дошла), без каких либо ответов и комментариев, мне то все равно она электронная, но очень неудобно что из-за неё не могу отвечать и комментировать могу всего раз в час, хотя как разработчику мне есть что ответить и поделиться опытом). Ну, правду не все любят :)
Я попробую ответить вам (сам я минусы не ставил).
Я считаю, что верстка — это совершенно отдельная профессия, весьма далёкая от программирования.
Вот я программист, и для меня вёрстка (чем иногда приходится заниматься) даётся сложно, гугл стонет от запросов в некоторых случаях. Для меня использование бутстрапа может стать чем-то вроде отдушины, ибо он (по крайней мере, для меня) приближает вёрстку к более формальному процессу из-за наличия компонентов.
Я пока использовал бутстрап только в админках и прототипах своих проектиков (чтобы было хоть что-то). Благодаря этой статье, я разобрался, как его применить для чего-то более серьёзного, за что автору большое спасибо.
Из комментов выше я понял, что профи вёрстки не используют бутстрап вообще, либо умеют его отлично готовить к месту, благодаря своему опыту. Я опыта не имею (и не так уж хочу получать, ибо не моё), и бутстрап для меня хороший инструмент, в некоторых применениях.
Ваш скепсис тоже очень понятен, и минусуют вас не за ваш опыт (который только в третьем комменте и видно), а за категоричность. Хабр не любит категоричность, и всегда за него наказывает. Что, в принципе, и правильно.
В некоторых моментах категоричность должна быть. Особенно когда видишь много моментов «со стороны», особенно когда минусов гораздо больше чем плюсов. Можно сколько угодно спорить, но есть еще факты. А факты и дают категоричность.
Хотите пользуйтесь, ваше дело, но с точки зрения профессионализма — bootstrap путь в никуда. fw для «домохозяек», которые никогда не хотят стать профессионалами
Нашел небольшой ляп: при мобильной версии «футер» не растягивается по вертикали, и все элементы, кроме первой колонки вылезают за пределы «футера». Решается проблемка добавлением одной строки:
overflow:auto;
А вообще, автор, вам огромное СПАСИБО! Давно желал познакомиться с грамотной версткой на Бутстрапе. Неплохо было бы если бы вышел 3 урок — то же самое, только на Foundation
Очень смущает в footer
<div class="row">
            <div class="col-md-8 twitter"></div>
            <div class="col-md-4 sitemap"></div>
            <div class="col-md-6 social"></div>
            <div class="col-md-6 footer-logo"></div>
        </div>

ибо документация гласит что:
Bootstrap includes a responsive, mobile first fluid grid system that appropriately scales up to 12 columns as the device or viewport size increases.
Only those users with full accounts are able to leave comments. Log in, please.