我正在努力创建一个类似于Chosen的组件,但我在使用flex布局时遇到了问题。问题在于伪文本框中的每个“chip”需要放在一个不包含实际文本输入的容器中,但我需要这些“chip”被视为与
input
相同基础上的flex元素。我的HTML结构如下:<div class="box">
<div class="chipContainer">
<div class="chip">Chip1</div>
<div class="chip">Chip2</div>
<div class="chip">Chip3</div>
<div class="chip">Chip4</div>
</div>
<input class="textbox" type="text">
</div>
这个Plunker示例更加完整,并且其样式与我当前所使用的相当接近。
.box {
background: #fff;
border: 1px solid #ccc;
width: 500px;
overflow: auto;
padding: 2px;
display: flex;
flex-wrap: wrap;
}
.chip {
display: inline-block;
border: 1px solid #ccc;
background: #eee;
padding: 2px;
margin-right: 1px;
flex: auto;
}
.textbox {
border: none;
background: #fdd;
font-size: 18px;
flex: auto;
}
.textbox:focus {
outline: none;
}
.chipContainer {
display: inline;
}
<div class="box">
<div class="chipContainer">
<div class="chip">Chip1</div>
<div class="chip">Chip2</div>
<div class="chip">Chip3</div>
<div class="chip">Chip4</div>
</div>
<input class="textbox" type="text">
</div>
<br>
<div class="box">
<div class="chipContainer">
<div class="chip">Chip1</div>
<div class="chip">Chip2</div>
<div class="chip">Chip3</div>
<div class="chip">Chip4</div>
<div class="chip">Chip5</div>
<div class="chip">Chip6</div>
<div class="chip">Chip7</div>
<div class="chip">Chip8</div>
<div class="chip">Chip9</div>
<div class="chip">Chip10</div>
<div class="chip">Chip11</div>
</div>
<input class="textbox" type="text">
</div>
如您所见,当足够多的芯片已添加到.box
容器中时,.chipContainer
将开始包裹它们,但.chipContainer
仍然是块级元素,并将input
推到一个全新的行。
这个Plunker示例演示了我的目标。一旦删除.chipContainer
,布局就可以相当容易地实现,但在组件结构中,.chipContainer
是一个非常重要的元素,如果可能的话,我更愿意不删除它来解决这个问题。
.box {
background: #fff;
border: 1px solid #ccc;
width: 500px;
overflow: auto;
padding: 2px;
display: flex;
flex-wrap: wrap;
}
.chip {
display: inline-block;
border: 1px solid #ccc;
background: #eee;
padding: 2px;
margin-right: 1px;
flex: auto;
min-width: 50px;
max-width: 60px;
}
.textbox {
border: none;
background: #fdd;
font-size: 18px;
flex: auto;
min-width: 250px;
}
.textbox:focus {
outline: none;
}
.chipContainer {
display: inline;
}
<div class="box">
<div class="chip">Chip1</div>
<div class="chip">Chip2</div>
<div class="chip">Chip3</div>
<div class="chip">Chip4</div>
<input class="textbox" type="text">
</div>
<br>
<div class="box">
<div class="chip">Chip1</div>
<div class="chip">Chip2</div>
<div class="chip">Chip3</div>
<div class="chip">Chip4</div>
<div class="chip">Chip5</div>
<div class="chip">Chip6</div>
<div class="chip">Chip7</div>
<div class="chip">Chip8</div>
<div class="chip">Chip9</div>
<input class="textbox" type="text">
</div>