当滚动条可见时,我的CSS应该使div调整其宽度。
这是场景,我有一个div和子元素
<div id="ListHolder">
<ul id="LeftList">
<li></li>
<li></li>
<li></li>
</ul>
<ul id="RightList">
<li></li>
<li></li>
<li></li>
</ul>
</div>
我想在滚动条溢出时自动调整div宽度。意味着当没有滚动条时它应该像左侧的图像一样,当滚动条变得可见时,它应该自动调整滚动条的宽度。我不想使用javascript但使用纯CSS和HTML。我相信只有CSS和HTML才有可能。
考虑到上面的UL列表,我的CSS就像
#ListHolder
{
display:inline-block;
}
#ListHolder > ul
{
width:250px; //<---Necessary to keep fixed width not percentage
display:inline-block;
}
#ListHolder > ul > li
{
display:inline-block;
}
#LeftList
{
float:left;
}
#RightList
{
float:right;
}
答案 0 :(得分:8)
元素的内容宽度包括滚动条的宽度,据我所知,你无法对抗这种行为。
假设您正在尝试创建一个包含两个250px宽列的收缩包装div。浏览器将其宽度计算为500px,然后计算高度,如果需要滚动条,则它适合那些500px内的滚动条,将可用宽度减少到483px(左右)。
一个棘手的解决方案如下:
width
属性或使该框收缩包装其内容max-height
设置为所需值,将overflow-y
属性设置为auto
以触发自动滚动条此时盒子将如所希望的那样宽,如果可见,滚动条将覆盖右侧衬垫;不干扰宽度。
要显示镶边(边框和填充),您需要创建其他div。
HTML标记:
<div id="ListBorder">
<div id="ListOverflow">
<div id="ListHolder">
<ul id="LeftList">
<li></li><li></li><li></li>
</ul>
<ul id="RightList">
<li></li><li></li><li></li>
</ul>
</div>
</div>
</div>
CSS (仅限重要位)
#ListHolder ul {
float: left;
width: 250px;
}
#ListHolder {
width: 500px;
overflow: hidden;
}
#ListOverflow {
width: 500px;
overflow: auto;
max-height: 350px;
padding-right: 20px;
}
#ListBorder {
width: 500px;
border: 1px solid;
padding: 20px;
}
注意:
#ListHolder
用于clear-fix #ListBorder
可用于添加边框和填充以匹配所需的输出答案 1 :(得分:4)
正如其他人所提到的,没有办法只使用CSS来根据滚动条条件调整div的宽度。
您可以找到一种解决方法,例如在固定宽度demo here中包含滚动条的宽度。这很简单,有效,scollbar出现在您的内容右侧,但在滚动条出现时它不会改变容器的宽度。
CSS 无法根据滚动条的存在情况为容器设置条件宽度,如:
因此,为了实现这种确切的行为,您无法使用CSS。
我编写了这个简单的JS(不需要库,因此它是轻量级的)代码,它可以为您提供所需的行为:
var div= document.getElementById('ListHolder');
var hasVerticalScrollbar= div.scrollHeight>div.clientHeight;
if (hasVerticalScrollbar > 0) {
div.style.width = '530px' ;
}
现在,这仅适用于页面加载。如果在调整窗口大小时也需要此行为,则可以添加:
window.addEventListener( 'resize', function( event ) {
var hasVerticalScrollbar= div.scrollHeight>div.clientHeight;
if (hasVerticalScrollbar > 0) {
div.style.width = '530px' ;
}
else{
div.style.width = '500px' ;
}
}, false );
<强> DEMO HERE 强>
请注意独角兽爱好者,我知道四月已接近完成,但演示中有一个晚期的复活节彩蛋
答案 2 :(得分:3)
当纯粹的CSS溢出时,你将无法增加容器的div。
但是,如果你想保持你的实际布局(这里的flexbox模型更合适,正如@AlecMoore所建议的那样),这里只有一个解决方法仅适用于webkit :使用{{1} } overlay
的值。它会显示在您的内容之上,因此它不会向下滑动。
overflow
或者,您可以调整div,使其略宽,以便滚动条适合需要时使用(demonstration)。
同样,这不是最佳解决方案;如果你的目标是做出反应灵敏的事情,你应该使用相对尺寸单位和/或flex-box model。
请注意独角兽爱好者:我喜欢小猫,但我更喜欢独角兽。我正在使用小猫,因为我想念一个带有可爱独角兽的图像占位符网站...请告诉你是否知道它!
答案 3 :(得分:2)
除了根据垂直滚动条的可见性调整宽度,您可以始终保留右侧滚动条所需的宽度(如果可见)。
padding-right: 2em;
答案 4 :(得分:1)
这是你要找的吗?
<强> http://jsfiddle.net/Z2WuJ/2/ 强>
将图片或您放入的任何内容放在最大宽度为50%(两列)并将框大小设置为边框时,您应该得到所需的结果:
#ListHolder ul {
margin: 0;
padding: 10px;
list-style: none;
float: left;
max-width: 50%;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
答案 5 :(得分:1)
解决方案实际上很简单。
您需要一个包含display: inline-block
的包装元素。然后设置子元素的宽度。
var count = 20;
var interval = setInterval(function(){
document.getElementById('inner').innerHTML += '<p>another line</p>';
if( --count === 0 )
clearInterval(interval);
}, 250);
&#13;
/* important stuff */
#outer {
display: inline-block;
height: 150px;
overflow-y: auto;
}
#inner {
width: 300px;
}
/* styling */
p {
margin: 0;
padding: 20px;
background: white;
}
#outer {
padding: 20px;
outline: 2px solid red;
background: #ccc;
}
#inner {
outline: 2px solid red;
}
&#13;
<div id="outer">
<div id="inner">
</div>
</div>
&#13;
答案 6 :(得分:0)
你想要的是overflow:auto;
,它只会在内容需要滚动时显示滚动条。否则它会隐藏滚动条。
所以你的div看起来像这样:
<div class="scroll">
<ul>
<li></li>
<li></li>
<li></li>
</ul>
<ul>
<li></li>
<li></li>
<li></li>
</ul>
</div>
和你的css:
.scroll {
overflow-y:auto; /* Only scroll the y axis */
}
答案 7 :(得分:0)
我认为你应该考虑滚动条的宽度来考虑div宽度。可以在div宽度上添加几个像素(30px)。然后将RighList和LeftList宽度设置为每个49%。
overflow-y:auto会导致列表移动,因为您没有考虑滚动条宽度。
希望这有帮助!
答案 8 :(得分:0)
我认为你的最佳镜头是即使没有溢出也会始终显示滚动条(滚动条将被停用,并且当页面内容比视口长时将被激活)。
您可以使用以下代码实现此目的:
html {
overflow: -moz-scrollbars-vertical; /* For FF */
-ms-overflow-y: scroll; /* For IE */
overflow-y: scroll; /* For others & old IE */
}
这是一个有效的 FIDDLE
或者,如果您可以为容器div设置固定宽度,则可以通过将overflow-y值设置为overlay来忽略滚动条的宽度,这将使内容位于较小视口的滚动条后面
请注意:不推荐overflow:overlay;
。
你走了:
html {
overflow-y: overlay;
}
#ListHolder {
display:inline-block;
width:600px; /* Fixed width */
}
这是另一个 FIDDLE
请注意,这两种方法都适用于现代和旧版浏览器,例如优秀的IE8。
希望这有帮助。
答案 9 :(得分:0)
即使您可以将DIV宽度调整为滚动条的存在,我也不推荐它。考虑用户可以在他们的操作系统中自定义滚动条的大小(宽度)(Windows会想到)。
接下来,有些浏览器报告视口的宽度带有滚动条,而其他浏览器报告没有。具体来说,Chrome和Safari 排除滚动条尺寸,而Firefox,Opera和IE 包含滚动条尺寸。
我的结论是,我同意你应该使用overflow: scroll
的其他答案。要么是这样,要么使用javascript来使用自定义滚动条(我认为这是一种过度杀伤)。
阅读材料:
答案 10 :(得分:0)
<强> DEMO 强>
只需查看演示&amp;检查元素并从“#ListHolder”div中删除高度,您将看到宽度将适应滚动条存在的变化。
如果您正在寻找这个,请告诉我,我将解释其背后的逻辑。
HTML:
<div class="overall-width">
<div id="ListHolder">
<ul id="LeftList">
<li>
<img src="http://placehold.it/200x200" />
</li>
<li>
<img src="http://placehold.it/200x200" />
</li>
<li>
<img src="http://placehold.it/200x200" />
</li>
</ul>
<ul id="RightList">
<li>
<img src="http://placehold.it/200x200" />
</li>
<li>
<img src="http://placehold.it/200x200" />
</li>
<li>
<img src="http://placehold.it/200x200" />
</li>
</ul>
</div>
</div>
CSS:
html {
overflow: -moz-scrollbars-vertical;
/* For FF */
-ms-overflow-y: scroll;
/* For IE */
overflow-y: scroll;
/* For others & old IE */
}
#ListHolder {
display:inline-block;
height: 610px;
overflow: auto;
width: 100%;
padding: 10px;
}
#ListHolder > ul {
-moz-box-sizing: border-box;
-webki-box-sizing: border-box;
box-sizing: border-box;
border: 1px solid #CFCFCF;
border-radius: 3px;
display: inline-block;
margin: 0;
padding: 20px;
text-align: center;
width: 250px;
}
#ListHolder > ul > li {
display:inline-block;
}
#LeftList {
float:left;
}
#RightList {
float:right;
}
body{
height: 100%;
margin: 0px;
}
.overall-width{
width: 600px;
}
答案 11 :(得分:-1)
也许你可以改变滚动条。像这样:
::-webkit-scrollbar {
width: 2em;
height: 2em
}
::-webkit-scrollbar-button {
background: #ccc
}
::-webkit-scrollbar-track-piece {
background: #888
}
::-webkit-scrollbar-thumb {
background: #eee
}
另外,您可以找到IE css here