概念 - 盒模型阴影、圆角、轮廓、怪异盒模型、margin外边距问题处理

182 阅读4分钟

概念 - 盒模型属性

盒子阴影 box-shadow

属性值说明
horizen-shadow必需,水平阴影的位置,允许负值
vertical-shadow必需,垂直阴影的位置,允许负值
blur可选,模糊距离
spread可选,阴影大小
color可选,阴影颜色
insert可选,阴影显示在盒子里面

box-shadow盒子阴影.png

盒子圆角边框 border-radius

/* 四角同时设置 */
.box1{
    border-radius: 15px; 
}
.box2{
    border-radius: 10px 20px;
}
.box3{
    border-radius: 5px 20px 10px;
}
.box4{
    border-radius: 5px 30px 20px 15px;
}
.box5,.box6,.box7,.box8{
    margin: 50px 0;
}
/* 单独设置其中一个角 */
.box5{
    border-top-left-radius:20px;
}
.box6{
    border-top-right-radius: 20px;
}
.box7{
    border-bottom-right-radius: 20px;
}
.box8{
    border-bottom-left-radius: 20px;
}

盒子圆角边框.png

盒子轮廓 outline

轮廓(outline)是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用。在浏览器里,当鼠标点击或使用Tab键让一个链接或者一个input表单获得焦点的时候,该元素将会被一个轮廓线围绕。这个轮廓线框就是 outline

属性属性值说明
outlineoutline:<outline-color> <outline-style> <outline-width> / inherit;简写属性,在一个声明中设置所有的轮廓属性
outline-style设置轮廓的样式none dotted dashed solid double groove ridge inset outset inherit
outline-width设置轮廓的宽度thin medium thick length inherit

outline与border.png

*{outline: green dashed thin;}

outline.png

  • 轮廓(outline)与边框(border)的区别
    1. border 可应用于几乎所有有形的 html 元素,而 outline 是针对链接、表单控件和 ImageMap 等元素设计
    2. outline 的效果将随元素的 focus 而自动出现,相应的由 blur 而自动消失。这些都是浏览器的默认行为,无需 JavaScript 配合 CSS 来控制
    3. border 属性是盒模型的一部分,用于指定元素边框的样式、宽度和颜色,占据空间,但 outline 是不占空间的,不会像 border 那样影响元素的尺寸或者位置,既不会增加额外的 width 或者 height(这样不会导致浏览器渲染时出现 reflow 或是 repaint)
    4. outline 是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用
    5. outline 属性的轮廓线四个方向都是一样的,但border可以指定某条边设置不一样
    6. outline 属性的外轮廓线是闭合的,不允许只设置某一边
    7. outline 创建的轮廓线可以向内扩展(将outline-offset设置为负值),而border只能向内

盒子阴影和圆角边框实例

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
    <style>
        .container{
            width: 300px;
            height: 25px;
            border: 1px solid lightgray;
            padding: 5px;
            /* 两个阴影属性,用逗号隔开 */
            box-shadow: 0 3px 0px lightgray,0 5px 2px gray;
            display: flex;
            justify-content: space-around;
            border-radius: 5px;
        }
        .search_box,.search_submit{
            flex-grow: 1;
            border-radius: 8px;
            border: 1px solid lavender;
        }
        .search_box{
            outline: none;  /* 去掉input选中时候默认会出现的黑边 */
            text-indent: 10px; /* 将input框内的文本缩进一点 */
            margin-right: 8px;
        }
    </style>
</head>
<body>
    <form action="#" method="post" class="container">
        <input type="search" class="search_box" list="search_list" name="search_web" placeholder="Search for CSS3, HTML5...">
        <datalist id="search_list">
            <option value="CSS3 Structure">
            <option value="HTML5 Structure">
            <option value="JavaScript Structure">
        </datalist>
        <input type="submit" class="search_submit" value="GO">
    </form>    
</body>
</html>

盒子阴影及圆角边框.png

对比 - 标准盒模型VS怪异盒模型

两者区别

  • CSS盒模型本质是一个盒子,由margin、border、padding、content组成

  • CSS盒模型分为两种:标准盒模型、IE盒模型(也称为怪异盒模型),区别在于他们的总宽度的计算方式不同。 在文档首部加了 <!Doctype html> 声明,即使用标准盒模型,若不加,则会由浏览器自己决定。

  • 标准盒模型

    标准盒模型(width=content).png

  • 怪异盒模型

    怪异盒模型(width=border+padding+content).png

关键代码

.box1{
    box-sizing: border-box;  /* 怪异盒模型 */
}
.box2{
    box-sizing: content-box; /* 标准盒模型 */
}

技巧 - 盒子模型中margin外边距特性问题

问题痛点

HTML文档中的每个盒子都可以看成是由从内到外的四个部分构成,即内容区(content)、填充(padding)、边框(border)和空白边(margin)。盒子模型中,margin常常会遇到两个特性问题:

  1. 兄弟关系,两个盒子垂直外边距与水平外边距问题
    • 垂直方向上,取最大值
    • 水平方向上,合并处理
  2. 父子关系,给子元素加margin上下外边距,但作用于父元素

margin特性问题1.png

margin特性问题2:子元素margin外边距异常.gif

关键代码 - 特性问题2的解决办法

/* 方法1:不设置子元素.childbox的margin-top,
    而设置父元素.parentbox的padding-top,注意高度计算 */
.parentbox{ padding-top:30px; }

/* 方法2:给父元素.parentbox设置边框,可设置透明色,注意高度计算*/
.parentbox{ border:1px dashed transparent; }
.childbox{ margin-top:30px; }

/* 方法3:给父元素.parentbox设置flex*/
.parentbox{ display:flex; }
.childbox{ margin-top:30px; }

/* 方法4:给父元素或子元素设置float */
.parentbox{ float:left; } 或 .childbox{ float:left; }
.childbox{ margin-top:30px; }

/* 方法5:给父元素设置overflow:hidden; */
.parentbox{ overflow:hidden; }
.childbox{ margin-top:30px; }

特性问题2的解决办法.png