我有一种情况,其中我有一个容器div元素,并且在这个容器中有一个内部元素(在本例中是图片).我希望发生以下情况:

  • 如果容器div比内部元素高,则内部元素应放置在容器的底部.
  • 如果容器div小于,则应将内部元素放在容器的顶部,并剪裁底部.

我遇到的主要困难是内部元素的高度是可变的.理想情况下,我希望有一个仅支持CSS的解决方案(当然,如果使用JavaScript会容易得多).

部分解

在内部元素高度已知且固定的情况下,我已设法使用以下(CodePen link)获得所需结果:

.container {
  margin-top: 30px;
  margin-bottom: 30px;
  background-color: red;
  overflow: clip;
  height: 100vh;
  position: relative;
  container-type: size;
}

.inner {
  background-image: linear-gradient(green, yellow);
  height: 400px;
  width: 200px;
}

.option1 {
  position: absolute;
  @container (max-height: 400px) {
    top: 0;
  }
  @container (min-height: 400px) {
    bottom: 0;
  }
}
<div class="container">
  <div class="inner">
  </div>
</div>

我不知道这是否能为任何解决方案提供一个有用的起点.通过在@container个查询中访问当前元素的高度,可以很容易地解决这一问题.

推荐答案

只需使用一个伪元素并将.container设置为flex-direction: column:

.container {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  overflow: clip;
}

.container::before {
  content: '';
}

伪元素::before的高度为0(因为我们没有指定任何高度),所以用户看不见它.但是,如果它有一定的高度,我们的布局(没有display: flex)将如下所示:

┌────────────────────────┐
│        ::before        │
├──────┬─────────────────┤
│      │                 │
│.inner│                 │
│      │                 │
├──────┘                 │
│                        │
└────────────────────────┘

display: flex(使其成为弹性框)、flex-direction: column(垂直放置元素)和justify-content: space-between(元素之间的最大间距)的组合使这两个元素接触到两个相对的边:

┌────────────────────────┐
│        ::before        │
├────────────────────────┤
│                        │
├──────┐                 │
│      │                 │
│.inner│                 │
│      │                 │
└──────┴─────────────────┘

如果.container的身高不是子元素身高的总和,它会首先try 缩小子元素的身高.由于::before从一开始就没有任何高度,而.inner已经适合它的内容,所以它们之间的空间塌陷到0,.inner将是clip-pep:

┌────────────────────────┐
│        ::before        │
├──────┬─────────────────┤
│      │                 │
│.inner│                 │
└──────┴─────────────────┘

试试看:

const container = document.querySelector('.container');
const input = document.querySelector('input');

input.addEventListener('input', function() {
  container.style.height = this.value + 'px';
});
.container {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  margin: 30px 0;
  background-color: red;
  overflow: clip;
  height: 200px;
}

.container::before {
  content: '';
}

.inner {
  background-image: linear-gradient(green, yellow);
  width: 200px;
}
<input type="range" min="100" max="1000" step="1" value="200">

<div class="container">
  <div class="inner option1">
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam interdum purus nec interdum tristique. Maecenas eleifend, libero nec varius cursus, lacus eros elementum odio, eget convallis risus erat ut velit. Pellentesque ut ex lobortis, hendrerit ipsum
    ut, pretium dui. Morbi porta viverra eros eget malesuada. Praesent sed metus eu dui fermentum sagittis. Aliquam blandit ultricies hendrerit. Integer dignissim enim est, id vestibulum ante ultricies eu. Cras at est quis sem luctus finibus. Mauris in
    maximus turpis.
  </div>
</div>

Html相关问答推荐

NG8004:找不到名为""的管道.'' [插件Angular 编译器]

如何防止可见的滑动抽屉,同时转移HTML方向?

在将DevExtreme升级到版本23.2之后,到处都会生成一个Pesudo类,我在其中使用了<;DXi-Item Title=&Quot;&Quot;>;

如何使用html的<;输入>;处理/绑定Angular 信号?

如何使用Reaction Js读取html文件中的代码

使具有FLEX父项的溢出自动的子元素收缩

你将如何为手机制作导航栏

使自定义图像滑块全宽

将文本保持在平行四边形内并遵循形状

如何防止滑动滚动元素时touch 屏出现空白区域?

Swift 以编程方式在 YouTube 嵌入视频中进入全屏

如何在黑暗模式切换中添加图标

如何使Bootstrap 5卡可点击

白色栏超出页面100%的右侧

如何使用 CSS 应用带有笔划的文本阴影?

如何配置 prettier 使其以 Vue.js 模板语法的特定方式运行?

W3Schools 幻灯片相同高度

CSS 中的 fingerprint scanner 动画

如何让 backdrop-filter: blur() 效果在 iOS 上运行?

那里有一个类似于 ?