问题:我想在所有列表项中以%添加padding-top(因为我需要将文本向下移一点,并且还需要所有元素都可伸缩),这是jsfiddle代码
高度正常。为了计算高度,我计算了li高度(最初为40px)相对于其父级ul(400px)的百分比。400像素中的40像素= 10%。在总ul高度仍等于400px之后,似乎工作正常。(盒子的高度为53.33vw,因为400px是750px的53.33%)。
但是问题在于以百分比计算填充顶部。为了计算padding-top(8px),我需要计算400px中的8px(400px是父ul的高度)= 2%,并且在固定布局中,我从高度中减去了2%(所以10%高度现在为8%)。但是之后,总ul高度等于470px。如何以百分比计算padding-top,以使ul的高度仍为400px?我需要保留那些400像素,这是ul的原始高度,在以%添加padding-top之后,ul的高度变为470像素,这是不正确的。
HTML:
- Item 1
- Item 2
- Item 3
- Item 4
- Item 5
- Item 6
- Item 7
- Item 8
- Item 9
- Item 10
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; }
SidOfc.. 5
这是因为,padding
和margin
在%
会从计算的width
,而不是height
你的愿望。
从填充规范
与边距属性不同,填充值的值不能为负。与边距属性一样,填充属性的百分比值是指生成的框的包含块的宽度。
从保证金的规格
相对于生成的框的包含块的宽度计算百分比。请注意,“ margin-top”和“ margin-bottom”也是如此。如果包含块的宽度取决于此元素,则结果布局在CSS 2.1中未定义。这也是如何创建HTML中的纵横比锁定div的,因为你可以计算出
height
从width
使用padding-top
一个百分比值。
一种解决方案是使用CSS calc,它具有良好的浏览器支持,并以非常简单的方式解决了您的问题。唯一的缺点是,它不会计算padding-top
in,%
但是您根本无法根据元素的padding-top
in %
进行计算,height
除非您使用javascript。
如果你不绝对需要的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)
and :nth-child(even)
选择器。
您在这些选择器上写了重复的属性,而唯一的区别是它们的background
属性。
我强烈建议您尽可能避免重复,因为您肯定会忘记有时更改两个属性,而将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)
。
替代依赖%
值的另一种方法是使用em
或rem
值-它们通过基于字体大小进行缩放来工作。
更多阅读
Web设计基础Rem-vs-em-vs-px尺寸调整元素在CSS中
ems具有比例媒体查询-ftw
埃姆斯雷姆斯
困惑的回忆
基本上,rem
是始终相对于root element
它是元件。
在元素上设置字体大小将定义
1rem
CSS中的值,如果未font-size
设置,则使用浏览器默认值(通常16px
会使用)。
html { font-size: 16px; /*1rem is now 16px*/ }
当您font-size
使用值16px
then 定义上面的like时0.5rem
将等于8px
-为什么这很有趣?可伸缩!但是通过不同的方式。
现在,当您申请一个媒体查询和改变font-size
的东西大或变小,使用一切rem
都会按比例缩放(你必须设置font-size
的的元素ofcourse)。
现在em
有点不同,它是相对于它自己的,font-size
但是由于此get是自动从其父元素继承而来的(如果font-size
在em
或%
中设置),它基本上是相对于父元素的。
如果我们以最后一个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
-这是潜在的危险,因为如果更改结构并在大多数页面上添加一个会稍微减小字体大小的容器,这可能具有比您想象的更大的效果。
从技术上来讲em
,这rem
是根据属性缩放padding
和margin
处理元素的最佳方法font-size
。
您的容器的示例如下所示:
ul.list li { height: 8%; padding-top: 0.5rem; /*if font-size is 16px, this will be 8px*/ }
在可伸缩性方面,例如,当您将字体大小更改为移动设备上的其他大小时,这将起作用。
它不能为您的问题提供解决方案,但可以为您提供有关扩展性的答案和最佳选择,希望此对您有所帮助:)
这是因为,padding
和margin
在%
会从计算的width
,而不是height
你的愿望。
从填充规范
与边距属性不同,填充值的值不能为负。与边距属性一样,填充属性的百分比值是指生成的框的包含块的宽度。
从保证金的规格
相对于生成的框的包含块的宽度计算百分比。请注意,“ margin-top”和“ margin-bottom”也是如此。如果包含块的宽度取决于此元素,则结果布局在CSS 2.1中未定义。这也是如何创建HTML中的纵横比锁定div的,因为你可以计算出
height
从width
使用padding-top
一个百分比值。
一种解决方案是使用CSS calc,它具有良好的浏览器支持,并以非常简单的方式解决了您的问题。唯一的缺点是,它不会计算padding-top
in,%
但是您根本无法根据元素的padding-top
in %
进行计算,height
除非您使用javascript。
如果你不绝对需要的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)
and :nth-child(even)
选择器。
您在这些选择器上写了重复的属性,而唯一的区别是它们的background
属性。
我强烈建议您尽可能避免重复,因为您肯定会忘记有时更改两个属性,而将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)
。
替代依赖%
值的另一种方法是使用em
或rem
值-它们通过基于字体大小进行缩放来工作。
更多阅读
Web设计基础Rem-vs-em-vs-px尺寸调整元素在CSS中
ems具有比例媒体查询-ftw
埃姆斯雷姆斯
困惑的回忆
基本上,rem
是始终相对于root element
它是元件。
在元素上设置字体大小将定义
1rem
CSS中的值,如果未font-size
设置,则使用浏览器默认值(通常16px
会使用)。
html { font-size: 16px; /*1rem is now 16px*/ }
当您font-size
使用值16px
then 定义上面的like时0.5rem
将等于8px
-为什么这很有趣?可伸缩!但是通过不同的方式。
现在,当您申请一个媒体查询和改变font-size
的东西大或变小,使用一切rem
都会按比例缩放(你必须设置font-size
的的元素ofcourse)。
现在em
有点不同,它是相对于它自己的,font-size
但是由于此get是自动从其父元素继承而来的(如果font-size
在em
或%
中设置),它基本上是相对于父元素的。
如果我们以最后一个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
-这是潜在的危险,因为如果更改结构并在大多数页面上添加一个会稍微减小字体大小的容器,这可能具有比您想象的更大的效果。
从技术上来讲em
,这rem
是根据属性缩放padding
和margin
处理元素的最佳方法font-size
。
您的容器的示例如下所示:
ul.list li { height: 8%; padding-top: 0.5rem; /*if font-size is 16px, this will be 8px*/ }
在可伸缩性方面,例如,当您将字体大小更改为移动设备上的其他大小时,这将起作用。
它不能为您的问题提供解决方案,但可以为您提供有关扩展性的答案和最佳选择,希望此对您有所帮助:)