width: 100%,padding与 box-sizing

=在W3School里面的CSS box-sizing属性中,我们可以看到box-sizing的定义如下:

这里写图片描述

我们通过例子来详细地讲诉一下width:100%和padding结合起来使用可能会带来的问题及如何用box-sizing解决。
我们新建两个div, 让第二个嵌在第一个里面。

HTML代码:

<div class="firstDiv" sand>
  <div class="secondDiv">
    div2
  </div>
</div>

CSS代码:

.firstDiv
{
  width: 100px;
  height: 100px;
  background-color: red;
}

.secondDiv
{
  width: 100%;
  height: 80px; 
  background-color: yellow;
}

效果图:
这里写图片描述

接下来我们想让第二个div中的文字的左边空出20px, 即设置padding-left: 20px.

CSS代码:

.secondDiv
{
  width: 100%;
  padding-left: 20px;
  height: 80px;
  background-color: yellow;
}

效果图:
这里写图片描述

我们可以看到,设置了padding之后,第二个div的宽度也随着变化了,但是我们设置的宽度明明是100%,即应该和第一个div的宽度是一样的,这是为什么呢?这是因为我们没有设置box-sizing的值,所以它用的是默认值content-box。content-box的定义为宽度和高度分别应用到元素的内容框。所以在刚才的例子中,width:100%即100px是内容框的宽度,div实际的宽度应该加上刚才设置的padding-left的值20px, 总共为120px。正如我们看到的,第二个div的宽度比第一个还要大。

那我们怎样才能既加上padding, 又不增加宽度呢?一种方法是将div的宽度从100%改为80px,第二种就是设置box-sizing为border-box。border-box决定了为元素设定的宽度和高度是元素的边框盒的宽度和高度, 即为元素指定的任何内边距padding和边框border都将在已设定的宽度和高度内进行绘制。而第二种是比较常用的方法。

CSS代码:

.secondDiv
{
  width: 100%;
  padding-left: 20px;
  box-sizing: border-box;
  -moz-box-sizing: border-box; /* Firefox */
  -webkit-box-sizing: border-box; /* Safari */
  height: 80px;
  background-color: yellow;
}

效果图:
这里写图片描述

为了适应各个浏览器的需求,我们需要额外设置-moz-box-sizing和-webkit-box-sizing的值也为border-box。

自己动手试试吧: box-sizing Example on JSFiddle

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
帮我优化以下代码<style> * { box-sizing: border-box; } .row::after { content: ""; clear: both; display: table; } [class*="col-"] { float: left; padding: 15px; } html { font-family: "Lucida Sans", sans-serif; } .header { background-color: #0603F7; color: #ffffff; padding: 3px; } .menu ul { list-style-type: none; margin: 0; padding: 0; } .menu li { padding: 8px; margin-bottom: 7px; background-color: #33b5e5; color: #ffffff; box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); } .menu li:hover { background-color: #F59B06; } .aside { background-color: #33b5e5; padding: 15px; color: #ffffff; text-align: center; font-size: 14px; box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); } .footer { background-color: #0099cc; color: #ffffff; text-align: center; font-size: 12px; padding: 15px; } /* For mobile phones: */ [class*="col-"] { width: 100%; } @media only screen and (min-width: 600px) { /*小屏幕 */ .col-s-1 {width: 8.33%;} .col-s-2 {width: 16.66%;} .col-s-3 {width: 100%;} .col-s-4 {width: 33.33%;} .col-s-5 {width: 41.66%;} .col-s-6 {width: 75%;} .col-s-7 {width: 58.33%;} .col-s-8 {width: 66.66%;} .col-s-9 {width: 100%;} .col-s-10 {width: 83.33%;} .col-s-11 {width: 91.66%;} .col-s-12 {width: 100%;} } @media only screen and (min-width: 768px) { /*大屏幕*/ .col-1 {width: 8.33%;} .col-2 {width: 16.66%;} .col-3 {width: 100%;} .col-4 {width: 33.33%;} .col-5 {width: 41.66%;} .col-6 {width: 100%;} .col-7 {width: 58.33%;} .col-8 {width: 66.66%;} .col-9 {width: 75%;} .col-10 {width: 83.33%;} .col-11 {width: 91.66%;} .col-12 {width: 100%;} } </style>
05-30
首先,这段代码已经非常简洁了,但还是有一些优化空间: 1. 将重复的样式提取出来,避免重复书写。例如,可以将 `.menu li` 和 `.aside` 中的 `background-color`,`box-shadow`,`color` 和 `padding` 提取出来,作为一个公共的样式类,再在需要使用的地方加上该样式类即可。 2. 可以考虑使用 CSS 预处理器来编写样式,例如 Sass 或 Less,可以更加简洁、易读、易维护。 3. 可以将媒体查询中的重复代码提取出来,避免重复书写。例如,可以将 `.col-s-*` 和 `.col-*` 中的宽度设置提取出来,再在媒体查询中加上相应的样式即可。 4. 对于类名中的数字,可以考虑使用循环语句生成,避免重复书写。 以下是优化后的代码: ``` <style> * { box-sizing: border-box; } .row::after { content: ""; clear: both; display: table; } .common-style { background-color: #33b5e5; color: #ffffff; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); padding: 15px; } .header { background-color: #0603F7; color: #ffffff; padding: 3px; } .menu ul { list-style-type: none; margin: 0; padding: 0; } .menu li { padding: 8px; margin-bottom: 7px; box-shadow: none; } .menu li:hover { background-color: #F59B06; } .aside { text-align: center; font-size: 14px; } .aside-common { width: 100%; } .footer { background-color: #0099cc; color: #ffffff; text-align: center; font-size: 12px; padding: 15px; } /* For mobile phones: */ [class*="col-"] { width: 100%; } @for $i from 1 through 12 { $width: percentage($i / 12); .col-s-#{$i} { width: $width; } @media only screen and (min-width: 600px) { .col-#{$i} { width: $width; } } } .col-s-3, .col-s-9 { width: 100%; } @media only screen and (min-width: 768px) { .col-s-6 { width: 75%; } .col-s-7 { width: 58.33%; } .col-s-8 { width: 66.66%; } .col-s-10 { width: 83.33%; } .col-s-11 { width: 91.66%; } .col-3 { width: 100%; } .col-6 { width: 100%; } .col-9 { width: 75%; } } </style> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值