Хром 40 нарушил выравнивание CSS-кода обоснования?

Я заметил сегодня обновление Chrome 40, что justify-content , похоже, не получает должным образом переопределения с помощью последующих деклараций стиля.

См. эту скрипту для примера:

  <div class="flex-parent">
    <div class="flex-child"></div>
    <div class="flex-child"></div>
  </div>

и

.flex-parent {
  display: flex;
  position: absolute;
  top: 0; right: 0; left: 0;

  /*
     IT SHOULD BE POSSIBLE TO SAFELY REMOVE
     THESE TWO LINES BECAUSE THEY ARE OVERRIDEN:
  */
  background: yellow;
  justify-content: center;
}

.flex-parent {
  /* Overriding background: it works! */
  background: green;

  /* Overriding justify-content: NOPE ;-( */
  justify-content: space-between;
}


.flex-child {
  width: 50px;
  height: 50px;
  margin: 10px;
  background: skyblue;
}

Firefox (переопределение работает):

enter image description here

Chrome 40 (переопределение кажется сломанным):

enter image description here

Правильно ли я в своих предположениях или я неправильно понимаю CSS? Обратите внимание, что это не связано с префиксами: Chrome поддерживает unprefixed justify-content, и если это не сработает, не будет никакой разницы при комментировании правил в первом селекторе.

Обновление: зарегистрировано как https://code.google.com/p/chromium/issues/detail?id=451387

Ответы

Ответ 1

Вы полностью правы в своем понимании каскада. Если вы посмотрите в веб-инспекторе, вы увидите, что объявление justify-content: center вычеркнуто, но только если вы снимете его (аналогично комментированию), вы можете заставить Chrome игнорировать его.

Возможно, они случайно сломали что-то в переменах между Chrome 39 и 40, так как у них есть действительно раздражающая привычка, но я понятия не имею, что.


Из issue, с которым связан rwacarter, видимо, они сделали что-то напуганное с их каскадным кодом разрешения, чтобы внести определенные изменения в Flexbox spec, что, по-видимому, является причиной этого. Опять же, я не утверждаю, что понимаю их причины для этого, но у них, похоже, есть привычка переписывать вещи здесь и там, что приводит к регрессиям повсюду. Хорошо, что Chrome находится на вечнозеленом быстром выпуске, а?

Ответ 2

Определенно выглядит ошибкой и очень серьезным/раздражающим!

Я написал хак, чтобы помочь нам пройти через это. Вы только хотите запустить это для уязвимых версий chrome и, возможно, захотите дополнительно адаптировать и протестировать его для своего приложения:

$('body *').each(function(i, el){
    var justifyContents = $(el).css('justify-content').split(' ');
    var flexFlows = $(el).css('flex-flow').split(' ');
    if (flexFlows[0] == 'row' && justifyContents.length > 1) {
        if (justifyContents[0] == 'space-between' || justifyContents[0] == 'flex-start') {
            $(el).css('justify-content', justifyContents[0]+' left');
        } else if (justifyContents[0] == 'flex-end') {
            $(el).css('justify-content', justifyContents[0]+' right');
        }
    }
});

Ответ 3

Это реализация углов для script, отправленная @Mike T

angular.module('myApp').directive('flexChromeFix', function() {
    return {
        restrict: 'A',
        link: function(scope, element, attrs, fn) {

            var justifyContents = element.css('justify-content').split(' ');
            var flexFlows = element.css('flex-flow').split(' ');
            if (flexFlows[0] == 'row' && justifyContents.length > 1) {
            if (justifyContents[0] == 'space-between' || justifyContents[0] == 'flex-start') {
                element.css('justify-content', justifyContents[0] + ' left');
            } else if (justifyContents[0] == 'flex-end') {
                element.css('justify-content', justifyContents[0] + ' right');
            }
        }

        }
    };
});