Структура файлов
Для удобства редактирования тем, была создана отдельная базовая тема BaseTheme
, содержащая стандартные стили и настройки общие для всех тем и могут быть переопределены в каждой. В данной статье будет рассматриваться пример реализации одного контрола и не будут затронуты формы.
Структура файлов в общем виде выглядит так:
- BaseTheme
- Controls
- SomeControl
- Images
- _Variables.less
- Lookup.less
- SomeControl
- Controls
- Theme
- Controls
- SomeControl
- Images
- _Settings.less
- _Variables.less
- Lookup.less
- SomeControl
- Base.less
- Base.css
- Controls
В данной структуре в качестве примера используется только одна тема Theme
, которая содержит в себе один единственный контрол SomeControl
. Что означает каждый файл будет рассмотрена ниже.
Уровень BaseTheme
Внутри базовой темы хранится папка Controls
, которая содержит в себе какие-либо контролы. В данном случае это один единственный контрол SomeControl
. Внутри этой папки содержаться папка Images
, в которой хранятся картинки для контрола и два .less файла.
_Variables.less
- содержит в себе набор переменных для использования в стилях. К переменным относятся: названия классов и идентификаторов, цвета и отступы.
SomeControl.less
- содержит в себе стандартные стили для контрола. К ним относятся расположение элементов на странице, стандартные цвета и отступы.
Уровень Theme
Theme
соответствует одной из существующих тем. Внутри темы, как и в случае с BaseTheme
, хранится папка Controls
, в которой содержится SomeControl
. Внутри данной папке есть папка Images
, которая содержит картинки конкретно для этого контрола и три .less файла.
Назначение _Variables.less
и SomeControl.less
остается неизменным. Файл _Settings.less
используется для переопределения существующих стилей и для доработок в прикладных проектах
Реализация на примере контрола Lookup
В качестве примера будет рассмотрен простой лукап, состоящий из input
типа text
и двух кнопок.
Файловая структура будет выглядеть следующим образом:
- BaseTheme
- Controls
- Lookup
- Images
- _Variables.less
- SomeControl.less
- Lookup
- Controls
- Theme
- Controls
- Lookup
- Images
- _Settings.less
- _Variables.less
- SomeControl.less
- Lookup
- Base.less
- Base.css
- Controls
Разметка лукапа
<body>
<div class="control">
<div>Тестовы лукап</div>
<div class=txtInput>
<input type="text">
</div>
<div class="viewBtn">
<span></span>
</div>
<div class="deleteBtn">
<span></span>
</div>
</div>
</body>
Для начала будет рассмотрена реализация на уровне базовой темы. Все названия классов необходимо вынести в переменные и добавить в _Variables.less
. Этот файл необходимо импортировать в Lookup.less
в самом начале - до определения стилей - с ключевым словом (reference) - позволяет импортировать содержимое файла, при этом не добавлять его физически. Это позволяет не импортировать одни и те же записи по нескольку раз.
@parentControlClass: control;
@textInputClass: txtInput;
@viewBtnClass: viewBtn;
@deleteBtnClass: deleteBtn;
@inputBorderColor: #B9B9B9;
@btnHoveredBackgroundColor: #f0f0f0;
Далее, в Lookup.less
надо прописать стандартные стили для контрола, а именно: базовые цвета, расположение элементов на странице. В итоге получится нечто такое:
.@import (reference) '_Variables.less';
@{parentControlClass} {
text-align: center;
margin-top: 10%;
.@{viewBtnClass},
.@{deleteBtnClass} {
display: inline-block;
margin-right: -6px;
margin-left: -7px;
padding: 4px;
width: 24px;
height: 24px;
border: 1px solid #9B9B9B;
-moz-border-radius: 0;
-webkit-border-radius: 0;
background-image: -moz-linear-gradient(top, #ffffff, #cecece);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#cecece));
background-image: -webkit-linear-gradient(top, #ffffff, #cecece);
background-image: -o-linear-gradient(top, #ffffff, #cecece);
background-image: linear-gradient(to bottom, #ffffff, #cecece);
-moz-box-shadow: inset 0 0 1px 1px #fff;
-webkit-box-shadow: inset 0 0 1px 1px #fff;
box-shadow: inset 0 0 1px 1px #fff;
vertical-align: top;
cursor: pointer;
span {
display: inline-block;
margin-top: -1px;
padding: 0;
width: 16px;
height: 16px;
vertical-align: middle;
line-height: 0;
filter: none;
}
}
.@{deleteBtnClass} {
margin: 0;
}
.@{textInputClass} {
display: inline-block;
input {
padding-left: 8px;
height: 28px;
&:focus {
outline: none;
}
}
}
}
Также необходимо в _Variables.less
добавить переменные, содержащие в себе основные цвета лукапа. В данном примере рассмотрена одна переменная, отвечающая за цвет границы input`a.
@inputBorderColor: #B9B9B9;
В результате всех действий получится стандартный контрол. Далее его можно изменять и расширять в зависимости от темы, в которой он находится.
Пример на уровне темы Theme
.
В Lookup.less
до определения стилей необходимо импортировать Lookup.less
из BaseTheme
. Далее можно добавлять новые стили. Все новые отступы, цвета, классы, идентификаторы необходимо вынести в _Variables.less
, который находится в Theme
. Также в этот же файл выносятся цвета, использующиеся в контроле. _Variables.less
необходимо подключить в самом конце - после стилей - для того, чтобы перегружать существующие переменные. Кроме того в Lookup
- также в самом конце - нужно подключить _Settings.less
. Этот файл используется для прикладных проектов. Чтобы в нем срабатывали переменные, использующиеся в теме, необходимо импортировать _Variables.less
как из Theme
так и из BaseTheme
.
В результате:
_Variables.less
@textColor: red;
@inputFocusedBackgroundColor: yellow;
@inputBorderColor: #000;
@inputTextColor: blue;
Lookup.less
@import '../../../BaseTheme/Controls/Lookup/Lookup.less';
.@{parentControlClass} {
div:first-child {
color: @textColor;
font-weight: bold;
font-style: italic;
font-size: 25px;
}
.@{viewBtnClass},
.@{deleteBtnClass} {
span {
background-image: url("lookup-icons.png");
background-position: 0 0;
background-repeat: no-repeat;
}
}
.@{deleteBtnClass} {
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
span {
background-position: 20% 0;
}
}
.@{textInputClass} {
input {
height: 30px;
border: 1px solid @inputBorderColor;
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
color: @inputTextColor;
&:focus {
background: @inputFocusedBackgroundColor;
}
}
}
}
@import (reference) '_Variables.less';
@import '_Settings.less';
Пример _Settings.less
выглядит следующим образом:
@import (reference) '../../../BaseTheme/Controls/Lookup/_Variables.less';
@import (reference) '_Variables.less';
.@{parentControlClass} {
.@{deleteBtnClass} {
span {
background-position: -65px 100%;
}
}
}
В результате иконка кнопки удаления будет отображаться иначе.
После полной настройки лукапа, файл Lookup.less
(в Theme
) необходимо импортировать в Base.less
. После компиляции будет получен Base.css
. При этом будут учтены как правила в базовой теме, так и в отдельной. Кроме того, будут подгруженs все настройки для прикладных проектов и общие настройки для тем.