【问题标题】:How to calculate padding-top in % of the given div relative to its parent div如何计算给定 div 相对于其父 div 百分比的 padding-top
【发布时间】:2016-04-09 01:38:11
【问题描述】:

问题:我想在所有列表项中添加以 % 为单位的 padding-top(因为我需要将文本向下移动一点,并且还需要所有元素都是可伸缩的),@ 987654321@

高度工作正常。为了计算高度,我计算了 li 高度(最初为 40 像素)相对于其父级 ul(即 400 像素)的百分比。 400 像素中的 40 像素 = 10%。在总 ul 高度仍等于 400px 之后,它似乎工作正常。 (盒子的高度是 53.33vw,因为 400px 是 750px 的 53.33%)。

但问题在于以 % 计算 padding-top。 为了计算 padding-top(即 8px),我需要计算 400px 中的 8px(400px 是父级的高度ul) = 2%,和在固定布局中一样,我从高度中减去了这 2%(10%,所以高度现在是 8%)。但在那之后,总的 ul 高度等于 470px。如何以 % 计算 padding-top 以使 ul 的高度仍为 400px?我需要保留 ul 的原始高度 400px,在添加 padding-top 后,ul 的高度变为 470px,这是不正确的。

HTML:

<div class="box">
<ul class="list">
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
<li>Item 6</li>
<li>Item 7</li>
<li>Item 8</li>
<li>Item 9</li>
<li>Item 10</li>
</ul>
</div>

CSS:

body {
    line-height: 1;
}

/* THIS IS MY CODE*/

.box {
    margin:0 auto;
    width:100%;
    max-width:750px;
    height:53.33vw;
    max-height:400px;
}

ul.list {
    padding: 0;
    width:100%;
    height:100%;
    background:green;
    list-style-type:none;
    text-align:center;
    font-size:3vw;
}

ul li:nth-child(odd) {
    height:8%;
    width:interit;
    padding-top:2%;
    background:grey;
}

ul li:nth-child(even) {
    height:8%;
    width:interit;
    padding-top:2%;
    background:red;
}

【问题讨论】:

  • 我不确定我是否掌握了你想要的东西,但你可以试试box-sizing。不管怎样,你知道padding-top 的陷阱吗?

标签: css responsive-design padding scaling responsiveness


【解决方案1】:

CSS box-sizing: border-box; 属性将使宽度最大,其他一切都向内计算。

在狭窄区域与width:100%; 结合使用效果很好

了解更多:https://www.w3schools.com/cssref/css3_pr_box-sizing.asp

【讨论】:

    【解决方案2】:

    这是因为% 中的paddingmargin 是根据width 计算得出的,而不是您希望的height

    来自spec for padding

    与边距属性不同,填充值的值不能为负数。与边距属性一样,内边距属性的百分比值是指生成框的包含块的宽度。

    来自spec for margin

    百分比是根据生成框的包含块的宽度计算的。请注意,“margin-top”和“margin-bottom”也是如此。如果包含块的宽度取决于此元素,则结果布局在 CSS 2.1 中未定义。 这也是在 HTML 中创建纵横比锁定 div 的方法,因为您可以使用带有百分比值的 padding-topwidth 计算 height

    您的解决方案是使用CSS calc,它具有良好的browser support 并以非常简单的方式解决您的问题。这里唯一的缺点是它不会计算% 中的padding-top,但是除非你使用javascript,否则你根本无法从元素的height 计算% 中的padding-top

    如果您不是绝对需要padding-top: 2%;,我会建议以下解决方案。

    你的 CSS 应该是这样的

    ul.list li {
        height: calc(10% - 8px);
        padding-top: 8px;
    }
    

    这将使所有ul.list li 项目的高度为10% - 8px,然后8px 也用作padding-top 的值,这基本上将再次成为完美的10%

    你也可以用不同的风格编写你的选择器,我在这里使用ul.list li作为主要选择器来选择所有li元素,但你有:nth-child(odd):nth-child(even)选择器。

    您在这些选择器上编写了重复的属性,而唯一的区别是它们的 background 属性。

    我强烈建议您尽可能避免重复,因为有时您肯定会忘记更改 both 属性,而是将 CSS 更改为以下内容:

    /*shared properties in a general selector*/
    ul.list li {
        width: inherit;
        height: calc(10% - 8px);
        padding-top: 8px;
        background: grey;
    }
    
    /*if rule is not applied, use ul.list instead of just ul*/
    ul li:nth-child(even) {
        background: red;
    }
    

    这甚至消除了对ul li:nth-child(odd) 的需求,因为它也可以是共享样式的一部分,然后被更具体的ul li:nth-child(even) 选择器覆盖

    另一种方式

    另一种不依赖% 值的方法是使用emrem 值 - 它们通过根据字体大小进行缩放来工作。

    更多阅读

    基本上,rem总是相对于 root element(即 &lt;html&gt; 元素)。

    &lt;html&gt;元素上设置字体大小将定义CSS中1rem的值,如果没有设置font-size,则浏览器默认(通常使用16px)。

    html {
        font-size: 16px; /*1rem is now 16px*/
    }
    

    当您像上面那样定义 font-size 的值是 16px 时,0.5rem 将等于 8px - 为什么这很有趣?它是可扩展的!但通过不同的方式。

    当您现在应用媒体查询并将font-size 更改为更大或更小的值时,使用rem 的所有内容都会按比例缩放(当然,您必须设置&lt;html&gt; 元素的font-size。)

    现在em 有点不同,它与它自己的font-size 相关,但由于此get 自动继承自它的父元素(如果font-size 设置在em 或@ 987654380@ 即)它基本上是相对于父级的。

    如果我们采用最后一个 CSS 示例

    html {
        font-size: 16px; /* 1rem = 16px, 1em = 16px */
    }
    
    body > div { /*every direct div of body tag*/
        font-size: 0.5em; /*8px*/
        font-size: 0.5rem; /*8px*/
    }
    
    body > div > div { /*every second level nested div*/
        font-size: 0.5em; /*4px*/
        font-size: 0.5rem; /*8px*/
    }
    

    基本上,由于em 是相对于它的父大小而言的,所以当您在em 中缩放时,字体大小会减小得更多——这有潜在的危险,因为如果您更改结构并添加一个稍微减小字体的容器-size 在大部分页面上,这可能会产生比您想象的更大的影响。

    除此之外,从技术上讲,emrem 是根据 font-size 属性在元素上缩放 paddingmargin 的最佳方式。

    您的容器示例可能如下所示:

    ul.list li {
        height: 8%;
        padding-top: 0.5rem; /*if font-size is 16px, this will be 8px*/
    }
    

    就可扩展性而言,例如,当您在移动设备上将字体大小更改为其他值时,这将起作用。

    它没有为您的问题提供解决方案,但在谈到可扩展性时,它确实提供了答案和最佳选择,我希望这可以帮助您实现这一目标:)

    【讨论】:

    • 使用'height: calc(10% - 8px);'达到了预期的结果(ul 高度为 400px),谢谢。但是 padding-top 仍然不可扩展。如果一切都是可扩展的,那就太酷了。缩小页面时,8px 仍将保持 8px,而页面的其余部分将缩小。
    • 好的,jQuery 就是答案。如果在 margin-top 和 margin-bottom 中使用 css calc 会像上面的填充示例一样工作吗?
    • @ania_piszko 使用emrem 更新了答案,其中包含一些可扩展性替代方案,其中一些帖子解释了它的工作原理
    • 那些 remem 也可以应用于边框吗?
    • 我的意思是border-top和bodrer-bottom,因为在borers left和right,以及paddingleft和right以及margin left和right,宽度可以以相对于其父级的百分比指定,这是导致探测的顶部和底部
    猜你喜欢
    • 2012-12-01
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 2015-03-25
    • 2017-05-01
    相关资源
    最近更新 更多