Основы

Что такое STRAP?

STRAP — это крутой базовый шаблон на Compass с крайне полезными фичами. Это больше, чем ещё один CSS-фреймворк (наверное, потому что это вообще не CSS-фреймворк). STRAP — это самый лучший способ упорядочить и ускорить вёрстку.

Что ещё за фичи?

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

Поддержка браузерами

Нормальные браузеры, нормальные мобильные браузеры, IE8+

Что для этого нужно?

Всего ничего: Node.js, Ruby (Windows)

После чего в командной строке:

npm install -g grunt-cli
npm install -g bower
gem install compass
И далее в папке проекта:
npm install
bower install

Запуск

В папке проекта выполните команду:

grunt serve
чтобы запустить локальный сервер для разработки
grunt serve:test
чтобы сделать то же самое, но и отслеживать тесты
grunt или grunt build чтобы собрать проект в папку dist.

Стайлгайды STRAP

HTML
  • Классы компонентов STRAP именуются в формате UpperCamelCase (что очень хорошо, если вы используете другой формат);
  • ID и названия атрибутов именуются-через-дефис;
  • Содержимое name атрибутов именуется_через_подчёркивание.
SCSS
  • Константы именуются в ALL_UPPER_CASE;
  • Переменные, примеси и функции именуются-через-дефис;
  • К имени приватных переменных, функций и примесей добавляется префикс _подчёркивание;
  • Комментирование в SCSS-файлах выполняется только двойным слешем //

Структура проекта

Всё более-менее очевидно, поэтому я остановлюсь на самом неочевидном: папке sass. Файлы этой папки должны отвечать за конечные, генерируемые CSS-файлы. Внутри каждого из них происходит сборка STRAP со всякими модулями: примесями, функциями, дополнительными классами, темами.

Практически всё содержимое /sass/strap/, за исключением /sass/strap/strap-lib/ является пользовательским расширением существующих в STRAP примесей, функций, конфигов и т.п.

Некоторые советы по поддержанию структуры

  • Используйте дефисы -для разделения названия имён файлов и папок;
  • Все генерируемые папки со спрайтами /images/sprites/ должны иметь префикс подчёркивания _ для корректной генерации;
  • Абсолютно все файлы внутри /sass/strap/ должны иметь префикс подчеркивания _, чтобы не быть скомпилированными в качестве отдельных файлов;
  • Файлы с двойным подчёркиванием __ не содержат в своём корне CSS (например, файлы с примесями, функциями, конфигами);
  • Файлы тем не должны ничего запрашивать из родительских директорий; вместо этого следует указывать запрашиваемые файлы в описание темы;
  • Крайне не рекомендуется менять содержимое в папке /sass/strap/strap-lib — любое поведение можно переопределить в пользовательских файлах.

Как выглядит типичная инициализация

// Инициализация
@import "strap/__init";

// Вы можете подключить все ui-компоненты одной строкой
@import "strap/_imports";
// ...или выборочно
@import "strap/strap-lib/misc/_normalize";
@import "strap/strap-lib/ui/_grid";
@import "strap/strap-lib/ui/_typography";
@import "strap/strap-lib/ui/_icons";

// Можете подключить всю тему целиком
@import "strap/themes/strap-ui/_init";
// Или частично
@import "strap/themes/strap-ui/ui/icons/_entypo";

Разметка

/sass/strap/strap-lib/ui/_grid.scss

Самый базовый класс

.Container — класс, с помощью которого происходит выравнивание контента по центру страницы. Рекомендуется к использованию в качестве обёртки (см. исходный код данной страницы).

Сетка

12 колонок, шириной 60px с отступами в 20px по-умолчанию, что даёт суммарную сетку в 960px.
Изменить дефолтные значения можно в конфиге /sass/strap/__config.scss

Col-6
Col-6
Col-4
Col-4
Col-4
Col-1
Col-2
Col-3
Col-3
Col-3
Col-2
Col-2
Col-2
Col-2
Col-2
Col-2
Col-1
Col-1
Col-1
Col-1
Col-1
Col-1
Col-1
Col-1
Col-1
Col-1
Col-1
Col-1
Col-1
Col-1 Offset-1
Col-3 Offset-2
Col-3
Col-2
Col-3
Col-7

Как их использовать?

В нашем распоряжении находится 12 колонок, и мы можем разделить их так, как захотим. Главное, чтобы части были целыми.

1. В первую очередь нам понадобится блок .Row (сплошная строка).

<div class="Row"></div>

2. Теперь было бы неплохо разделить её на несколько частей (8 и 4, к примеру).

<div class="Row">
	<div class="Col-8"></div>
	<div class="Col-4"></div>
</div>

3. И наконец, добавим блок .Content внутрь каждой колонки, чтобы было понятно, где находится контент (опционально).

<div class="Row">
	<div class="Col-8">
		<div class="Content">
			8 колонок
		</div>
	</div>
	<div class="Col-4">
		<div class="Content">
			4 колонки
		</div>
	</div>
</div>
8 колонок
4 колонки

Вложенные колонки

Никакой дополнительной магии не требуется. Просто поместите ещё один блок .Row внутрь колонки.

<div class="Col-6">
	<div class="Content">
		<div class="Row">
			<div class="Col-2">
				<div class="Content">
					Col-2
				</div>
			</div>
			<div class="Col-3">
				<div class="Content">
					Col-3
				</div>
			</div>
			<div class="Col-1">
				<div class="Content">
					Col-1
				</div>
			</div>
		</div>
	</div>
</div>
Col-2
Col-3
Col-1

Вертикальный ритм

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

* — На самом деле, всё не совсем так: сделать полноценный вертикальный ритм, без ручной подгонки, не представляется возможным. Однако, даже предлагаемый вертикальный ритм всегда выглядит лучше его отсутствия.

Не ломайте гармонию!

Следите за вертикальным ритмом!

Блеать!

Вертикальное выравнивание!

Этот блок должен быть
где-то вверху.
Этот блок — посередине.
А этот — прижат к самому низу.
<div class="Col-4 Top">
	<div class="Content">
		Этот блок должен быть<br/>
			где-то вверху.
	</div>
</div>
<div class="Col-4 Middle">
	<div class="Content">
		Этот блок — посередине.
	</div>
</div>
<div class="Col-4 Bottom">
	<div class="Content">
		А этот — прижат к самому низу.
	</div>
</div>

Респонсив

Поведение по-умолчанию: при достижении определённого значения размера экрана, колонки превращаются в список, «падая» друг под другом и расширяясь на 100%.

Для упрощения вёрстки блоков для разных размеров экранов существуют несколько простых и удобных классов, дополняющих строку .Row:

.Row.NoBreakне даёт колонкам падать вообще. Очень удобно, когда нужно разбить строку пополам в мобильной версии сайта.

Col-6
Col-6

.Row.Phone.Breakколонки падают только на телефонных разрешениях.

Col-4
Col-4
Col-4

.Row.Phone.Landscape.Breakколонки начинают падать с телефонных разрешений в альбомной ориентации.
Данный пример так же иллюстрирует возможности вложенных колонок в адаптивной вёрстке.

Col-1
Col-2
Col-3
Col-3
Col-3

.Row.Tablet.Breakколонки начинают падать с планшетных разрешений экрана.

Col-1
Col-1
Col-1
Col-1
Col-1
Col-1
Col-1
Col-1
Col-1
Col-1
Col-1
Col-1

.Row.Tablet.Landscape.Breakколонки начинают падать с планшетных разрешений в альбомной ориентации.

Col-2
Col-3
Col-7

Скрытие элементов

Те же самые классы работают для скрытия элементов, в зависимости от разрешения экрана. Только вместо .Break используется .Hide.

.Tablet.Landscape.Hide
.Tablet.Hide
.Phone.Landscape.Hide
.Phone.Hide

Текст

/sass/strap/strap-lib/ui/_typography.scss

Заголовок <h1> (38px)

Заголовок <h2> (32px)

Заголовок <h3> (24px)

Заголовок <h4> (18px)

Заголовок <h5> (16px)
Заголовок <h6> (12px)

Чтобы убрать отступы — достаточно добавить соответствующий класс к заголовку:

.NoTopMargin
Убирает верхний отступ
.NoBottomMargin
Убирает нижний отступ
.NoMargin
Убирает верхний и нижний отступы

Так выглядит обычный параграф.

А это <small>

Иконки

По-умолчанию, в STRAP встроены иконки Entypo. Ну как встроены — их классы нужно подключать, чтобы работать с ними:

// Инициализация
@import "strap/init";
	...
// Подключение классов для иконок Entypo
@import "strap/ui/icons/entypo";
	...

Этот вариант почти правильный. Почти, потому что внутри /sass/strap/ui/icons/_entypo.scss мы можем увидеть строчку // @required ui/icons. Такая строчка означает, что перед тем, как подключить данный файл, нужно убедиться, что так же подключён strap/ui/_icons.scss.

// Инициализация
@import "strap/init";
	...
// Правильное подключение классов для иконок Entypo
@import "strap/ui/icons";
@import "strap/ui/icons/entypo";
	...

Использование иконок

<i class="Icon Entypo {EntypoIconClass}"></i>, где {EntypoIconClass} — это класс иконки из представленных ниже:

Plus
Minus
Info
LeftThin
UpThin
RightThin
DownThin
LevelUp
LevelDown
Switch
Infinity
PlusSquared
MinusSquared
Home
Keyboard
Erase
Pause
FastForward
FastBackward
ToEnd
ToStart
Hourglass
Stop
UpDir
Play
RightDir
DownDir
LeftDir
Adjust
Cloud
Star
StarEmpty
Cup
Menu
Moon
HeartEmpty
Heart
Note
NoteBeamed
Layout
Flag
Tools
Cog
Attention
Flash
Record
CloudThunder
Tape
Flight
Mail
Pencil
Feather
Check
Cancel
CancelCircled
CancelSquared
Help
Quote
PlusCircled
MinusCircled
Right
Direction
Forward
Ccw
Cw
Left
Up
Down
ListAdd
List
LeftBold
RightBold
UpBold
DownBold
UserAdd
HelpCircled
InfoCircled
Eye
Tag
UploadCloud
Reply
ReplyAll
Code
Export
Print
Retweet
Comment
Chat
Vcard
Address
Location
Map
Compass
Trash
Doc
DocTextInv
Docs
DocLandscape
Archive
Rss
Share
Basket
Shareable
Login
Logout
Volume
ResizeFull
ResizeSmall
Popup
Publish
Window
ArrowCombo
ChartPie
Language
Air
Database
Drive
Bucket
Thermometer
DownCircled
LeftCircled
RightCircled
UpCircled
DownOpen
LeftOpen
RightOpen
UpOpen
DownOpenMini
LeftOpenMini
RightOpenMini
UpOpenMini
DownOpenBig
LeftOpenBig
RightOpenBig
UpOpenBig
Progress0
Progress1
Progress2
Progress3
BackInTime
Network
Inbox
Install
Lifebuoy
Mouse
Dot
Dot2
Dot3
Suitcase
FlowCascade
FlowBranch
FlowTree
FlowLine
FlowParallel
Brush
PaperPlane
Magnet
Gauge
TrafficCone
Cc
CcBy
CcNc
CcNcEu
CcNcJp
CcSa
CcNd
CcPd
CcZero
CcShare
CcRemix
Github
GithubCircled
Flickr
FlickrCircled
Vimeo
VimeoCircled
Twitter
TwitterCircled
Facebook
FacebookCircled
FacebookSquared
Gplus
GplusCircled
Pinterest
PinterestCircled
Tumblr
TumblrCircled
Linkedin
LinkedinCircled
Dribbble
DribbbleCircled
Stumbleupon
StumbleuponCircled
Lastfm
LastfmCircled
Rdio
RdioCircled
Spotify
SpotifyCircled
Qq
Instagram
Dropbox
Evernote
Flattr
Skype
SkypeCircled
Renren
SinaWeibo
Paypal
Picasa
Soundcloud
Mixi
Behance
GoogleCircles
Vkontakte
Smashing
DbShape
Sweden
LogoDb
Picture
Globe
Leaf
GraduationCap
Mic
Palette
Ticket
Video
Target
Trophy
ThumbsUp
ThumbsDown
Bag
User
Users
Lamp
Alert
Water
Droplet
CreditCard
Monitor
Briefcase
Floppy
Cd
Folder
DocText
Calendar
ChartLine
ChartBar
Clipboard
Attach
Bookmarks
Book
BookOpen
Phone
Megaphone
Upload
Download
Box
Newspaper
Mobile
Signal
Camera
Shuffle
Loop
ArrowsCcw
LightDown
LightUp
Mute
Sound
Battery
Search
Key
Lock
LockOpen
Bell
Bookmark
Link
Back
Flashlight
ChartArea
Clock
Rocket
Block

Функции

/sass/strap/strap-lib/__functions.scss

line()

line([lines: 1, font-size: px])

Возвращает количество пикселей, соответствующее высоте lines линий для установленного размера шрифта font-size. Функция необходима для поддержания вертикального ритма. Используется для задания вертикальных отступов и высоты строки. Постарайтесь не использовать любые другие вертикальные отступы. Аргумент lines должен быть кратен 0.25

/* 1 */
margin-bottom: line(1);
/* 2 */
margin-bottom: line(1, 20px);
/* 1 */
margin-bottom: 20px;
/* 2 */
margin-bottom: 31px;

gutter()

gutter([number: 1])

Возвращает указанное количество горизонтальных отступов, определяемых константой $GUTTER_WIDTH. Постарайтесь не использовать любые другие горизонтальные отступы. Аргумент number должен быть кратен 0.25

Примеси

/sass/strap/strap-lib/__mixins.scss

font-size

@include font-size (font-size[, lines])

Устанавливает размер шрифта в rem (с обратной совместимостью) и соответствующую ему высоту строки, чтобы попадать в вертикальный ритм. Всегда устанавливайте размер шрифта с помощью этой примеси.

/* 1 */
@include font-size(20px);
/* 2 */
@include font-size(20px, 2);
/* 1 */
font-size: 20px;
font-size: 1.42857rem;
line-height: 31px;
/* 2 */
font-size: 20px;
font-size: 1.42857rem;
line-height: 56px;

load-font

@include load-font(name, file-name-without-extension[, weight[, style]])

Подключает файлы шрифтов из папки /css/fonts/. Шрифты одного начертания должны обладать единым именем file-name-without-extension и быть представлены в четырёх форматах: eot, svg, ttf, woff. Насыщенность font-weight и стиль font-style задаются через аргументы weight и style.

heading

@include heading(top-lines, bottom-lines, font-size)

Устанавливает отступы в базовых линиях: сверху top-lines и снизу bottom-lines, а так же размер шрифта font-size для заголовка. Необходим для соблюдения заголовками вертикального ритма.

all-headers

@include all-headers { styles; }

Позволяет задавать стили для h1, h2, h3, h4, h5, h6 сразу.

breakpoint

@include breakpoint(start[, end]) { styles; }

Создаёт контрольные точки разрешений экрана для адаптивной вёрстки, начиная с которых срабатывают заданные styles. Если указан второй аргумент, правила срабатывают в диапазоне разрешений от start включительно до end не включительно.
Значением аргументов могут быть px или фиксированные значения ( phone | phone landscape | tablet | tablet landscape | content ), переопределяемые в /sass/strap/__config.scss.

@include breakpoint(phone landscape, tablet) {
	.Content {
		background: #c00;
	}
}
@media only screen and (min-width: 480px) and (max-width: 959px) {
	.Content {
		background: #c00;
	}
}

sprite-dir

@include sprite-dir(dir-name[, sprites-dir])

Создаёт спрайт из png изображений папки _dir-name (без префикса), находящейся в sprites-dir (по-умолчанию, в /images/sprites/). Используется со sprite-file.

sprite-element

@include sprite-element(file-name)

Возвращает изображение, смещение и размер спрайта file-name, который находится в папке _dir-name, установленной последним вызовом sprite-dir (dir-name).

.Icon {
	// Создаёт спрайт из всех .png внутри /images/themes/strap-docs/sprites/_browsers/
	// /images/themes/strap-docs/sprites/browsers-sprite.png
	@include sprite-dir("browsers", "themes/strap-docs/sprites");

	&.IE {
		// Указывает на файл /images/themes/strap-docs/sprites/_browsers/ie.png
		@include sprite-element("ie");
	}
}
.Icon.IE {
	background: url(../images/themes/strap-docs/sprites/browsers-sprite.png) no-repeat;
	background-position: 0 -84px;
	height: 79px;
	width: 84px;
}
Fork me on GitHub