CSS 各种百分比是基于什么工作的?(上)

简介: CSS 各种百分比是基于什么工作的?

大家有没有对 CSS 中的百分比是如何工作的感兴趣?有没有想过,为什么它有时会乱七八糟,没啥头绪?反正我是有,所以今天分享这篇文章,对自己来说是加深理解,同时也希望对大家有所帮助。

什么百分比?

作为百分比,显然应该有一个目标作为参考源,这个参考一般是父元素。 这是正确的,但并不涵盖所有情况。 最正确的答案应该是包含块(containing block),即包含我们元素的块且它不必是直接的父元素。

看看下面的例子:

e5babca37e684d68a91c1d0377bcb88f.png

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>css百分比</title>
  <link rel="stylesheet" href="css/swiper.min.css">
  <link rel="stylesheet" href="css/certify.css">
  <script src="js/swiper.min.js"></script>
</head>
<body>
  <div class="grandparent">
    <div class="parent">
      <div class="child"></div>
    </div>
  </div>
</body>
</html>
<style>
  .grandparent {
    position: relative;
    width: 200px;
    height: 200px;
    background: #eaeaea;
  }
  .parent {
    width: 100px;
    height: 100px;
    background: #aaa;
  }
  .child {
    position: absolute;
    width: 50%;
    height: 50%;
    top: 25%;
    left: 25%;
    background: red;
  }
</style>

在上面的例子中,我创建了 3 个嵌套 div,它们是具有以下特征的3个正方形


最外面的组元 div 是一个浅灰色,大小为 4x4

父元素 div 的颜色为深灰色,大小为 2x2

以及分配 50% 大小的红色子 div

如果百分比单位以父级为来源,则子级的大小应该是它的 1/2,但上面的不是,子级的大小实际上等于父级,也就是祖父级的 1/2。 原因是祖父级 div 是子级 div 的真正包含块,因为子级具有 position: absolute ,对应于在祖父级中设置的 position:relative 。


因此,为了确定哪个是元素的实际包含块,它完全基于元素本身的 position 属性。


但是,对于某些属性,百分比单元的引用源既不是父块也不是包含块,而是它本身—— 自身元素。

百分比的属性

width/height

如上面的例子中看到的,当一个元素为其宽度分配一个百分比值时, width 是基于包含块的 width, height 是基于包含块的 height

padding

对于 padding,垂直(padding-top/padding-bottom)或水平(padding-left/padding-right)都是基于包含块的 width 来计算。

来个例子:

a06006d55b084bb18901f6ac4494049a.png

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>css百分比</title>
  <link rel="stylesheet" href="css/swiper.min.css">
  <link rel="stylesheet" href="css/certify.css">
  <script src="js/swiper.min.js"></script>
</head>
<body>
  <div class="grandparent">
    <div class="parent">
      <div class="child"></div>
    </div>
  </div>
</body>
</html>
<style>
  .parent {
    background: #eaeaea;
    width: 300px;
    height: 200px;
  }
  .child {
    display: inline-block;
    background: red;
    padding-top: 50%;
    padding-left: 50%;
  }
  .parent {
    position: relative;
  }
  .grandparent {
    position: relative;
  }
  .grandparent::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 99;
    background: radial-gradient(circle at 1px 1px, #000 2px, transparent 0);
    background-size: 49.5px 49.5px;
  }
</style>

在这个例子中:


父 div 的大小为 6x4。

子 div 的大小为 0,但 padding-top 和 padding-left 分别为 50%

最后的结果是,子元素的大小相当于父级元素 1/2 宽度,也就是一个 3x3 的正方形。


margin

与 padding,margin 的百分比(垂直和水平)也是相对于包含块的宽度来计算。


来个例子:

3cd2b39e668e4a9caaba422f3ce62aea.png

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>css百分比</title>
  <link rel="stylesheet" href="css/swiper.min.css">
  <link rel="stylesheet" href="css/certify.css">
  <script src="js/swiper.min.js"></script>
</head>
<body>
  <div class="grandparent">
    <div class="parent">
      <div class="child"></div>
    </div>
  </div>
</body>
</html>
<style>
  .parent {
    background: #eaeaea;
    width: 300px;
    height: 200px;
  }
  .child {
    display: inline-block;
    background: red;
    width: 50px;
    height: 50px;
    margin-top: 50%;
    margin-left: 50%;
  }
  .parent {
    position: relative;
  }
  .grandparent {
    position: relative;
  }
  .grandparent::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 99;
    background: radial-gradient(circle at 1px 1px, #000 2px, transparent 0);
    background-size: 49.5px 49.5px;
  }
</style>

在这个例子中:

父级 div 的大小为 6x4。

margin-top 和 margin-left 分别为 50%

其结果是,子元素被定位在离父级元素的上边距和左边距3个单位的地方(父级宽度的1/2)。

top/bottom/left/right

topbottom 基于包含块的 height 来计算,leftright 基于包含块的width来计算。

来个例子:

9572c2dbd1bc44029627c758daf8e0d0.png

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>css百分比</title>
  <link rel="stylesheet" href="css/swiper.min.css">
  <link rel="stylesheet" href="css/certify.css">
  <script src="js/swiper.min.js"></script>
</head>
<body>
  <div class="grandparent">
    <div class="parent">
      <div class="child"></div>
    </div>
  </div>
</body>
</html>
<style>
  .parent {
    position: relative;
    background: #eaeaea;
    width: 300px;
    height: 200px;
  }
  .child {
    position: absolute;
    background: red;
    width: 16.67%;
    height: 25%;
    top: 50%;
    left: 50%;
  }
  .parent {
    position: relative;
  }
  .grandparent {
    position: relative;
  }
  .grandparent::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 99;
    background: radial-gradient(circle at 1px 1px, #000 2px, transparent 0);
    background-size: 49.5px 49.5px;
  }
</style>

在这个事例中:


父级 div 的大小为 6x4

子元素有 position: absolute, top 和 left 分别为 50%

最终结果,子 div 被定位在离父 div 的顶部边缘 2 个单位的位置(父 div 高度的 1/2),并被定位在离父 div 的左侧边缘 3 个单位的位置(父 div 宽度的 1/2)。


目录
相关文章
纯css3实现的百分比渐变进度条加载动画源码
纯css3实现的百分比渐变进度条加载动画特效源码
259 31
|
前端开发 容器
css【详解】—— margin属性(含margin百分比值,margin负值,margin合并,margin:auto,margin失效)
css【详解】—— margin属性(含margin百分比值,margin负值,margin合并,margin:auto,margin失效)
987 1
|
前端开发
你不知道的css——2. 百分比高度失效,绝对定位和非绝对定位元素的宽高百分比计算方法的不同
你不知道的css——2. 百分比高度失效,绝对定位和非绝对定位元素的宽高百分比计算方法的不同
285 1
|
移动开发 前端开发 JavaScript
H5+CSS3+JS逆向前置——5、DIV+CSS百分比布局
H5+CSS3+JS逆向前置——5、DIV+CSS百分比布局
199 0
|
前端开发 JavaScript
svg或css,写loading圆环和百分比
svg或css,写loading圆环和百分比
562 0
|
前端开发 容器
CSS 各种百分比是基于什么工作的?(下)
CSS 各种百分比是基于什么工作的?
192 0
CSS 各种百分比是基于什么工作的?(下)
|
9月前
|
存储 自然语言处理 前端开发
抖音快手小红书虚拟评论截图生成器,模拟对话制作工具,html+js+css
这是一款纯前端实现的多平台虚拟评论生成器,支持抖音、快手、小红书风格,适用于产品演示与UI设计。采用Vanilla JS与Flexbox布局,利用IndexedDB存储数据,CSS Variables切换主题。

热门文章

最新文章

  • 1
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    402
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    305
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    273
  • 4
    (CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
    185
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    399
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    582
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    613
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    187
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    530
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    344