CSS基础篇--CSS3 calc实现滚动条出现页面不跳动

本文详细介绍了CSS3中的calc()函数,这是一种计算元素长度的新功能。通过实例展示了如何使用calc()来实现动态值设定,特别是在流体布局和解决滚动条出现时页面跳动的问题上的应用。

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

什么是calc()?

calc()从字面我们可以把他理解为一个函数function。其实calc是英文单词calculate(计算)的缩写,是css3的一个新增的功能,用来指定元素的长度。比如说,你可以使用calc()给元素的border、margin、pading、font-size和width等属性设置动态值。为何说是动态值呢?因为我们使用的表达式来得到的值。不过calc()最大的好处就是用在流体布局上,可以通过calc()计算得到元素的宽度。

语法

calc() = calc(四则运算)

例如:

.elm {
  width: calc(expression);
}

其中"expression"是一个表达式,用来计算长度的表达式

说明

用于动态计算长度值。

  • 需要注意的是,运算符前后都需要保留一个空格,例如:width: calc(100% - 10px);
  • 任何长度值都可以使用calc()函数进行计算;
  • calc()函数支持 "+", "-", "*", "/" 运算;
  • calc()函数使用标准的数学运算优先级规则;

兼容性

图片描述

简单的例子:

<!DOCTYPE html>
<html lang="zh-cmn-Hans">
<head>
<meta charset="utf-8" />
<title>calc()函数_CSS参考手册_web前端开发参考手册系列</title>
<meta name="author" content="Joy Du(飘零雾雨), dooyoe@gmail.com, www.doyoe.com" />
<style>
.test {
    width: calc(100% - 50px);
    background: #eee;
}
</style>
</head>
<body>
<div class="test">我的宽度为100% - 50px</div>
</body>
</html>

下面就来讲解下最常用的这个:实现滚动条出现页面不跳动的应用

当页面内容动态加载,开始没有滚动条,内容增多后出现滚动条,这时使用固定宽度居中对齐布局会向左偏移一个滚动条宽度。解决方法可以给内容全部添加overflow-y:scroll;或者是根据内容用css填充好再补充内容。本文介绍的是calc来计算滚动条宽度,当有滚动条时,内容外部也给它模拟一个滚动条宽度,因而就不会偏移了。·

很简单,只要一行代码就搞定了:

.wrap-outer {
    margin-left: calc(100vw - 100%);
}

或者:

.wrap-outer {
    padding-left: calc(100vw - 100%);
}

首先,.wrap-outer指的是居中定宽主体的父级,如果没有,创建一个(使用主体也是可以实现类似效果,不过本着宽度分离原则,不推荐);
然后,calc是css3中的计算,IE10+浏览器支持,IE9浏览器基本支持(不能用在background-position上);
最后,100vw相对于浏览器的window.innerWidth,是浏览器的内部宽度,注意,滚动条宽度也计算在内!而100%是可用宽度,是不含滚动条的宽度。
于是,calc(100vw - 100%)就是浏览器滚动条的宽度大小(如果有,如果没有滚动条则是0)!左右都有一个滚动条宽度(或都是0)被占用,主体内容就可以永远居中浏览器啦,从而没有任何跳动!

参考

CSS3的calc()使用
calc()

当你在CSS中遇到滚动条导致的内容区域挤压问题时,可以利用`calc()`函数动态计算元素的总宽度,以便留出滚动条的空间。特别是对于那些使用百分比布局,并且需要兼容各种浏览器的场景。 例如,如果你想让一个元素的内容区在没有滚动条的情况下宽度为100%,但实际上给滚动条预留了空间,可以这样做: ```css .content { width: calc(100% - (2 * scrollbar-width)); /* 计算100%减去两倍滚动条宽度 */ overflow-x: auto; /* 添加水平滚动条 */ } ``` 这里的关键在于`scrollbar-width`,它是一个伪元素,用于获取滚动条的实际宽度。同浏览器对这个的支持程度同,一种常见的方式是使用JavaScript实现: ```javascript function getScrollbarWidth() { const outer = document.createElement(&#39;div&#39;); outer.style.visibility = &#39;hidden&#39;; outer.style.width = &#39;100px&#39;; document.body.appendChild(outer); const inner = document.createElement(&#39;div&#39;); inner.style.overflow = &#39;scroll&#39;; inner.style.width = &#39;100%&#39;; outer.appendChild(inner); const difference = outer.offsetWidth - inner.offsetWidth; document.body.removeChild(outer); return difference; } ``` 然后在CSS里引用这个JavaScript函数的结果: ```css .scroll-calculator { --scrollbar-width: /* 将JavaScript得到的值赋值给变量 */; width: calc(100% - (2 * var(--scrollbar-width))); } ``` 注意,这种方法并适用于所有浏览器,尤其是老旧的、支持`getComputedStyle()`或`window.innerWidth`的浏览器。如果需要更好的兼容性,建议使用第三方库或者考虑使用其他布局技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值