Исмаил
Кодю на js
Магомедов Исмаил
HAOS DEV
Верстка стала сложной
Бизнес динамичен
Компонент - функциональная единица интерфейса
Компонент
Компонент - функциональная единица интерфейса
HTML
CSS
JS
CSS
.items-list {
color: red;
font-size: 16px;
}
...
.items-list {
font-size: 12px;
}CSS
CSS > Методологии
CSS > Методологии > BEM
.menu { font-size: 16px; }
.menu__link { color: #ffc000; }
.menu--large { font-size: 24px; }
<div class="menu menu--large">
<a href="..." class="menu__link">Click me!</a>
</div>CSS > Методологии > OOCSS
.button { padding: 15px 30px; }
.theme-red { color: red; }
.theme-large { font-size: 24px; }
<button class="button theme-red theme-large">
Click me!
</button>CSS > Методологии > SMACSS
p {
line-height: 1.5;
}
.layout {
margin: 0 auto;
max-width: 80vw;
}
.module {
font-size: 18px;
}
.important {
border: 2px solid red;
}
.text-red {
color: red;
}
<div class="layout">
<div class="module text-red">
<p class="important">
This messsage is important!
</p>
</div>
</div>CSS > Методологии > CSS Modules
p {
line-height: 1.5;
}
.layout {
margin: 0 auto;
max-width: 80vw;
}
.module {
font-size: 18px;
}
.important {
border: 2px solid red;
}
import css from './style.css'
const App = () =>
<div class={css.layout}>
<div class={css.module}>
<p class={css.important}>
This messsage is important!
</p>
</div>
</div>CSS > Методологии > CSS Modules
p {
line-height: 1.5;
}
.layout_y6TR {
margin: 0 auto;
max-width: 80vw;
}
.module_u88r {
font-size: 18px;
}
.important_OipL {
border: 2px solid red;
}
<div class="layout_y6TR">
<div class="module_u88R">
<p class="important_OipL">
This messsage is important!
</p>
</div>
</div>CSS
CSS
fontSize = 16px
mainColor = #f00
.menu
font-size: fontSize
&__link
color: mainColor
&--large
font-size: fontSize * 1.5Stylus
CSS
mainColor = #f00
button(radius)
border: 2px solid mainColor
border-radius: radius
theme-red(fontSize)
border-color: mainColor
color: darken(mainColor, 20%)
.button
button( 4px )
&--red
theme-red()
.button {
border: 2px solid #f00;
border-radius: 4px;
}
.button--red {
border-color: #f00;
color: #c00;
}
CSS
menu.styl
button.styl
etc.styl
style.styl
variables.styl
mixins.styl
Gulp.js / Webpack
style.css
HTML > Jade (pug)
mixin menu()
ul.menu
li.menu__link: a(href="#1") Link #1
li.menu__link: a(href="#2") Link #2
include menu.jade
.container
+menu()HTML > Jade (pug)
<div class="container">
<ul class="menu">
<li class="menu__link">
<a href="#1">Link #1</a>
</li>
<li class="menu__link">
<a href="#2">Link #2</a>
</li>
</ul>
</div>HTML > Jade (pug)
mixin button(text)
.button= text
include button.jade
.container
+button('Click me!')
+button('Click me again!')HTML > Jade (pug)
<div class="container">
<div class="button">
Click me!
</div>
<div class="button">
Click me again!
</div>
</div>HTML > Jade (pug)
mixin group(text)
.group
span= text
{block}
.container
+group('Group one')
img(src='one.jpg')
span Additional contentHTML > Jade (pug)
<div class="container">
<div class="group">
<span>Group one</span>
<img src="one.jpg">
<span>Additional content</span>
</div>
</div>CSS
menu.jade
button.jade
etc.jade
index.jade
Gulp.js / Webpack
index.html
HTML > Jade (pug)
JavaScript > ООП
var Slider = (function(options) {
this.selector = options.selector || '.slider';
this.nextSlide = function() {...}
this.goToSlide = function(slideNumber) {...}
return {
switchSlide: this.goToSlide
}
}());
var slider = new Slider({
selector: '.main-slider'
});
slider.switchSlide(3);JavaScript > ООП
class Slider {
constructor(options) {
this.selector = options.selector || '.slider';
}
nextSlide() { ... }
prevSlide() { ... }
goToSlide(slideNumber) { ... }
}
var slider = new Slider({
selector: '.main-slider'
});
slider.goToSlide(3);JavaScript > Фреймворки
JavaScript > Фреймворки
<CustomComponent />
Styles
Template
Model
JavaScript > Фреймворки > React
import React from 'react'
import Pagination from './components/pagination'
import ListItems from './components/ListItems'
class AdsList extends React.Component {
// Some code
render(
<div>
<ListItems model={this.state.model} />
<Pagination amount="40" limit="5" />
</div>
)
} import React from 'react'
import css from './style.css'
export class Pagination extends React.Component {
// Some code
render(
<div className={css.pagination}>
<nav>
{
...
return <a href="page/1">Page 1</a>
}
</nav>
</div>
)
}JavaScript > Фреймворки > React
JavaScript > Фреймворки > React
Store
Пространство в верстке
Пространство в верстке
Пространство в верстке
400 x 300px
40px
40px
50px
50px
Пространство в верстке
300 x 280px
40px
40px
50px
50px
Как это сделать?
bootstrap, flexbox-grid и т.д.
<script src="cq-prolyfill.js"></script>.menu:container("width > 500px") {
font-size: 18px;
}
.menu:container("width < 500px") {
font-size: 14px;
}Андрей Ситник
Итоги
(1 css, 1 html, 1 js)
Статьи
Видео
Изолируем компоненты в CSS (Андрей Ситник)
Раскладка по гриду. Можно вообще все (Вадим Макеев)
Decoupling the Front-end with Modular CSS (Julie Cameron)
Organizing CSS with OOCSS, SMACSS, and BEM (Matt Stauffer)
By Исмаил
что такое компоненты, почему это важно, как разрабатывать компоненты и использовать их в работе