我在网站的一部分中必须并排包含三个元素。每个元素都有一个最小宽度。如果屏幕的宽度不足以包含所有三个元素,那么不合适的元素将换行。
html:
<main id='main'>
<div id='firstRow' class='row'>
<div id='col1C' class='col'>col1C title
<div id='col1Ccon'>col1Ccon content</div>
</div>
<div id='col2C' class='col'>col2C title
<div id='col2Ccon'>col2Ccon content</div>
</div>
<div id='col3C' class='col'>col3C title
<div id='col3Ccon'>col3Ccon content</div>
</div>
</div>
</main>
css:
:root {
--w1Col: 478px;
--w2Col: 370px;
--w3Col: 350px;
--wSum3: calc(var(--w1Col) + var(--w2Col) + var(--w3Col));
}
html {
/*height: 100%;*/
}
body {
margin: 0;
font-size: 9pt;
font-family: 'Roboto', sans-serif;
font-weight: 300;
background-color: whitesmoke;
height: 100%;
display: flex;
flex-direction: column;
}
/***************************************************************
* Layout first row
*/
#main {
background-color: white;
/*border: 4px solid red;*/
color: black;
height: 100%;
flex-grow: 1; /* ability for a flex item to grow if necessary */
flex-shrink: 0; /* ability for a flex item to shrink if necessary */
flex-basis: auto; /* defines the default size of an element before the remaining space is distributed */
}
#firstRow {
background-color: white;
/*border: 1px solid black;*/
margin: 10px;
padding: 10px;
display: flex;
flex-direction: row; /* colums layout */
flex-wrap: wrap; /* wrap in multiple lines if it's necessary */
/*min-width: var(--wSum3);*/
/*justify-content: flex-end; defines the alignment along the main axis */
}
#firstRow .col {
/*border: 1px solid black;*/
flex: 1;
padding: 5px;
text-align: center;
}
#col1C {
background-color: green;
width: var(--w1Col);
min-width: var(--w1Col);
order: 1; /* column order */
flex-basis: 40%;/*var(--w1Col); column width */
justify-content: flex-end;
}
#col2C {
background-color: blue;
width: var(--w2Col);
min-width: var(--w2Col);
order: 2; /* column order */
flex-basis: 35%; /* var(--w2Col); column width */
justify-content: flex-end;
}
#col3C {
background-color: red;
width: var(--w3Col);
min-width: var(--w3Col);
order: 3; /* column order */
flex-basis: 25%; /*var(--w3Col); column width */
justify-content: flex-end;
}
#col1Ccon, #col2Ccon, #col3Ccon {
/*border: 1px solid black;*/
margin: 0 auto; /* center content */
}
#col1Ccon {
width: var(--w1Col);
background-color: lightgreen;
height: 200px;
}
#col2Ccon {
width: var(--w2Col);
background-color: lightblue;
height: 150px;
}
#col3Ccon {
width: var(--w3Col);
background-color: salmon;
height: 200px;
}
代码有效,但是我想解决一些技巧。
3列都具有相同的宽度,我希望能够选择此宽度。这是因为第一个元素的最小宽度大于其他两个元素的最小宽度,因此边缘更小且外观上难看。看到the same example,我只更改了颜色
col*Ccon
容器两侧的剩余空间现在都增加了。相反,我只想在col1Ccon
的左侧和col3Ccon
的右侧生长。因此,我希望网站(col1Ccon + col2Ccon + col3Ccon
)的内容始终保留在页面的中央,而不断变化的“边界”则是什么。
我被困住了,任何建议都将不胜感激。谢谢:)
答案 0 :(得分:0)
所有列都具有相同宽度的原因是,您将flex: 1
赋予了col类。在这种情况下,这意味着每一列(所有列)都有可用的屏幕的三分之一。您可以做的是从col类中删除flex
属性,而在列的ID选择器范围内使用它。因此,在下面的代码中,我将flex
属性放在了id选择器中,差别很小,第二列的flex-grow
属性的取值为0(flex
中的第一个值属性)。如您所说,第一列稍大一些,因此占用了更多空间。
然后,使内容居中:第一部分是给第二列的flex-grow
设置为0,因此它位于中间。其他两列确实会增长,并且内容列的一侧会自动出现margin
,它会在一侧增长,并且内容列会左右对齐,以使居中内容。这仅适用于较大的屏幕,对于较小的屏幕,您可以使用媒体查询来正确对齐内容。
所以最后,您的代码可能看起来像这样。我不知道这是否正是您的初衷,但是您可以尝试一下,看看它是否有效。
:root {
--w1Col: 478px;
--w2Col: 370px;
--w3Col: 350px;
--wSum3: calc(var(--w1Col) + var(--w2Col) + var(--w3Col));
}
body {
margin: 0;
font-size: 9pt;
font-family: 'Roboto', sans-serif;
font-weight: 300;
background-color: whitesmoke;
height: 100%;
display: flex;
flex-direction: column;
}
/***************************************************************
* Layout first row
*/
#main {
background-color: white;
color: black;
height: 100%;
flex: 1 0 auto;
width: 100%;
}
#firstRow {
background-color: white;
margin: 10px;
padding: 10px;
display: flex;
flex-direction: row; /* colums layout */
flex-wrap: wrap; /* wrap in multiple lines if it's necessary */
}
#firstRow .col {
padding: 5px;
text-align: center;
}
#col1C {
background-color: green;
order: 1; /* column order */
flex: 1 1 var(--w1Col);
}
#col2C {
background-color: blue;
order: 2; /* column order */
flex: 0 1 var(--w2Col);
}
#col3C {
background-color: red;
order: 3; /* column order */
flex: 1 1 var(--w3Col);
}
#col1Ccon {
max-width: var(--w1Col);
background-color: lightgreen;
height: 200px;
margin: 0 0 0 auto;
}
#col2Ccon {
max-width: var(--w2Col);
background-color: lightblue;
height: 150px;
margin: 0 auto;
}
#col3Ccon {
max-width: var(--w3Col);
background-color: salmon;
height: 200px;
margin: 0 auto 0 0;
}
@media only screen and (max-width: 1268px) {
#col2C {
flex-grow: 1;
}
#col2Ccon {
margin: 0 auto 0 0;
}
#col3Ccon {
margin: 0 auto;
}
}
@media only screen and (max-width: 908px) {
#col1Ccon {
margin: 0 auto;
}
#col2Ccon {
margin: 0 0 0 auto;
}
#col3Ccon {
margin: 0 auto 0 0;
}
}
@media only screen and (max-width: 780px) {
#col2Ccon, #col3Ccon {
margin: 0 auto;
}
}
关于第二个问题
答案 1 :(得分:0)
替换样式表即可解决问题
body {
margin: 0;
font-size: 9pt;
font-family: 'Roboto', sans-serif;
font-weight: 300;
background-color: whitesmoke;
}
#firstRow {
background-color: white;
margin: 10px;
padding: 10px;
display: flex;
flex-wrap: wrap;
}
#firstRow .col {
flex: 1;
padding: 5px;
text-align: center;
}
#col1C {
background-color: green;
}
#col2C {
background-color: blue;
}
#col3C {
background-color: red;
}
#col1Ccon, #col2Ccon, #col3Ccon {
margin: 0 auto;
}
#col1Ccon {
background-color: lightgreen;
height: 200px;
}
#col2Ccon {
background-color: lightblue;
height: 200px;
}
#col3Ccon {
background-color: salmon;
height: 200px;
}