我有一个有两个孩子的容器。
一个孩子有动态宽度,最大宽度可以填充容器
另一个孩子有固定宽度并开始隐藏,因为它的起始点位于overflow:hidden
容器的右侧
我想要的是固定宽度的孩子向左移动,以便它完全适合容器的右侧,以便
a)如果两个孩子都装入容器 - 另一个元素应该放在左边和
b)如果两个元素都没有空间 - 固定宽度元素应该尽可能多地将另一个元素推向左边,以便适合容器的右侧。
以下是我的尝试:
.container {
width: 200px;
height: 50px;
border: 1px solid green;
overflow: hidden;
white-space: noWrap;
}
span {
height: 50px;
display: inline-block;
}
.child1 {
background: aqua;
float: right;
width: 50px;
margin-right: -50px;
transition: margin .2s;
}
.container:hover .child1 {
margin-right: 0;
}
.child2 {
background: tomato;
//width: 100%;
}
<div class="container">
<span class="child1">Fixed</span>
<span class="child2">Dynamic Width</span>
</div>
<div class="container">
<span class="child1">Fixed</span>
<span class="child2">Here is a Dynamic Width box</span>
</div>
条件a)成功但条件b)失败
.container {
width: 200px;
height: 50px;
border: 1px solid green;
overflow: hidden;
white-space: noWrap;
}
span {
height: 50px;
display: inline-block;
}
.child2 {
background: aqua;
width: 50px;
margin: 0;
float: right;
margin-right: -50px;
transition: margin .2s;
}
.container:hover .child1 {
margin-left: -50px;
}
.container:hover .child2 {
margin: 0;
}
.child1 {
background: tomato;
transition: margin .2s;
}
<div class="container">
<span class="child1">Dynamic Width</span>
<span class="child2">Fixed</span>
</div>
<div class="container">
<span class="child1">Here is a Dynamic Width box</span>
<span class="child2">Fixed</span>
</div>
条件a)失败和条件b)成功
单独使用CSS可以满足两个条件吗?
PS:我在演示中提供的标记可能会被修改。包括flexbox在内的CSS3也很好。
答案 0 :(得分:31)
这是一个仅限CSS的解决方案。
诀窍是使用这个基本规则:
考虑并排呈现的两个或多个内联元素。
如果增加第一个元素的宽度,则第二个元素将被推向右侧。
问题是你需要向左移动元素。我通过将X方向反转到子元素scaleX(-1)
并再次重新反转容器来解决这个问题。
为了帮助您更好地理解这一点,您可以在下面的jsfiddle链接中注释掉transform: scaleX(-1);
,并观察会发生什么。
这样做的好处是你不需要知道.child2
的宽度。你只需要把它推到左边。
.container {
width: 200px;
height: 50px;
border: 1px solid green;
overflow: hidden;
white-space: nowrap;
text-align: right;
transform: scaleX(-1);
}
span {
height: 50px;
display: inline-block;
transform: scaleX(-1);
}
.child1 {
background: aqua;
width: 50px;
margin-left: -50px;
float: left;
transition: margin-left .2s;
text-align: left;
}
.child2 {
background: tomato;
}
.container:hover .child1 {
margin-left: 0;
}
<div class="container">
<span class="child1">Fixed</span>
<span class="child2">Dynamic Width</span>
</div>
<div class="container">
<span class="child1">Fixed</span>
<span class="child2">Here is a Dynamic Width box</span>
</div>
同样在 jsfiddle
上另一个稍微简单的解决方案是在容器上使用direction: rtl;
。通过从 r ight t o l eft中反转内联元素的方向,我们可以实现相同的效果,而无需使用CSS3转换。登记/>
请参阅 http://jsfiddle.net/epfqjtft/12/
答案 1 :(得分:7)
由于css不能执行条件语句(条形媒体查询),我认为单独使用css不会真正。
<强>更新强>
我已经看到 实际上可以使用CSS3转换(在现代浏览器中有效)。但是,如果某些用户可能想要CSS3转换后无法提供的旧浏览器支持,我还是会留在这里。
除此之外,我使用了定位而不是浮动来“清理”样式(并尝试了jquery):
$('.container').hover(function() {
var parentWidth = $(this).width();
var thisWidth = $(this).find(".child1").width() + 50; /*i.e. width of fixed box*/
if (parentWidth < thisWidth) { /*if it doesn't fit, move it!*/
$(this).find('.child1').addClass("moveLeft");
}
}, function() {
$(this).find(".child1").removeClass("moveLeft");
});
.container {
width: 200px;
height: 50px;
border: 1px solid green;
overflow: hidden;
white-space: noWrap;
position: relative;
}
span {
height: 50px;
display: inline-block;
}
.child2 {
background: aqua;
width: 50px;
margin: 0;
position: absolute;
top: 0;
right: -50px;
transition: all .2s;
}
.child1 {
background: tomato;
transition: all .2s;
position: absolute;
top: 0;
left: 0;
}
.container:hover .child2 {
right: 0;
}
.moveLeft:hover {
left: -50px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="container">
<span class="child1">Dynamic Width</span>
<span class="child2">Fixed</span>
</div>
<div class="container">
<span class="child1">Here is a Dynamic Width box</span>
<span class="child2">Fixed</span>
</div>
至于您的“解决方案”,您必须测试child + 50px
是greater than
父宽度,如果是,请移动child1
。如果没有,则不需要采取任何行动。
答案 2 :(得分:3)
好的,我稍微更改了LinkinTED的代码。试试这个: http://jsfiddle.net/epfqjtft/9/
当然,我不知道你是否可以使用它。应该使用Jquery解决这些类型的问题。
.container {
width: 200px;
height: 50px;
border: 1px solid green;
display: table;
table-layout: fixed;
transition: all 2s;
}
span {
height: 50px;
display: table-cell;
transition: all .2s;
}
.child1 {
background: tomato;
width: 100%;
}
.child2 {
background: aqua;
width: 0px;
overflow: hidden;
transition: all .2s;
}
.container:hover .child2 {
width: 50px;
}
<div class="container">
<div class="wrapper">
<span class="child1">Dynamic Width</span>
</div>
<span class="child2">Fixed</span>
</div>
<div class="container">
<div class="wrapper">
<span class="child1">Here is a Dynamic Width box</span>
</div>
<span class="child2">Fixed</span>
</div>
答案 3 :(得分:-1)
.container {
width: 250px;
height: 40px;
border: 1px solid read;
overflow: hidden;
white-space: nowrap;
text-align: right;
transform: scaleX(-1);
}
span {
height: 50px;
display: inline-block;
transform: scaleX(-1);
}
.child1 {
background: pink;
width: 50px;
margin-left: -50px;
float: left;
transition: margin-left .3s;
text-align: left;
}
.child2 {
background: #####;
}
.container:hover .child1 {
margin-left: 0;
}
&#13;
<div class="container">
<span class="child1">Fixed</span>
<span class="child2">Dynamic Width</span>
</div>
<div class="container">
<span class="child1">Fixed</span>
<span class="child2">Here is Dynamic Width box</span>
</div>
&#13;