Как работает вычисление CSS для фоновых процентов?

В настоящее время я играю с градиентами и положением CSS, мне вроде как удается делать то, что я хочу, но с удачными догадками, но я хотел бы понять, как все это на самом деле работает.

Например, вот французский флаг (merci):

.serge_testDraw {
    width: 10rem;
    height: 10rem;
    border: 0.2rem solid black;
    background-image:
        linear-gradient(to right, blue 0%, blue 100%)
        , linear-gradient(to right, white 0%, white 100%)
        , linear-gradient(to right, red 0%, red 100%)
    ;
    background-size: calc(100% / 3) 100%;
    background-repeat: no-repeat;
    background-position: 0%, 50%, 100%;
}

Почему фоновая позиция составляет 0%, 50, 100% вместо 0, 33,33% (треть), 66,66% (две трети)?

Кроме того, я понятия не имею, как позиционировать фоны, размер которых составляет 100%.


person Serge Profafilecebook    schedule 03.09.2014    source источник
comment
что интересно, средний background-position может быть любым значением, это не имеет значения, но он должен присутствовать jsfiddle.net/#&togetherjs=74v86sn02J   -  person steve_gallagher    schedule 03.09.2014
comment
Похоже, что, поскольку у вас определены три фоновых изображения, свойство background-position устанавливает начальную позицию для каждого изображения, которая применяется к левому краю каждого изображения, в вашем случае красный, синий и белый раздел длиной 33%   -  person steve_gallagher    schedule 03.09.2014


Ответы (3)


Процентное значение для background-position не позиционирует исходную точку фонового изображения относительно области позиционирования фона. Он позиционирует все изображение. Это означает, что размеры самого изображения также учитываются (после изменения его размера с помощью background-size).

Позиция фона 100% 100% аналогична right bottom, располагая изображение таким образом, что правый нижний угол изображения касается нижнего правого угла области фона. Точно так же 50% 50% аналогичен center center, помещая среднюю точку изображения в среднюю точку фоновой области.

Представьте, что прямоугольная плитка перемещается внутри прямоугольной рамки; перемещение его полностью вправо (т. е. на 100 %) означает, что его правый край касается правой стороны кадра (поскольку вы не можете провести его сквозь кадр), а перемещение его в нижний означает, что его нижний край касается нижней части кадра.

Вообще говоря, для любого background-position: x y, где два значения представляют собой проценты, точка x изображения выравнивается с точкой x области фона, а точка y изображения выравнивается с точкой y области фона.

Описание CSS2.1 читать больно поэтому вместо этого я процитирую Фон и границы CSS3, где есть даже графический пример:

Например, при паре значений «0% 0%» верхний левый угол изображения выравнивается с верхним левым углом, как правило, края заполнения блока. Пара значений «100% 100%» помещает правый нижний угол изображения в правый нижний угол области. С парой значений «75% 50%» точка 75% по ширине и 50% вниз по изображению должна быть размещена в точке 75% по ширине и 50% по площади.

Но если вы похожи на меня и плохо представляете это в реальном времени, тогда просто подумайте о скользящей головоломке.

Обратите внимание, что ничего из этого не относится к абсолютным значениям; абсолютные значения позиционируют исходную точку изображения. Однако опорную точку можно изменить, если вы привяжете абсолютное значение к правой и/или нижней сторонам, например, right 10px bottom 10px расположит фоновое изображение на расстоянии 10 пикселей от правого нижнего угла области фона.

Если вы хотите расположить фоновое изображение, размер которого составляет 100% области фона, вы не сможете использовать процент, так как вы не можете переместить плитку, которая идеально подходит к ее рамке (что, кстати, сделало бы либо для самая скучная головоломка или идеальный розыгрыш). Это применимо независимо от того, соответствуют ли внутренние размеры фонового изображения размерам элемента или вы явно установили background-size: 100%. Таким образом, чтобы расположить изображение, вам нужно будет использовать вместо этого абсолютное значение (полностью отказываясь от аналогии со скользящей головоломкой).

person BoltClock    schedule 03.09.2014

Как сказал Вудроу, из-за вашего правила размера фона, которое будет применяться для каждого фона, каждый фон будет занимать треть вашего флага, поэтому 0% будет отправной точкой для первого фона.

Второй снова возьмет третий, но чтобы было проще понять, подумайте, что 50% - это центр, а не 50%, поэтому он находится посередине и занимает треть контейнера. Вы можете использовать центр вместо 50%, если хотите.

Вот документ Mozilla о background-position

person AlexDom    schedule 03.09.2014

Свойство background-position задает положение центра фона. Вы указали, что все фоны имеют ширину calc(100%/3) и высоту 100%, затем вы указали положение x для центра каждого из трех фонов (положение y по умолчанию равно 50%).

person Woodrow Barlow    schedule 03.09.2014
comment
как 0% может представлять центр, разве это не край? - person steve_gallagher; 03.09.2014
comment
допустим, весь флаг имеет ширину 600px. у вас есть три фона: синий, белый и красный. затем вы устанавливаете размер каждого фона равным одной трети общей ширины (200px). теперь вы устанавливаете центр синего фона на 0% слева от всего флага. так что синяя полоса шириной 200 пикселей фактически свисает на полпути от края флага... видны только 100 пикселей справа. - person Woodrow Barlow; 03.09.2014
comment
так что синяя полоса шириной 200 пикселей фактически свисает на полпути от края флага... видны только 100 пикселей справа. Нет, если бы это было правдой, то все существующие фоновые изображения, выровненные по левому краю, были бы обрезаны. - person BoltClock; 03.09.2014
comment
спасибо, я ошибся. отличный хорошо подготовленный ответ, кстати. - person Woodrow Barlow; 03.09.2014