Кнопка

Роман Комаров, Яндекс

Кнопка

Роман Комаров

Web Standards Days, Санкт-Петербург, 20 июня 2015 года

Кнопки в прошлом

Спрайты

Спрайт: скругления и тень

Спрайт

Надёжные извращения

<div class="button">
		Кнопка!
		<div class="top"><i class="i1"></i><i class="i2"></i><i class="i3"></i><i class="i4"></i><i class="i5"></i><i class="i6"></i><i class="i7"></i><i class="i8"></i></div>
		<div class="top"><b class="b1"></b><b class="b3"></b><b class="b4"></b><b class="b5"></b><b class="b6"></b></div>
		<div class="bottom"><i class="i8"></i><i class="i7"></i><i class="i6"></i><i class="i5"></i><i class="i4"></i><i class="i3"></i><i class="i1"></i><i class="i2"></i></div>
		<div class="bottom"><b class="b6"></b><b class="b5"></b><b class="b4"></b><b class="b3"></b><b class="b1"></b></div>
</div>

Надёжные извращения

Надёжные извращения

Пиксель-пёрфект

Пиксель-пёрфект

Требования исходили от дизайна:
соответствие макету и пиксель-пёрфект

Кнопки сейчас

…

Требования исходят от потребностей
интерфейса: масштабируемость и гибкость

Любой элемент — кнопка

Любое содержимое

В любом контексте

Проблемы

Конфликт базовой линии шрифта и overflow: hidden

vertical-align: middle не спасёт.

Ещё ближе.

Привет, Кнопка и пока.

Конфликт базовой линии шрифта и overflow: hidden

Общее решение: http://kizu.ru/blog/flex-baseline/

Спойлер: решается через inline-flex, кучу проблем в ФФ и лишний враппер

Однако

inline-flex + <button> + Firefox = 💩

Тупо не работает.

И никакие хаки не помогут.

Решение

Куча кода

Дополнительные обёртки

<button type="button" class="button">    <span class="button-content">        <span class="button-before">🙀 </span>        <span class="button-after"> 🙀</span>        <span class="button-text">Текст кнопки<span>    </span></button>

Дополнительные обёртки

Проблемы флексбоксов

Кроссбраузерность

Не ок.

Фолбек на флоатах

.button-content
		display: inline-flex

.button-text
		display: block
		overflow: hidden
		flex-shrink: 1
.button-before, .button-after
		float: left
		flex-shrink: 0

.button-after
		float: right
		order: 1

«Якорь» для базовой линии

.button-content:before {    float: left; /* для фолбека */    content: "\a0";    width: 0;    min-width: 0; /* для старой Оперы */}

Ширина внутреннему элементу на все 100%

.button-text {    flex-shrink: 1;    flex-basis: 100%; /* не `width` */    overflow: hidden;    min-width: 0; /* для старой Оперы */}

Ширина внутреннему элементу на все 100%

Привет, IE!

:root .button-text,_:-ms-input-placeholder {    flex-basis: auto;    width: 100%;}

На свой страх и риск

* {    flex-shrink: 0;    min-width: 0;}

Домашнее задание:
файловый инпут и селект

Современные технологии — не панацея

Дополнительные обёртки спасут мир

Спасибо!