Ваш CSS нас
не устраивает,
мы придумаем
свой
Прудников Роман
2009
Красиво
Решения верстальщиков
● вставить картинку
● вставить картинку
● вставить картинку
● filter
● .htc
Решения opensource'щиков
Решения W3C'щиков
Быстро
Решения верстальщиков
Решения opensource'щиков
Решения W3C'щиков
Удобно
Удобно
ul a { color: #999; }
div { background: #999; }
button { border-color: #999; }
ul { background: #999; }
ul li { color: #888; }
ul li a { color: #777; }
Удобно
Удобно
div {
-webkit-font-feature-settings: “c2sc”;
font-feature-settings: “c2sc”;
font-variant-numeric: lining-nums;
}
--brandGr: #999;
ul a { color: var(--brandGr);}
div { background: var(--brandGr); }
button { border-color: var(--brandGr); }
Решения opensource'щиков
Решения opensource'щиков
ul {
background: #999;
li {
color: #888;
}
}
div {
font-variant-numeric: lining-nums;
}
Решения opensource'щиков
Решения opensource'щиков
@if $you == ‘#555’ {
$I: ‘#666’;
}
Решения opensource'щиков
Решения opensource'щиков
Решения W3C'щиков
Безболезненно расширяемо
Безболезненно расширяемо
main.css
.nav {
color: #999;
}
question.css
.nav {
color: #333;
}
Решения opensource'щиков
Решения W3C'щиков
Предсказуемо безопасно
Решения верстальщиков
ul {
color: grey;
color: rgba(0, 0, 0, .5);
}
Решения верстальщиков
div {
-webkit-font-feature-settings: “c2sc”;
font-feature-settings: “c2sc”;
font-variant-numeric: lining-nums;
}
Решения верстальщиков
if ('opacity' in document.body.style) {
// some code
}
Решения opensource'щиков
Решения W3C'щиков
@media (max-width: 768px) {
ul {
color: grey;
}
}
Решения W3C'щиков
@supports (--foo: green) {
body {
color: green;
}
}
Ну и что?
Как решаем проблемы
● подменяем на похожее
● засахариваем
● отдаём рабочее (fallback)
● проверяем и пишем иначе
● описываем досконально
И то
Как было бы в JS
Предложить
фичу
Написать
полифил/
транспилить
Юзать
фичу
Как отрисовывается страница
Как отрисовывается страница
Как отрисовывается страница
СSS Typed OM
$('.el').style.transform =
`translate(${this.width}px,${this.height + 20}px)`;
СSS Typed OM
$('.el').styleMap
.set('opacity', new CSSNumberValue(0.5));
$('.el').styleMap
.set('height', new CSSSimpleLength(50, 'px'));
СSS Typed OM
$('.el').styleMap
.get('opacity').value; // 1
$('.el').styleMap
.get('height').type; // ‘px’
СSS Typed OM
$('.el').styleMap
.set('height', new CSSCalcLength(‘50vh - 20px’));
СSS Typed OM
$('.el').styleMap
.set('height', new CSSCalcLength({
vh: 50,
px: -20
}));
Потрогать?
https://github.com/css-typed-om/typed-om
Потрогать?
Статус?
CSS Typed OM Level 1
Editor’s Draft, 3 June 2017
Properties and Values API
.aside {
transition: --width 1s ease;
--width: 50px;
width: var(--width);
}
.aside.open {
--width: 250px;
}
registerProperty({
name: '--width',
syntax: '<length>',
inherits: false,
initialValue: '50px'
})
Properties and Values API
Properties and Values API
.aside {
transition: --width 1s ease;
--width: 50px;
width: var(--width);
}
.aside.open {
--width: 250px;
}
Потрогать?
Статус?
CSS Properties and Values API Level 1
Editor’s Draft, 3 June 2017
Composited Scrolling & Animation
DEMO
Composited Scrolling & Animation
window.compositorWorklet.import('worklet.js')
Composited Scrolling & Animation
class Header {
onmessage(e) {
this.initialized = true;
this.scroller = e.data[0];
this.avatar = e.data[1];
this.bar = e.data[2];
};
tick() {/**/}
}
registerCompositorAnimator('head', Header);
Composited Scrolling & Animation
window.compositorWorklet.import('worklet.js')
.then(() => {
var animator = new CompositorAnimator('head');
animator.postMessage([
new CompositorProxy($('window'), ['scrollTop']),
new CompositorProxy($('.avatar'), ['transform']),
new CompositorProxy($('.bar'), ['transform', 'opacity']),
])
})
Composited Scrolling & Animation
Потрогать?
Статус?
Ну вы поняли
registerPaint('circle', class {
static get inputProperties() { return ['--circle-color']; }
paint(ctx, geom, properties) {
const color = properties.get('--circle-color');
ctx.fillStyle = color;
const x = geom.width / 2;
const y = geom.height / 2;
const radius = Math.min(x, y);
ctx.beginPath();
ctx.arc(x, y, radius, 0, 2 * Math.PI, false);
ctx.fill();
}
});
Paint API
.bubble {
--circle-color: blue;
background-image: paint('circle');
}
Paint API
Потрогать?
Ну вы поняли
Статус?
Ну вы поняли
Layout API
Layout API
Layout API
registerLayout('masonry', class {
static get inputProperties() {
return ['width', 'height']
}
static get childrenInputProperties() {
return ['x', 'y', 'position']
}
layout(children, constraintSpace, styleMap, breakToken){
// Layout logic goes here.
}
}
Layout API
body {
display: layout('masonry');
}
Статус?
Ну вы поняли
Потрогать?
Не в этот раз
Самари
We want moar!
● Explainers
● Animator Worklet
● TypedOM Polyfill
● Demystifying CSS
● Houdini Mailing List
● Demos
Прудников Роман
Разработчик интерфейсов
2ГИС
stillerr@ya.ru
vk.com/rayproud
facebook.com/stillerr

Ваш CSS нас не устраивает, мы придумаем свой / Роман Прудников (2ГИС)