如何在HTML中使子元素宽度超出父元素但保留纵向滚动条且隐藏横向滚动条?

html中如何实现子元素宽度可以超出父元素,效果就是高度不超出父元素而是显示滚动条,横向不显示滚动条?

<div class="parent">
        <div class="child">这是一个很长的文本,‌确保它在纵向超出父元素。‌</div>    
</div>
<style>
.parent{
    background:#ccc;
    width: 200px;
    height: 200px;
    border: 1px solid black;
    position: relative;
}
.child{
    width: 300px;
    background-color: lightblue;
}
</style>

大概就像下面这种效果
图片的效果是子元素使用 position:fixed 实现的,并不符合需要的效果
经过我测试,只要父元素添加了 overflow-x:hidden 就无法让子元素超出父元素
去除 overflow 属性可以超出父元素但是纵向滚动条又没了

阅读 1.3k
avatarAI BotBETA

要实现子元素的宽度超出父元素但保留纵向滚动条且隐藏横向滚动条的效果,你可以通过在父元素上使用 overflow-x: hidden;overflow-y: auto; 来控制滚动条的行为,并适当调整子元素的样式以确保其内容按预期显示。

这里是如何修改你的HTML和CSS来达到这个效果:

<div class="parent">
    <div class="child">这是一个很长的文本,确保它在纵向超出父元素。由于文本太长,它将在垂直方向上滚动显示,而不会在水平方向上超出或显示滚动条。</div>
</div>

<style>
.parent {
    background: #ccc;
    width: 200px;
    height: 200px;
    border: 1px solid black;
    position: relative;
    overflow-x: hidden; /* 隐藏横向滚动条 */
    overflow-y: auto;   /* 显示纵向滚动条 */
}

.child {
    width: 300px; /* 子元素宽度超出父元素 */
    white-space: nowrap; /* 防止文本换行,保持水平布局 */
    display: inline-block; /* 允许宽度设置生效而不独占一行 */
    background-color: lightblue;
    padding: 10px; /* 添加一些内边距以便更清晰地看到滚动效果 */
}
</style>

注意,在这个例子中,.child 使用了 white-space: nowrap;display: inline-block;。这是因为如果你希望子元素的内容(如长文本)在水平方向上不被截断或换行,并且希望子元素的宽度能够影响布局(即超出父元素),则这些设置是必要的。然而,这可能会导致子元素的内容在单行内水平延伸,直到遇到 overflow-x: hidden; 而被隐藏。如果你的子元素包含的是可自动换行的文本或图像等其他元素,并且你希望它们在垂直方向上滚动显示,则可能不需要 white-space: nowrap;

此外,由于子元素的宽度已经设置为超出父元素,因此滚动条将只出现在父元素的纵向,以允许查看超出其高度的内容。横向滚动条被隐藏,因为父元素上设置了 overflow-x: hidden;

1 个回答

多层div的嵌套的方式,但是这样会有 .child 元素会有滚动条出现。
比如说👇

<div class="parent">
  <div class="child">这是一个很长的文本,‌确保它在纵向超出父元素。‌</div>    
  <p>1</p><p>1</p><p>1</p><p>1</p><p>1</p><p>1</p><p>1</p><p>1</p><p>1</p><p>1</p><p>1</p><p>1</p><p>1</p>
</div>
<style>
.parent{
  width: 200px;
  height: 200px;
  background: #ccc;
  border: 1px solid black;
  position: relative;
  overflow-x: hidden;
}
.child{
  width: 100%; 
  background-color: lightblue;
  word-break: keep-all;
  white-space: nowrap;
  overflow-x: scroll;
}
</style>

如果想要隐藏滚动条的话,就会比较麻烦。因为现在没有一个非常好的自定义滚动条样式的属性(各家浏览器对于 scrollbar 相关的属性的支持并不是特别友好)

所以我们一般想要做滚动条隐藏的需求,会再套一层外部容器去做垂直方向的超出隐藏来隐藏滚动条。
比如说👇:

<div class="parent">
  <div class="hide-scrollbar">
    <div class="child">这是一个很长的文本,‌确保它在纵向超出父元素。‌</div>   
  </div>
  <p>1</p><p>1</p><p>1</p><p>1</p><p>1</p><p>1</p><p>1</p><p>1</p><p>1</p><p>1</p><p>1</p><p>1</p><p>1</p>
</div>
<style>
.parent{
  width: 200px;
  height: 200px;
  background: #ccc;
  border: 1px solid black;
  position: relative;
  overflow-x: hidden;
}
.child{
  width: 100%; 
  line-height: 20px;
  padding-bottom: 30px;
  background-color: lightblue;
  word-break: keep-all;
  white-space: nowrap;
  overflow-x: scroll;
}
.hide-scrollbar {
  width: 100%;
  height: 20px;
  overflow: hidden;
}
</style>
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏