Sass maps: отзывчивый дизайн без рутинных вычислений

от автора

Предисловие

Получив в свое распоряжение очередной psd файл, я уже знал список требований к будущему сайту, в одном из пунктов которых числился отзывчивый дизайн. Работу над ним начал с разметки главной страницы и в тот же момент подумал как было бы хорошо не использовать большинству известную формулу (target / context * 100 = result) приведенную в книге Итана Маркотта «Отзывчивый веб-дизайн», а сразу писать ширину каждого блока в пикселях, предварительно замерив ее в Photoshop, при этом получать все в процентах. Мысль мне показалась неплохая и я решил погуглить и попытаться найти что то по интересующему меня вопросу, но, к сожалению, мне не удалось разыскать что либо полезное. Ну, что ж, подумал я, раз нет ничего готового, способного мне помочь, тогда нужно сделать это самому. В данном вопросе я полагался на препроцессор Sass, который уже не раз помогал мне избежать лишней головной боли и строчек кода. К тому же я уже знал о существовании в Sass новых типов данных таких как lists и maps. Первый мне был не интересен, а вот без последнего моя затея потерпела бы краха. Основная идея состояла в том, что мне известна ширина каждого блока и сумма ширин блоков с одним уровнем вложенности равна 100% и если препроцессор позволит мне нужным образом обработать эти данные, то задавая ширину в пикселях, я мог на выходе получить ее в процентах не заботясь о вычислениях.

Приступим

Для большей наглядности я сделал условный прототип страницы.

Так, например, из прототипа видно что блок с классом main-content находится на одном уровне вложенности с блоком, имеющим класс sidebar, следовательно сумма их ширин равна 100%. Стоит также отметить, что вложенные блоки имеют «некрасивую» ширину и действуй я по старой схеме не удалось бы избежать вычислений по формуле. Давайте отразим эту структуру в HTML:

<html> <head></head> <body>   <section class="page-wrap">     <header></header>     <section class="main">       <section class"main-content">         <div class="article-feature"></div>         <div class="article-listing"></div>       </section>       <aside class="sidebar"></aside>     </section>     <footer>       <div class="social-list"></div>       <div class="partners-list"></div>       <div class="subscribe"></div>     </footer>   </section> </body> </html> 

Для упрощения визуального сравнения сайта с макетом зададим ширину блока с классом page-wrap такую же как в Photoshop. В конце не забудьте поменять значение с пикселей на проценты, а то отзывчивого сайта не видать.

.page-wrap {   width: 1021px; } 

Из сказанного ранее известно, что сумма ширин блоков с классами main-content и sidebar равна 100% и можно было бы приступать к вычислениям, но предварительно нужно сгрупировать эти данные, тут то нам и поможет ранее упомянутый тип данных maps.

$main: (main-content: 705, sidebar: 316); 

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

@mixin grid($grid) {   $totalWidth: 0;   @each $className, $width in $grid {     $totalWidth: $totalWidth + $width;   }   @each $className, $width in $grid {     .#{$className} {       width: (#{$width / $totalWidth * 100}) + '%';     }   } } 

Вызовем наш только что созданный mixin, передав ему переменную $main.

@include grid($main); 

Теперь открыв файл со сгенерированными css стилями, видим столь нужную нам ширину в процентах.

.main-content {   width: 69.04995%; }  .sidebar {   width: 30.95005%; } 

Аналогично образом вычисляем ширины для блока с классом main-content и блока footer.

$mainContent: (article-feature: 493, article-listing: 212); @include grid($mainContent); $footer: (social-list: 234, partners-list: 553, subscribe: 234); @include grid($footer); 

Содержимое css файла:

.article-feature {   width: 69.92908%; } .article-listing {   width: 30.07092%; } .social-list {   width: 22.91871%; } .partners-list {   width: 54.16259%; } .subscribe {   width: 22.91871%; } 

Выводы

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

P.S. Для того что бы работать с типом maps требуется compass версии 1.0.0.

ссылка на оригинал статьи http://habrahabr.ru/post/231281/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *