当视口较小时,我想在元素周围设置一个百分比的边距,占视口宽度的5%;当视口较大时,边距占视口宽度的15%。
我可以使用媒体查询来切换边距的数值,如下所示:
.element {
    margin: 5%;
}
@media (min-width: 800px) {
    .element {
        margin: 15%;
    }
}
然而,我希望在窗口大小改变时,百分比之间能够平滑过渡,而不是从一个值突变到另一个值。
我认为像这样的方法可能有效:
@media (min-width: 800px) {
    .image-grid {
        margin: 1em
            calc(
                (var(--max-margin) - var(--min-margin)) * ((100vw - 800px) / (1920 - 800) +
                    var(--min-margin))
            );
    }
}
这理论上应该通过将边距设置为边距之间变化量的百分比来平滑更改边距值。
例如,当视口较小时:min-margin + [margin的变化量] * 0,当视口为中等大小时:min-margin + [margin的变化量] * 0.5,当视口较大时:min-margin + [margin的变化量] * 1
但实际上并不起作用,因为calc函数不会将10px / 20px之类的值直接返回为小数,例如0.5。而是返回0.5像素。而15% * 0.5像素是不合理的,会导致边距回到默认值0。
也许我走错了方向。任何帮助将不胜感激。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
跟进我的评论
calc(..)中,您必须确保计算中的术语是合法的。在除法和乘法方面要特别细致!%)将产生像素(px)的结果,任何视口大小单位(vh,vw,vmin,vmax)及其派生单位也是如此。因此,您的第一个术语
(var(--max-margin) - var(--min-margin))将产生像素单位,因为大小的%转换为像素结果。由于第二个术语
((100vw - 800px) / (1920 - 800) + var(--min-margin))也产生像素单位的值,您正在将像素与像素相乘。不能将饼干与饼干相乘。
线性方程的点斜式y=mx+b是计算相对于当前视口大小的任何大小的完美选择。这就像在XY图上绘制一条线,使用低点和高点坐标为(x1,y1)和(x2,y2)。
点斜式的数学公式:
y - y1 = m(x - x1)y = y1 + (y2 − y1) / (x2 − x1) × (x − x1)在您的情况下
对于低点,我们可以选择任何方便的视口大小,并使用
5%来计算该大小的边距。我使用了400px的视口宽度,得到0.05 * 400 = 20。现在我们得到了低点(x1,y1),值为(400,20)高点很容易找到,因为您希望在宽度大于
800px的视口上有15%的边距。由于0.15 * 800 = 120,高点(x2,y2)将为(800,120)我们现在只需将值输入上述方程(带有适当的
px转换)并简化:margin = 20 * 1px + (120 - 20) / (800 - 400) * (100vw - 400 * 1px)margin = 20px + 100 / 400 * (100vw - 400px)margin = 20px + 0.25 * (100vw - 400px)您希望将最终结果限制在
5%和15%之间,这将需要使用CSS的clamp函数,得到最终结果:clamp(5%, 20px + 0.25 * (100vw - 400px), 15%)代码片段显示了限制和未限制版本的效果(请将浏览器全屏并调整大小以查看差异)。
顺便说一句,最终结果的斜截式(y = mx + b)是
25vw - 80px。/* 点斜式 */ .test1 { margin: 0 clamp(5%, 20px + 0.25 * (100vw - 400px), 15%) } .test2 { margin: 0 calc(20px + 0.25 * (100vw - 400px)) } /* 斜截式 */ .test3 { margin: 0 clamp(5%, 25vw - 80px, 15%) } .test4 { margin: 0 calc(25vw - 80px) } /* 仅为视觉效果 */ * { box-sizing: border-box; outline: 1px dashed } body { margin: 0; text-align: center } .test { background-color: Linen }