59
1 Изоляция CSS Андрей Ситник, Злые Марсиане

Андрей Ситник

Embed Size (px)

Citation preview

Page 1: Андрей Ситник

1

Изоляция CSSАндрей Ситник, Злые Марсиане

Page 2: Андрей Ситник

2

Злые марсианеЗлые марсианеЗлые марсиане

Злые марсиане

Page 3: Андрей Ситник

3

Работали над

Page 4: Андрей Ситник

4

Наш опенсорс

Page 5: Андрей Ситник

5

Глава 1Глава 1Глава 1

Глава 1

Проблема Проблема Проблема

Проблема

Page 6: Андрей Ситник

6

Зачем нам ИТ?Зачем нам ИТ?Зачем нам ИТ?

Зачем нам ИТ?

Page 7: Андрей Ситник

7

Рост сложности

3 объекта 6 объектов

3 связи 15 связей

Page 8: Андрей Ситник

8

Решение роста

Page 9: Андрей Ситник

9

Программирование —Программирование —контроль сложностиконтроль сложности

Page 10: Андрей Ситник

10

Компоненты сети

Page 11: Андрей Ситник

11

Компоненты ОС

systemctl

systemd Core

manager service

socket

mount

systemd snapshot path

targettimer

swap

unitmultiseat inhibit

pamsession

loginnamespace

cgroup

log

dbus

systemd Libraries

Linux Kernel

systemd Targets

systemd Utilitiesnotify analyze cgls cgtop loginctljournalctl nspawn

dbus-1 libpam libcap libcryptsetup tcpwrapper libaudit libnotify

basic

reboot

bootmode

shutdown

dbus telephony

logind

multi-user

dloguser-

sesssion

graphicaldisplay serviceuser-session

tizen service

systemd Daemons

logind

journald

systemd

session

cgroups autofs kdbus

networkd

Page 12: Андрей Ситник

12

Компоненты JavaScript

import React from 'react';

import Logo from '../logo';

export const Header = () => (

<div class="header">

<Logo></Logo>

</div>

);

Page 13: Андрей Ситник

13

Компоненты дизайна

Page 14: Андрей Ситник

14

Глобальный CSS :-(

* {

box-sizing: border-box;

}

.title {

font-size: 30px;

}

Page 15: Андрей Ситник

15

Глава 2Глава 2Глава 2

Глава 2

Четыре всадника CSS Четыре всадника CSS Четыре всадника CSS

Четыре всадника CSS

Page 16: Андрей Ситник

16

Всадник 1 Конфликт селекторов

/* logo.css */

.name {

color: gray;

}

/* header.css */

.name {

color: red;

}

Page 17: Андрей Ситник

17

БЭМ

window.prefixA = …;

window.prefixB = …;

Page 18: Андрей Ситник

18

Всадник 2 Глобальный сброс

* {

box-sizing: border-box;

}

Page 19: Андрей Ситник

19

Всадник 3 Наследуемые свойства

body

.header

.logo

line-height: 1.4

line-height: 1.4

line-height: 1.4

Page 20: Андрей Ситник

20

Агрессивные селекторы

.article p {

margin-bottom: 1em;

}

Page 21: Андрей Ситник

21

Всадник 4 Медиа-выражения страницы

.logo:container( width <= 100px ) {

.name {

display: none;

}

}

Page 22: Андрей Ситник

22

Четыре встадника

Конфликт селекторов

Глобальный сброс

Наследуемые свойства

Медиа-выражения страницы

Page 23: Андрей Ситник

23

Ждать Веб-компонентов?Ждать Веб-компонентов?

Page 24: Андрей Ситник

24Глава 3Глава 3Глава 3

Глава 3

Революция Революция Революция

Революция

Page 25: Андрей Ситник

25

PostCSS

Page 26: Андрей Ситник

26

Задачи

Sass

PostCSS

Page 27: Андрей Ситник

27

Код

return gulp.src('src/*.scss')

.pipe( sass() )

.pipe( postcss(plugins) )

.pipe( gulp.desc('build/') );

Page 28: Андрей Ситник

28

Глава 4 Побеждаем глобальный CSS

Page 29: Андрей Ситник

29

Шаг 1 Чистая комната

gulp.task('css:new', () => {

return gulp.src('src/new/')

.pipe( postcss([

require('autoprefixer')

// other plugins

]) )

.pipe( gulp.dist('build/') )

});

Page 30: Андрей Ситник

30

Шаг 2 Нарежьте дизайн на блоки

Page 31: Андрей Ситник

31

Шаг 3 Папка для компонента

logo/

logo.js

logo.css

company.svg

header/

header.js

header.css

js/

logo.js

header.js

css/

logo.css

header.css

images/

company.svg

Page 32: Андрей Ситник

32

Шаг 4 postcss-modules

postcss([

require('autoprefixer'),

require('postcss-modules')

])

Page 33: Андрей Ситник

33

Пишите любые селекторы

.name {

color: red;

}

.Logo_name_jbds3 {

color: red;

}

Page 34: Андрей Ситник

34

Шаблон

var style = require('./logo.css.json');

export const Logo = () => (

<div className={ style.name }>

</div>

);

Page 35: Андрей Ситник

35

Работает с PHP и Rails

- style = load_json('logo.css.json');

%div{ class: style.name }

Page 36: Андрей Ситник

36

CSS Modules против БЭМ

1. Стили чище

2. Переносимость между проектами

3. Безопаснее для виджетов

Page 37: Андрей Ситник

37

Первая победа

Конфликт селекторов

Глобальный сброс

Наследуемые свойства

Медиа-выражения страницы

Page 38: Андрей Ситник

38

Локальный сброс

h1, h2, …, div {

/* сброс */

}

.header {

/* стили */

}

.logo {

/* стили */

}

.header, .logo {

/* сброс */

}

.header {

/* стили */

}

.logo {

/* стили */

}

Page 39: Андрей Ситник

39

Локальный сброс

body

.header

.logo

line-height: 1.4

line-height: 1

line-height: 1

Page 40: Андрей Ситник

40

Плюсы локального сброса

1. У каждого — свой ресет

2. Переносимость между проектами

3. Защищает от наследуемых свойств

Page 41: Андрей Ситник

41

Сброс по W3C

.logo {

all: initial;

}

Page 42: Андрей Ситник

42

Шаг 5 postcss-autoreset

postcss([

…,

require('postcss-autoreset')({

reset: {

all: 'initial',

boxSizing: 'border-box'

}

})

])

Page 43: Андрей Ситник

43

Шаг 6 postcss-cssnext

postcss([

require('autoprefixer'),

require('postcss-modules'),

require('postcss-autoreset'),

require('postcss-cssnext')

])

Page 44: Андрей Ситник

44

Полифил будущего CSS

.logo {

all: initial;

}

.logo {

display: block;

border: none;

padding: 0;

margin: 0;

}

Page 45: Андрей Ситник

45

Ещё две победы

Конфликт селекторов

Глобальный сброс

Наследуемые свойства

Медиа-выражения страницы

Page 46: Андрей Ситник

46

Шаг 7 cq-prolyfill

<script src="cq-prolyfill.min.js" async>

</script>

postcss([

…,

require('cq-prolyfill/postcss-plugin')

])

Page 47: Андрей Ситник

47

Медиа-выражения контейнера

.logo:container( width >= 100px ) {

}

.logo:container( text-align = right ) {

}

.logo:container( background-color lightness > 20% ) {

}

Page 48: Андрей Ситник

48

Полная изоляция

Конфликт селекторов

Глобальный сброс

Наследуемые свойства

Медиа-выражения страницы

Page 49: Андрей Ситник

49

Глава 5Глава 5Глава 5

Глава 5

Плюсы Плюсы Плюсы

Плюсы

Page 50: Андрей Ситник

50

Без вопросов

1. Виджеты на сторонние сайты

2. Компоненты в npm

3. Плагины для браузера

4. Большие команды с кучей проектов

Page 51: Андрей Ситник

51

Без вопросов

1. Виджеты на сторонние сайты

2. Компоненты в npm

3. Плагины для браузера

4. Большие команды с кучей проектов

Page 52: Андрей Ситник

52

Проще тестировать

Page 53: Андрей Ситник

53

Проще обновлять технологии

old/

logo/

new/

header/

Page 54: Андрей Ситник

54

Глава 6Глава 6Глава 6

Глава 6

Советы Советы Советы

Советы

Page 55: Андрей Ситник

55

Главное зло

.logo {

&.is-in-header {

width: 100px;

height: 100px;

padding: 10px 0;

}

&.is-in-footer {

}

}

Page 56: Андрей Ситник

56

Совет 1 Пишите размеры в обёртках

<div className={ style.place }>

<Logo>

</div>

.place {

width: 100px;

height: 100px;

padding: 10px 0;

position: relative;

}

.logo {

width: 100%;

height: 100%;

}

Page 57: Андрей Ситник

57

Совет 2 Вкладывайте друг в друга

<Button icon="remove" /> <Button>

<RemoveIcon>

</Button>

Page 58: Андрей Ситник

58

Финал

Page 59: Андрей Ситник

59

Полная изоляция

postcss([

require('autoprefixer'),

// Изоляция селекторов

require('postcss-modules'),

// Локальный сброс

require('postcss-autoreset'),

require('postcss-cssnext'),

// Контейнерные выражения

require('cq-prolyfill/postcss-plugin')

])