csso icon indicating copy to clipboard operation
csso copied to clipboard

Небезопасная структурная минимизация для сочетания "фоновых" свойств в полной и короткой записи

Open bivihoba opened this issue 12 years ago • 7 comments

В чем-то перекликается с #58, но смысл другой немного. Структурная минимизация ломает правильную последовательность свойств при сочетании конкретных правил для фона и укороченной записи. Реальный случай кнопки на цсс3 с полным фолбеком для ИЕ на картинках. "Лишние" свойства удалены:

.b-billet_viewtype_a1-right-arrow {
  background-image: url('../images/bg/billets_original.png');
  background-position: 0 -100px;
  background: linear-gradient(to bottom, transparent 0%, transparent 100%);
}
.b-billet_viewtype_a1-right-arrow .b-billet__in {
  background-image: url('../images/bg/billets_original.png');
  background-position: 100% -125px;
  background: linear-gradient(to bottom, #fbfbfb 0%, #e4e6e8 100%);
}

На выходе:

.b-billet_viewtype_a1-right-arrow {
    background-position: 0 -100px;
    background: linear-gradient(to bottom, transparent 0, transparent 100%);
}

.b-billet_viewtype_a1-right-arrow, .b-billet_viewtype_a1-right-arrow .b-billet__in {
    background-image: url('../images/bg/billets_original.png');
}

.b-billet_viewtype_a1-right-arrow .b-billet__in {
    background-position: 100% -125px;
    background: linear-gradient(to bottom, #fbfbfb 0, #e4e6e8 100%);
}

Т.е. современные браузеры получают лишнее правило (и лишний запрос к серверу):

.b-billet_viewtype_a1-right-arrow {
    background-image: url('../images/bg/billets_original.png');
}

bivihoba avatar Dec 03 '12 08:12 bivihoba

Без лишних свойств я ошибку повторить не могу, т.к. при таком входе выход оказывается другой — ни одно из свойств не меняет место. :)

css avatar Dec 03 '12 09:12 css

Оу, окей, вот реальный код, с вендорными префиксами и прочим:)

.b-billet_viewtype_a1-right-arrow {
  background-image: url('../images/bg/billets_original.png');
  background-position: 0 -229px;
  color: #5a5a5a;
  height: 30px;
  margin-right: 4px;
  -moz-border-radius: 3px;
  background: -moz-linear-gradient(top, transparent 0%, transparent 100%);
  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, transparent), color-stop(100%, transparent));
  background: -webkit-linear-gradient(top, transparent 0%, transparent 100%);
  background: -o-linear-gradient(top, transparent 0%, transparent 100%);
  background: linear-gradient(to bottom, transparent 0%, transparent 100%);
  margin-right: 14px;
}
.b-billet_viewtype_a1-right-arrow .b-billet__in {
  background-image: url('../images/bg/billets_original.png');
  background-position: 100% -733px;
  color: #5a5a5a;
  height: 30px;
  line-height: 30px;
  padding-right: 16px;
  margin-right: -4px;
  -moz-border-radius: 3px;
  border-radius: 3px;
  padding-right: 14px;
  padding-left: 16px;
  margin-right: -14px;
  background: -moz-linear-gradient(top, #fbfbfb 0%, #e4e6e8 100%);
  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fbfbfb), color-stop(100%, #e4e6e8));
  background: -webkit-linear-gradient(top, #fbfbfb 0%, #e4e6e8 100%);
  background: -o-linear-gradient(top, #fbfbfb 0%, #e4e6e8 100%);
  background: linear-gradient(to bottom, #fbfbfb 0%, #e4e6e8 100%);
  -moz-box-shadow: 0 0 0 1px #bebebe inset;
  box-shadow: 0 -1px 0 0 #adadad inset, 0 0 0 1px #bebebe inset, 0 2px 0 rgba(255, 255, 255, 0.2) inset;
}

Результат:

.b-billet_viewtype_a1-right-arrow {
    background-position: 0 -229px;
    background: -moz-linear-gradient(top, transparent 0, transparent 100%);
    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, transparent), color-stop(100%, transparent));
    background: -webkit-linear-gradient(top, transparent 0, transparent 100%);
    background: -o-linear-gradient(top, transparent 0, transparent 100%);
    background: linear-gradient(to bottom, transparent 0, transparent 100%);
    margin-right: 14px
}

.b-billet_viewtype_a1-right-arrow, .b-billet_viewtype_a1-right-arrow .b-billet__in {
    background-image: url('../images/bg/billets_original.png');
    color: #5a5a5a;
    height: 30px;
    -moz-border-radius: 3px
}

.b-billet_viewtype_a1-right-arrow .b-billet__in {
    background-position: 100% -733px;
    line-height: 30px;
    border-radius: 3px;
    padding-right: 14px;
    padding-left: 16px;
    margin-right: -14px;
    background: -moz-linear-gradient(top, #fbfbfb 0, #e4e6e8 100%);
    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fbfbfb), color-stop(100%, #e4e6e8));
    background: -webkit-linear-gradient(top, #fbfbfb 0, #e4e6e8 100%);
    background: -o-linear-gradient(top, #fbfbfb 0, #e4e6e8 100%);
    background: linear-gradient(to bottom, #fbfbfb 0, #e4e6e8 100%);
    -moz-box-shadow: 0 0 0 1px #bebebe inset;
    box-shadow: 0 -1px 0 0 #adadad inset, 0 0 0 1px #bebebe inset, 0 2px 0 rgba(255, 255, 255, .2) inset
}

bivihoba avatar Dec 03 '12 09:12 bivihoba

Ещё один случай из жизни :) На этот раз c display, и, похоже, что это не от свойства зависит. Не уверен, но такое ощущение, что оптимизация не в том порядке идёт — структурная минимизация правил для соседних блоков происходит раньше, чем удаление дублирующихся внутри блока.

Ситуация ещё больше усложняется при наличии правил с вендорными префиксами, которые нельзя схлопывать или менять местами, что нужно учитывать при объединении правил соседних блоков.

.b-top-links {
    font: 0/0 a;
    text-align: justify;
    letter-spacing: normal;
    display: inline-block;
    display: block;
    vertical-align: top;
    padding-left: 179px;
}

.b-top-links:after {
    content: '';
    font: 0/0 a;
    display: -moz-inline-stack;
    display: inline-block;
    visibility: hidden;
    vertical-align: top;
    margin: 0;
    padding: 0;
    width: 100%;
    height: 0;
}

=>

.b-top-links {
    text-align: justify;
    letter-spacing: normal;
    display: block;
    padding-left: 179px
}

.b-top-links, .b-top-links:after {
    font: 0/0 a;
    display: inline-block;
    vertical-align: top
}

.b-top-links:after {
    content: '';
    display: -moz-inline-stack;
    visibility: hidden;
    margin: 0;
    padding: 0;
    width: 100%;
    height: 0
}

bivihoba avatar Dec 05 '12 12:12 bivihoba

Да, вижу проблему. Будем фиксить. Как минимум, потеря порядка вендоров — явно не то, что должно происходить.

css avatar Dec 05 '12 13:12 css

В общем, всё гораздо сложнее, чем казалось поначалу. Бага не будет забыта, но уходит на начало 2013 года, похоже. Надо пару корневых функций заново переписывать. Извините.

css avatar Dec 12 '12 15:12 css

What sup?

qfox avatar Jun 23 '15 20:06 qfox

Initial comment looks the same as #143

lahmatiy avatar Oct 07 '15 21:10 lahmatiy