44
votes

I'm trying to create a responsive layout in which two boxes sit next to each other if the screen size allows it, and have them below each other if it doesn't. If the boxes are below each other, I'd like them to be centred to their parent. I've set up a jsfiddle to demonstrate the problem:

http://jsfiddle.net/leongersen/KsU23/

width: 50%;
min-width: 350px;
max-width: 100%;

Try resizing the 'result' pane to below 350px. The elements will overlap their parent.

My question:

Why isn't the specified max-width honoured, even though it comes after the min-width?

2
I don't see the problem. They get to 50%, if I make it wider, they keep at 50%, if I make it smaller than 700px, then they keep a min-width of 350px and get wrapped (the second one goes to a new row). What are you expecting to happen?Francisco Zarabozo
The red boxes are overlapping the parent element if that becomes smaller than 350px.Lg102
@FranciscoZarabozo - Lg102 seems to expect the max width of 100% to take over when the parent's size is less than the sum of the min width of the child elements. a sort of advisory min width where possibleCodeMonkey
Do you want this to happen? jsfiddle.net/KsU23/3Francisco Zarabozo
You did not specifically seek a solution for your desired output in this question, but I believe what you want is max-width: 350px; min-width: 50% without any width set. See this fiddle.ScottS

2 Answers

70
votes

Because of the CSS standards:

The following algorithm describes how the two properties influence the used value of the 'width' property:

  1. The tentative used width is calculated (without 'min-width' and 'max-width') following the rules under "Calculating widths and margins" above.
  2. If the tentative used width is greater than 'max-width', the rules above are applied again, but this time using the computed value of 'max-width' as the computed value for 'width'.
  3. If the resulting width is smaller than 'min-width', the rules above are applied again, but this time using the value of 'min-width' as the computed value for 'width'.

As such min-width always 'wins'. Within a specific CSS rule there's no precedence anyway, all values are applied atomically. Precedence only occurs when different rules all apply to the same element, and even then it is based on specificity first before file order is considered.

4
votes

I know, I'm late ... But one exact solution could be this:

p {
    display: inline-block;
    font-size: 15px;
    text-align: left;
    width: 50%;
    border: 1px solid blue;
    min-width: 350px;
}
@media (max-width: 700px) {
  p {
    width:100%;
    display:block;
  }
}