我知道使用Javascript这很容易但是......有什么办法只用CSS吗?
假设我们在父母(米色)中有两个元素(绿色和红色)。红色元素应始终位于绿色元素的右侧,除非绿色元素(因为内容)太大而不适合父母,在这种情况下红色元素将超过绿色元素(正常行为将是红色元素停留在绿色元素的右侧,因此由于父母的溢出而被隐藏)
换句话说:red.x = min(green.x + green.w,beige.x + beige.w-red.w)
有关详细信息,请参阅具体的HTML:
<div class="beige" style="width:250px"> <!-- parent with a given width (unknown until the page is rendered) & overflow hidden -->
<a class="green"> <!-- link with display:inline -->
content
<em class="red"></em> <!-- actually a button, 15 px width -->
</a>
</div>
编辑: @kyledws的答案很棒,但我会用更多信息(需要的东西)更新问题,例如:
答案 0 :(得分:5)
如果您能够将<a>
中的内容包装在span
中,请尝试此操作。
<强> HTML 强>
<div class="beige">
<a class="green" href="#">
<span class="content">This is some text.</span><em class="red"></em>
</a>
</div>
<强> CSS 强>
.beige {
background-color: #EBDFA0;
height: 32px;
overflow: hidden;
border: 4px solid #EBDFA0;
white-space: nowrap;
width: 400px;
}
.green {
background-color: #4CA73D;
color: #222;
display: inline-block;
height: 100%;
text-decoration: underline;
vertical-align: middle;
}
.content {
display: inline-block;
height: 100%;
margin-left: 4px;
position: relative;
width: 100%;
max-width: 364px;
top: -50%;
}
.red {
border: 2px solid red;
display: inline-block;
height: 28px;
position: absolute;
width: 28px;
}
基本上<a class="green">
,<span class="content">
和<em class="red">
必须是display: inline-block
而<span class="content">
必须是width: 100%
且{{1} } max-width
和<div class="beige">
之间的差异减去任何额外的填充/边距/边界等(因此在此示例中,<em class="red"
)通过在{{1上设置宽度你强制max-width: 364px
在它的容器之外,但是通过设置span
,你可以阻止em
在主包装之外流动。
以下是示例的codepen.io链接。
(注意:上面的大多数CSS只是为了使示例看起来像你的图像。)
<强>更新强>
要显示或隐藏max-width
,请将em
伪类添加到<em class="red">
,将可见性或不透明度添加到:hover
。 (如果要使用转换,请使用不透明度。)
.beige
由于.red
的宽度未知,因此您无法使用CSS在.red {
opacity: 0;
}
.beige:hover .red {
opacity: 1;
}
上设置<div class="beige">
。
(max-width
中的100%是<span class="content">
而不是max-width: calc(100% - 28px)
的宽度。我无法用伪元素,定位,浮点或不同的显示类型(如flex)来破解它。 )
解决这个问题的方法是修复CSS中<a class="green">
的{{1}}(如上所示)或使用Javascript检测<div class="beige">
的宽度,然后设置{{ 1}}。
max-width
我使用可见性和Javascript版本更新了example。
另外,我向<span class="content">
添加了<div class="beige">
,因此max-width
右边没有空格。
答案 1 :(得分:0)
所以我找到了一种可以在CSS中处理这个问题的方法。我用一个例子设置了一个jsbin。我没有花哨的滑块,因此您需要使用检查工具来调整宽度或手动操作。
基本上我将潜水设为桌子。因为您不能删除到不同的行,所以最右边的列被强制折叠但是块是可见的,因为它是位置绝对的。容器的大小基于块,该块已更改为内联块以保持着色并推动其父级变大。请原谅我没有让风格与图形中的风格完全匹配。
HTML
<div class="beige">
<div class="table">
<!-- parent with a given width & overflow hidden -->
<ul>
<li><a class="green"> <!-- link with display:inline -->
content
</a>
</li>
<li><em class="red"></em>
<!-- actually a button, 15 px width -->
</li>
</ul>
</div>
</div>
CSS
.beige {
background-color:grey;
overflow:hidden;
white-space:no-wrap;
}
.table{
display:table;
}
ul {
display:table-row;
list-style-type:none;
}
li {
display:table-cell;
position:relative;
}
li:last-child{
width:30px;
}
.green {
display:inline-block;
background-color:green;
}
.red {
border:3px solid red;
display:inline-block;
width:20px;
position:absolute;
right:0px
}
li:hover + li .red{
height:20px;
}
*正在更新以包含悬停