Роман Комаров
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>
<div>
<span>
<a>
<button>
vertical-align: middle
не спасёт.
.
Привет, Кнопка и пока.
Общее решение: http://kizu.ru/blog/flex-baseline/
Спойлер: решается через inline-flex, кучу проблем в ФФ и лишний враппер
inline-flex
+ <button>
+ Firefox = 💩Тупо не работает.
И никакие хаки не помогут.
.button {
position: relative;
overflow: visible;
display: inline-block;
padding: 0;
border: none;
margin: 0;
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
box-sizing: border-box;
max-width: 100%;
font: inherit;
white-space: nowrap;
text-decoration: none;
color: inherit;
background: none;
-moz-appearance: none;
}
.button::-moz-focus-inner {
padding: 0;
border: none;
}
.button-content {
display: block;
display: -webkit-inline-box;
display: -webkit-inline-flex;
display: -ms-inline-flexbox;
display: inline-flex;
box-sizing: border-box;
width: 100%;
border-radius: inherit;
}
.button-content:before {
float: left;
content: "\a0";
width: 0;
min-width: 0;
}
.button-text {
display: block;
-webkit-flex-shrink: 1;
-ms-flex-negative: 1;
flex-shrink: 1;
-webkit-flex-basis: 100%;
-ms-flex-preferred-size: 100%;
flex-basis: 100%;
overflow: hidden;
text-overflow: ellipsis;
min-width: 0;
}
.button-text _:-ms-input-placeholder,
:root .button-text {
-ms-flex-preferred-size: auto;
flex-basis: auto;
width: 100%;
}
.button-before,
.button-after {
float: left;
-webkit-align-self: center;
-ms-flex-item-align: center;
align-self: center;
-webkit-flex-shrink: 0;
-ms-flex-negative: 0;
flex-shrink: 0;
}
.button-after {
float: right;
-webkit-box-ordinal-group: 2;
-webkit-order: 1;
-ms-flex-order: 1;
order: 1;
}
<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; /* для старой Оперы */
}
.button-text {
flex-shrink: 1;
flex-basis: 100%; /* не `width` */
overflow: hidden;
min-width: 0; /* для старой Оперы */
}
Привет, IE!
:root .button-text,
_:-ms-input-placeholder {
flex-basis: auto;
width: 100%;
}
* {
flex-shrink: 0;
min-width: 0;
}