是否可以***缩放***子节点(大小已知)以匹配其父节点(宽度未知)的宽度?
子对象的大小将比父对象的大小更宽。我需要找到一种方法来缩小它,以便它在父对象的边界内显示整个子对象。
我希望尽可能避免使用javascript。
下面是代码:
.a-very-wide-child {
/* the exact size of the child is known */
width: 3000px;
height: 500px;
/* I am trying to scale this element to match the width of its parent. */
/* I am thinking probably what I need is a value for [HERE]. I am open
to other suggestions though. */
transform: scale(calc(/* [HERE] */));
transform-origin: top left;
/* I am NOT wanting to use width rules to resize the child. */
/* no: width: 100%; */
/* no: max-width: 100%; */
}
.a-small-parent {
/* has no style rules of note */
/* the width of the parent is not known */
/* the height of the parent is not known exactly, but known to be tall
enough to not be of concern */
}
/* Below is just styling and is safe to ignore. */
.a-small-parent {
border: 5px solid teal;
}
.a-very-wide-child {
background-image: linear-gradient(45deg, #888, transparent);
border: 5px solid gold;
}
.container{
width: 40vw;
}
<div class="container">
<div class=a-small-parent>
<pre class=a-very-wide-child>
<img src="https://picsum.photos/400/500" alt="">
</pre>
</div>
</div>
1条答案
按热度按时间0pizxfdo1#
很晚才下班,我一直在摆弄各种元素大小和字体缩放以实现响应行为,我知道我已经创建了一些东西来解决您的问题(请参阅末尾的Codepen链接)。
先从不利的一面说起:你不能避免使用一些Javascript,因为你需要一个 * 无单位的比例因子 * 来使CSS
transform: scale(..)
正常工作。为了响应的目的,你需要知道父容器的 * 当前clientWidth
。这对于 * 容器查询 * 和它们各自的单位也是如此。 使用CSS你不能从属性值中去掉单位 *。比例因子公式:
parent.clientWidth / child.Width
(无单位)。使用
transform: scale(..)
缩小时,HTML将继续使用元素在文档中占用的原始空间,从而导致元素周围的(巨大)空间。修改transform-origin
不能解决这个问题,但是如果margin
为负,我们可以“删除”多余的空间,并将元素放入其父元素中。该演示假定默认为transform-origin: center
,简单地意味着下面的等式对于所有四个边缘属性都成立。边距空间偏移的公式:
offset = -1px * (childSize - scaled childSize) / 2
(使用“px”单位转换)。由于当前问题,我们仅能处理 width 值,因此childSize
读取childWidth
。这个代码片段在所有的公式中使用了CSS自定义变量,以方便操作和测试。代码中有大量的注解,所以我希望不会有什么惊喜。如果我需要详细说明的话,请告诉我。
请注意当 * 缓慢 * 调整浏览器大小时,您有时会在缩放元素的上方/旁边看到空白的单像素线。这不是上面公式的结果,而是由于舍入问题,我没有考虑到。在公式中除法,您将得到十进制值,最终导致部分像素。经验法则:* 部分像素是完整像素 *。这将需要额外的Javascript,因为CSS不支持
round(..)
、ceil(..)
或floor(..)
。我创建了一些带有缩放变化的Codepen:
<iframe>
元素列表的网页,这些元素看起来像卡片Codepen: Runtime scaling cards, CSS only<iframe>
。片段