【问题标题】:How should I style an element with border, border-radius, and overflow:auto?我应该如何使用边框、边框半径和溢出设置元素样式:自动?
【发布时间】:2017-06-26 21:53:40
【问题描述】:

我正在设计一个列表,为了与对等元素保持一致,该列表需要位于具有圆角边框的元素中。该列表可能足够高,也可能不足以导致垂直滚动条。

如果我用全圆角设置列表样式,滚动条会遮住圆角,看起来很破:

ul {
  border: 2px solid grey;
  border-radius: 10px;
  overflow-x: hidden;
  overflow-y: auto;
  max-height: 8em;
}
<ul>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
</ul>

如果我删除了右侧的圆角,滚动条在出现时看起来是正确的:

ul {
  border: 2px solid grey;
  border-radius: 10px 0 0 10px;
  overflow-x: hidden;
  overflow-y: auto;
  max-height: 8em;
}
<ul>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
  <li>Item</li>
</ul>

但这意味着当列表太短而无法滚动时,元素看起来不一致。我可以设置overflow-y:scroll 而不是自动,但我宁愿避免总是显示栏。有没有办法设置这个样式,使没有溢出的元素有圆角,但有滚动条的元素没有? (欢迎使用其他解决方案!)

【问题讨论】:

  • 你用的是chrome,对吧?第一个示例在 Firefox 中运行。
  • 我什至没有想过要检查。它在 Chrome 中坏了,在 IE 和 Edge 中也坏了。 Firefox 能很好地处理这一点很酷(特别是考虑到他们反对自定义滚动条外观的强硬立场),但我真的很喜欢在任何平台上看起来都很好的东西。

标签: css


【解决方案1】:

您可以将div 包裹在ul 元素周围。然后在div 上应用border-radius。要隐藏溢出角落的 scollbar,请对其应用 overflow: hidden

div {
    border: 2px solid grey;
    border-radius: 10px;
    overflow: hidden;
}

ul{
    overflow-x: hidden;
    overflow-y: auto;
    max-height: 8em;
    margin: 0;
}
<div>
    <ul>
        <li>Item</li><li>Item</li><li>Item</li><li>Item</li><li>Item</li><li>Item</li>
        <li>Item</li><li>Item</li><li>Item</li><li>Item</li><li>Item</li><li>Item</li>
    </ul>
</div>

【讨论】:

  • 我看到另一个问题也有类似的建议,但是对于边框颜色和半径的某些组合,恕我直言,这会使滚动条看起来很奇怪。我会记住这一点,但我仍然更喜欢“修复”边框以与滚动条配合使用的东西,而不是将滚动条硬塞到现有边框中。
  • 也许使用自定义滚动条?喜欢manos.malihu.gr/jquery-custom-content-scroller
【解决方案2】:

这是我想出的解决方案:
如果 div 大于 150px,它会将类 rounded 添加到 ul 并且右边框不圆角。
问题是,您必须max-height

编辑:中使用像素作为单位:我添加了一个小按钮,添加了一个列表项,因此您可以看到效果。

编辑 2: 编辑了我的笔,因此您可以使用 vh 而不是像素。只需更改var containerHeight 中的0.4 (0.4 = 40vh)

var containerHeight = $(window).height() * 0.4;

$('button').click(function(){
    $('.listContainer').append('<li>Item</li>');
    if ($('.listContainer').outerHeight() >= containerHeight) {
       $('.listContainer').addClass("notrounded");
    }
});
ul{
border: 2px solid grey;
border-radius: 10px;
overflow-x: hidden;
overflow-y: auto;
max-height: 40vh;
}
ul.notrounded{
border-radius: 10px 0 0 10px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="listContainer">
<li>Item</li><li>Item</li><li>Item</li>
</ul>
<button>add list item</button>

【讨论】:

  • @RichardMauritz 为什么这不能回答问题?看一下最初问题的底部 2 行。 “有没有办法设置这个样式,让没有溢出的元素有圆角,但有滚动条的元素没有?”。这正是我所做的。如果 div 溢出,则没有圆角,如果没有,则有圆角。
  • 你说得对,我没看到那部分。对不起,我的错。
  • 我在想这样的事情,但目前容器高度不固定。我可以尝试挂钩每个可能会改变大小的事件,确定它是否溢出并改变类,但这似乎是为了获得一致的行为而过度杀伤:(
  • @Coderer 那么你的意思是“容器高度不固定”吗?在您的问题中,还有一个固定的max-height
  • 对不起,是的,在示例中我修复了一个小的最大高度以强制溢出。在实际应用程序中,容器的大小使用vh,但这不适合在这里复制一个简单的示例。
【解决方案3】:

这是默认问题,因为滚动条总是出现在图层上方,但是您可以使用替代方法来减少此问题,即

	ul{

overflow-x: hidden;
overflow-y: auto;
max-height: 8em;
}
.border_sec{
	border: 2px solid grey;
border-radius: 10px;
}
<div class="border_sec">
<ul>
<li>Item</li><li>Item</li><li>Item</li><li>Item</li><li>Item</li><li>Item</li>
<li>Item</li><li>Item</li><li>Item</li><li>Item</li><li>Item</li><li>Item</li>
</ul>
</div>

【讨论】:

  • 这不是解决问题的好方法。我现在看起来滚动条不是元素的一部分:o
  • 大声笑...如果您有其他解决方案请告诉我,这是解决问题的唯一方法,即使您也使用了相同的方法。干杯!!
  • 看我的遮阳篷...不过我没有使用相同的解决方案。
  • 大声笑......是的,你的答案有点不同,只是使用了 margin:0;但这取决于要求。但留下它:P ..
  • 我只是给出了问题的解决方案,没有给出滚动条是否是元素的一部分的答案......但你的答案是适当的继续! :)
猜你喜欢
  • 1970-01-01
  • 2012-06-11
  • 2018-01-02
  • 1970-01-01
  • 2014-05-31
  • 2015-10-14
  • 1970-01-01
  • 2014-03-27
  • 2016-01-13
相关资源
最近更新 更多