CSS 中 calc() 的应用

本文介绍如何使用CSS中的calc函数实现响应式布局,确保图片在不同视图下保持比例不变。通过数学公式推导,得出图片宽度的计算方式,适用于多张图片并排展示的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

css中calc的应用

  • 假设要实现以下功能,随着视图的变化,图片始终保持如图的比列,放大或缩小
  • 图片动态演示

实现

  1. 抽象一下如图所示
  • aw:宽高比宽度
  • ah:宽高比高度
  • w1:大图像的宽度
  • h1:大图像的高度
  • w2:小图像的宽度
  • h2: 小图像的高度
  • m:图像之间的边距
  1. 结合图可以得到如下表达式
  • w1 + m + w2 = 100%
  • 2 × h2 + m = h1
  • w1 / aw × ah = h1
  • w2 / aw × ah = h2
  • 现在开始求解决w1(然后是w2)。开始在公式2)中分别用公式3)和4)代替h1和h2,然后求解为w2如图所示:
  • 然后,我可以在公式1)中用w2的结果替换它,并为w1求解:
  • 用红色圈出的结尾处的表达式。它只包含边距,宽高比宽度和宽高比高度 - 在运行时都不会改变。因此,它是我们可以在构建时预先计算的常数值。为方便起见,我将此命名为常量值c:
c = (m × aw) / (ah × 3)

w1 = 2/3 × (100% − m) + c
w2 = 1/3 × (100% − m) − c
复制代码

代码

<!--html-->
<div class="thumbnails">
  <img src="https://placeimg.com/400/300/animals" alt="A randomly selected animal photo">
  <img src="https://placeimg.com/400/300/nature" alt="A randomly selected nature photo">
  <img src="https://placeimg.com/400/300/arch" alt="A randomly selected archirecture photo">
</div>

<!--scss-->
// Using values from the original design
$margin: 20px;
$aspect-width: 4;
$aspect-height: 3;
// Calculate c
$constant: ($margin * $aspect-width) / ($aspect-height * 3);


.thumbnails {
  width: 50%;
  margin: 0 auto;
  padding: $margin;
  border: 2px solid black;
  overflow: hidden; // crude clearfix
  
  
  // First image becomes big one on left
  > *:first-child {
    display: block;
    float: left;
    margin-right: $margin;

    // Magic formula!
    width: calc( (2 / 3 * (100% - #{$margin}) ) + #{$constant} );
  }

  // 2nd & 3rd images become smaller ones
  // on right
  > *:nth-child(n + 2) {
    display: block;
    float: right;

    // Magic formula!
    width: calc( (1 / 3 * (100% - #{$margin}) ) - #{$constant} );
  }

  // 3rd image also has top margin
  > *:nth-child(3) {
    margin-top: $margin;
  }
}
复制代码

参考链接

### calc 函数的基本用法 `calc()` 是 CSS 中的一种动态计算函数,允许在 CSS 属性中进行数学运算,并支持多种单位的混合使用(如 `px`、`em`、`%` 等),从而实现更加灵活的布局控制 [^3]。它可以在 `<length>`、`<percentage>`、`<number>` 等 CSS 数据类型之间进行加、减、乘、除运算 [^4]。 例如,设置一个元素的宽度为视口宽度减去固定像素值: ```css .container { width: calc(100% - 80px); } ``` 此写法确保 `.container` 的宽度会根据父容器的宽度动态调整,并扣除 80px 的固定空间 [^3]。 --- ### 使用 calc 函数的注意事项 在使用 `calc()` 时,有几个关键点需要注意: - **运算符前后必须有空格**,例如 `width: calc(100% - 10px)` 是正确的,而 `calc(100%-10px)` 或 `calc(100% -10px)` 是无效的 [^5]。 - **支持标准的数学运算优先级**,可以通过括号改变运算顺序,如 `calc((100% - 50px) / 2)` [^4]。 - **可以嵌套使用 `calc()` 函数**,实现更复杂的计算逻辑。 - **不能直接包含 CSS 变量或函数**,但可以与 `var()` 配合使用。 例如,结合 CSS 变量使用: ```css .container { --offset: 20px; width: calc(100% - var(--offset)); } ``` --- ### calc 函数的实际应用场景 `calc()` 在响应式布局中非常实用,可以用于动态调整元素的尺寸、位置或间距。例如,创建一个左右留白固定的全屏容器: ```html <div id="box"></div> ``` ```css #box { width: calc(100% - 100px); margin: 0 50px; background-color: yellow; } ``` 此设置确保 `#box` 始终在视口左右各留出 50px 的空白区域 [^5]。 另一个常见用法是根据视口高度设置元素的宽度: ```css .sidebar { width: calc(100vh / 4); } ``` 该写法将 `.sidebar` 的宽度设置为视口高度的四分之一,适用于垂直方向为主的设计场景。 --- ### 结合响应式设计的灵活性 `calc()` 函数在响应式设计中尤其强大,能够根据视口尺寸、父容器大小或元素自身属性动态调整样式。例如,在媒体查询中结合使用: ```css @media (min-width: 768px) { .content { width: calc(50% - 20px); } } ``` 这使得 `.content` 元素在中等屏幕尺寸下自动适应为父容器宽度的一半减去 20px,从而实现更精细的布局控制 [^2]。 --- ### 示例代码 以下是一个完整的 HTML 示例,展示如何使用 `calc()` 实现左右留白的布局: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>calc 示例</title> <style> #content { position: absolute; left: 50px; width: calc(100% - 100px); background-color: yellow; border: 1px solid black; padding: 5px; text-align: center; } </style> </head> <body> <p>这是一个两侧留白的 div:</p> <div id="content">内容区域</div> </body> </html> ``` 该代码确保 `#content` 始终在屏幕两侧保留 50px 的空白 [^5]。 --- ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值