文档流、盒子模型、盒子模型——边框、盒子模型——内边距、外边距、水平方向的布局、垂直方向的布局、外边距的折叠、行内元素的盒模型、浏览器的默认样式、盒子大小、阴影和圆角——layout,CSS重点难点

目录

一、文档流

二、盒子模型

三、盒子模型——边框

四、盒子模型——内边距

五、盒子模型——外边距

六、盒子模型——水平方向的布局

七、盒子模型——垂直方向的布局(overflow属性)

八、盒子模型——垂直外边距的折叠(重叠)(兄弟元素、父子元素)

九、行内元素的盒模型(display属性,visiblity属性)

十、浏览器的默认样式

十一、盒子的大小(box-sizing属性)

十二、轮廓阴影和圆角(outline属性、box-shadow属性、border-radius属性)

一、文档流

文档流(normal flow)

        - 网页是一个多层的结构,一层摞着一层

        - 通过CSS可以分别为每一层来设置样式

        - 作为用户只能看到最顶上一层

        - 这些层中,最底下的一层称为文档流,文档流是网页的基础

                我们所创建的元素默认都是在文档流中进行排列

                文档流是一个位置,网页的最底层,所创建的元素默认都是在文档流中进行排列的

                  文档流与元素的关系就像地球与人的关系

        - 对于我们来将元素主要有两个状态

                在文档流中

                不在文档流中(脱离文档流) 

元素在文档流中有什么特点:

        - 块元素

                - 块元素会在页面中独占一行(自上向下排列)

                - 默认宽度是父元素的全部(会把父元素撑满)

                - 默认高度是被内容撑开(子元素)

        - 行内元素

                - 行内元素不会独占页面的一行,只占自身的大小

                - 行内元素在页面中自左向右排列,如果一行之中不能容纳下所有的行内元素

                        则元素会换到第二行继续自左向右排列(书写习惯一致)

                - 行内元素的默认宽度和高度都是被内容撑开              

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .box1{
            width: 100px;
            background-color: yellow;
        }
        .box2{
            width: 100px;
            background-color: red;
        }
    </style>
</head>
<body>
    <div class="box1">我是div1</div>
    <div class="box2">我是div2</div>
    <span>我是span1</span>
    <span>我是span2</span>
</body>
</html>

二、盒子模型

盒模型、盒子模型、框模型(box model)

        - CSS将页面中的所有元素都设置为一个矩形的盒子

        - 将元素设置为矩形的盒子后,对页面的布局就变成将不同的盒子摆放到不同的位置

        - 每一个盒子都由以下几个部分组成:

                内容区(content)

                内边距(padding)

                边框(border)

                外边距(margin)

内容区(content),元素中的所有子元素和文本内容都在内容区中排列

        内容区的大小由width 和 height 两个属性来设置

                width 设置内容区的宽度

                height 设置内容区的高度

三、盒子模型——边框

边框(border), 边框属于盒子边缘,边框里边属于盒子内部,出了边框都是盒子的外部 

  边框的大小会影响到整个盒子的大小

        设置边框,需要至少三个样式:

                边框的宽度  border-width   默认值,一般都是3个像素

                边框的颜色 border-color  默认值,color颜色值

                边框的样式 border-style  默认值,none,表示没有边框

border-width 可以用来指定四个方向的边框的宽度

        值的情况:

                四个值:上 右 下 左

                三个值:上 左右 下 

                两个值:上下  左右

                一个值:上下左右

除了border-width 还有一组 border-xxx-width

        xxx可以是 top  right  bottom  left  用来单独指定某一个边的宽度

border-color 用来指定边框的颜色,同样可以分别指定四个边的颜色

        规则和border-width一样

        border-color 也可以省略不写,如果省略了则自动使用color颜色值

border-style 指定边框的样式,规则与border-width一样,默认值是none,表示没有边框

        solid 表示实线

        dotted 点状虚线

        dashed 虚线

        double 双线

border简写属性,通过该属性可以同时设置边框所有的相关样式,并且没有顺序要求

除了border以外还有四个 border-xxx

        border - top

        border - right

        border - bottom

        border - left        

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .box1{
            /* width 设置内容区的宽度, height 设置内容区的高度 */
            width: 200px;
            height: 200px;
            background-color: #bfa;
            /*设置边框,需要至少三个样式:边框的宽度  border-width,边框的颜色 border-color
            ,边框的样式 border-style */
            /* border-width: 10px;可以不写,有默认值,一般是3px */
            /* border-width: 10px 20px 30px 40px;
            border-width: 10px 30px 40px;
            border-width: 10px 20px; 
            border-top-width:10px;*/
            /* border-color: red;
            border-style: double; */
            /* border: 10px solid orange; */
            /* 设置三个边框 */
            /* border-top: 10px solid red;
            border-left: 10px solid red;
            border-bottom: 10px solid red; */
            border: 10px solid red;
            border-right: none;
        }       
    </style>
</head>
<body>
    <div class="box1"></div>
</body>
</html>

四、盒子模型——内边距

内边距(padding)

        - 内容区和边框之间的距离是内边距

        - 一共右四个方向的内边距:

                padding - top

                padding - right

                padding - bottom

                padding - left

        - 内边距的设置会影响盒子的大小

        - 背景颜色会延伸到内边距上

一个盒子的可见框的大小由内容区 内边距  边框共同决定

        所以在计算盒子的大小时,需要将这三个区域加到一起计算

padding 是内边距的简写属性,可以同时指定四个方向的内边距

        规则和border-width 一样

注意:如果盒子本身没有指定 width/height 属性,则此时padding 不会撑开盒子大小。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .box1{
            width: 200px;
            height: 200px;
            background-color: #bfa;
            border: 10px solid orange;
            padding-top: 100px;
            padding-left:100px ;
            padding-bottom: 100px;
            padding-right: 100px;
        }     
        .inner{
            width: 100%;
            height: 100%;
            background-color: yellow;
        }  
    </style>
</head>
<body>
    <div class="box1">
        <div class="inner"></div>
    </div>
</body>
</html>

五、盒子模型——外边距

外边距(margin)

        - 外边距不会影响盒子可见框的大小

        - 但是外边距会影响盒子的位置

        - 一个有四个方向的外边距:

                margin - top

                        -上外边距,设置一个正值,元素会向下移动

                margin - right

                        - 默认情况下设置margin-right不会产生任何移动

                margin - bottom 

                        - 下外边距,设置一个正值,其下边的元素会向下移动

                margin - left

                        - 左外边距,设置一个正值,元素会向右移动

                margin 也可以设置负值,若为负值则元素会向相反的方向移动

        - 元素在页面中是按照自左向右的顺序排列的,

                所以默认情况下如果我们设置左和上外边距则会移动元素自身

                而设置下和右外边距会移动其它元素

        - margin 简写属性

                margin 可以同时设置四个方向的外边距,用法与padding一样

        - margin 会影响到盒子实际占用空间

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .box1{
            width: 200px;
            height: 200px;
            background-color: #bfa;
            border: 10px solid orange;
            margin-top: 100px;
            margin-bottom: 100px;
        }     
        .box2{
            width: 220px;
            height: 220px;
            background-color: yellow;
            margin-top: -50px;
        } 
    </style>
</head>
<body>
    <div class="box1">
    </div>
    <div class="box2"></div>
</body>
</html>

六、盒子模型——水平方向的布局

元素的水平方向的布局:

        元素在其父元素中水平方向的位置由以下几个属性共同决定

                margin-left

                border-left

                padding-left

                width

                padding-right

                border-right

                margin-right

        一个元素在其父元素中,水平布局必须满足以下的等式 :

margin-left +  border-left + padding-left + width + padding-right + border-right +margin-right  = 其父元素内容区的宽度(必须满足)

  以上等式必须满足,如果相加结果使等式不成立,则称为过度约束,则等式会自动调整     

        - 调整的情况:

                - 如果七个值中没有 auto 的情况,则浏览器会自动调整margin-right 值以使等式满足

                - 这七个值中有三个值可以设置为auto:

                        width

                        margin-left

                        margin-right

                        - 如果某个值为auto,则会自动调整为auto的那个值以使等式成立   

                        - 如果将一个宽度和一个外边距设置为auto,则宽度会调整到最大,设置为auto的外边距会自动为0

                        - 如果将三个值都设置为auto,则宽度最大,外边距都是0

                        - 如果将两个外边距设置auto,宽度为固定值,则会将外边距设置为相同的值

                                所以我们经常利用这个特点,来使一个元素在其父元素中水平居中

                                        示例:width: xxx px;

                                                   margin: 0 auto;

        外边距典型应用,让块级盒子水平居中,但必须满足两个条件:

                1.盒子必须指定了宽度(width)。

                2. 盒子左右的外边距都设置为 auto。

        注意:行内元素或者行内块元素水平居中给其父元素添加 text-align:center 即可

注意:width 默认值就是auto  

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .outter{
            width: 800px;
            height: 200px;
            border: 10px solid red;
        }
        .inner{
            width: 200px;
            height: 200px;
            background-color: #bfa;
            margin-right: 100px;
            /* 0 + 0 + 0 + 200 + 0 + 0 + 0 = 800 不相等
            以上等式必须满足,,如果相加结果使等式不成立,则称为过度约束,则等式会自动调整  
            0 + 0 + 0 + 200 + 0 + 0 + 600 = 800 */            
        }
    </style>
</head>
<body>
    <div class="outter">
        <div class="inner"></div>
    </div>
</body>
</html>

七、盒子模型——垂直方向的布局(overflow属性)

默认情况下,父元素的高度被内容撑开

子元素是在父元素的内容区中排列的

        如果子元素的大小超过了父元素,则子元素会从父元素中溢出,

        使用 overflow 属性来设置父元素如何处理溢出的子元素(overflow设置在父元素上)

                可选值:

                visible  默认值  子元素会从父元素中溢出,在父元素外部的位置显示

                hidden 溢出的内容将会被裁剪不会显示

                scroll  生成两个滚动条,通过滚动条来查看完整的内容

                auto  根据需要生成滚动条

        overflow-x

        overflow-y

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .outter{
            background-color: #bfa;
        }
        .inner{
            width: 100px;
            background-color: yellow;
            height: 200px;
            margin-bottom: 100px;                  
        }
        .box1{
            width: 200px;
            height: 200px;
            background-color: #bfa;
            overflow: auto;
        }
        .box2{
            width: 100px;
            height: 400px;
            background-color: orange;            
        }
    </style>
</head>
<body>
    <!-- <div class="outter">
        <div class="inner"></div>
        <div class="inner"></div>
    </div> -->
    <div class="box1">
        <div class="box2"></div>
    </div>
</body>
</html>

八、盒子模型——垂直外边距的折叠(重叠)(兄弟元素、父子元素)

垂直外边距的重叠(折叠)

        - 相邻的垂直方向外边距会发生重叠现象

        - 兄弟元素

                - 兄弟元素间的相邻垂直外边距会取两者之间的较大值(两者都是正值)

                - 特殊情况:

                        如果相邻外边距一正一负,则取两者的和

                        如果相邻外边距都是负值,则取两者中绝对值较大的

                - 兄弟元素之间的外边距的重叠,对于开发是有利的,所以我们不需要进行处理

        - 父子元素

                - 父子元素之间的相邻外边距,子元素的会传递给父元素(上外边距)

                - 父子外边距的折叠会影响到页面的布局,必须要进行处理

                目前处理方式:不用外边距(使用padding,注意盒子大小);使用特殊方式将外边距进行隔开(如使用border,同样注意盒子大小)

兄弟元素的垂直外边距折叠:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .box1,.box2{
            width: 200px;
            height: 200px;
        }
        .box1{
            background-color: #bfa;
            margin-bottom: 100px;
        }
        .box2{
            background-color: orange;
            margin-top: -100px;
        }
    </style>
</head>
<body>
    <div class="box1"></div>
    <div class="box2"></div>
</body>
</html>

父子元素垂直外边距的折叠:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .box3{
            width: 200px;
            height: 199px;
            background-color: #bfa;
            /* padding-top: 100px; */
            border-top: solid 1px red;
        }
        .box4{
            width: 100px;
            height: 100px;
            background-color: orange;
            margin-top: 99px;
        }
    </style>
</head>
<body>
    <div class="box3">
        <div class="box4"></div>
    </div>
</body>
</html>

九、行内元素的盒模型(display属性,visiblity属性)

行内元素的盒模型

        - 行内元素不支持设置宽度和高度

        - 行内元素可以设置padding,但是垂直方向padding不会影响页面的布局

        - 行内元素可以设置border,垂直方向的border不会影响页面的布局

        - 行内元素可以设置margin,垂直方向的margin不会影响布局,且水平方向的margin不会折叠

display 用来设置元素显示的类型

        可选值:

                inline  将元素设置为行内元素

                block  将元素设置为块元素

                inline-block  将元素设置为行内块元素

                        行内块,既可以设置宽度和高度又不会独占一行

                        若两个相邻行内块在页面显示时可能会出现间隙,因为行内元素换行会被作为一个空格

                table 将元素设置为一个表格

                none 元素不在页面中显示,不会占据页面的位置

visibility  用来设置元素的显示状态

        可选值:

                visible 默认值,元素在页面中正常显示

                hidden 元素在页面中隐藏不显示,但是依然占据页面的位置

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .s1{
            background-color: yellow;
            width: 100px;
            height: 100px;
            /* padding: 100px;
            border: 10px red solid;
            margin: 100px; */
        }
        .box1{
            width: 200px;
            height: 200px;
            background-color: #bfa;
        }
        a{
            background-color: orange;
            width: 100px;
            height: 100px;
            /* display: none; */
            visibility: hidden;
        }
    </style>
</head>
<body>
    <!-- 这样书写,当a被设置为display:inline-block时,会出现间隙 -->
    <a href="javascript:;">超链接</a>
    <a href="javascript:;">超链接</a>
    <!-- 下面这样便不会出现间隙 -->
    <a href="javascript:;">超链接</a><a href="javascript:;">超链接</a>
    <span class="s1">我是span</span>
    <div class="box1"></div>
</body>
</html>

十、浏览器的默认样式

默认样式:

        -通常情况下,浏览器都会为元素设置一些默认样式

        - 默认样式的存在会影响到页面的布局,

                通常情况下编写网页时必须要去除浏览器的默认样式(PC端)

list-style 属性,设置项目符号的风格,如列表的符号,属性值为none时表示没有符号

直接利用通配选择器简单将所有的margin和padding设置为0去去除默认样式(适用临时练习)

    <style>
        *{
            margin: 0;
            padding: 0;
        }
    </style>

或者引入重置样式表去除浏览器默认样式

重置样式表,专门用来对浏览器的样式进行重置的

        reset.css  直接去除了浏览器的默认样式(老师更推荐)

        normalize.css  为默认样式进行了统一             

reset.css 重置样式表 可以去CSS Tools: Reset CSS (meyerweb.com)  进行复制,创建一个css文件粘贴进去即可

十一、盒子的大小(box-sizing属性)

默认情况下,盒子可见框的大小由内容区、内边距和边框共同决定

box-sizing 属性  用来设置盒子尺寸的计算方式(设置width 和 height 的作用)

        可选值:

                content-box    默认值,宽度和高度用来设置内容区的大小

                border-box   宽度和高度用来设置整个盒子可见框的大小

                                width 和 height 指的是内容区 和 内边距 和 边框的总大小

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .box1{
            width: 100px;
            height: 100px;
            background-color: #bfa;
            padding: 10px;
            border: 10px red solid;
            /* box-sizing: content-box; */
            box-sizing: border-box;
        }
    </style>
</head>
<body>
    <div class="box1"></div>
</body>
</html>

calc 函数(了解)

calc()  此CSS函数让你在声明CSS属性值时执行一些计算。

         width: calc(100% - 80px)

        括号里面可以使用 + 、-、*、/ 来进行计算。

   在CSS函数中,运算符左右必须空格!否则用不了

    <style>
        .father {
            width: 300px;
            height: 200px;
            background-color: pink;
        }
        .son {
            /* 运算符左右必须空格!否则用不了 */
            width: calc(100% - 30px);
            height: 100px;
            background-color: #bfa;
        }
    </style>
</head>
<body>
    <!-- 需求:子盒子宽度永远比父盒子小 30 像素 -->
    <div class="father">
        <div class="son"></div>
    </div>
</body>

十二、轮廓阴影和圆角(outline属性、box-shadow属性、border-radius属性)

outline 用来设置元素的轮廓线,用法和border一模一样

        轮廓和边框不同的点,就是轮廓不会影响可见框的大小,不会影响页面布局

box-shadow  用来设置元素的阴影效果,阴影不会影响页面布局

        第一个值   水平偏移量  设置阴影的水平位置   正值向右移动,负值向左移动

        第二个值   垂直偏移量  设置阴影的垂直位置   正值向下移动,负值向上移动

        第三个值   阴影的模糊半径  值越大越模糊

        第四个值   阴影的颜色,一般使用 rgba ,能指定透明度

        默认情况下,阴影与元素一样大,在元素的正下方,为了能看见阴影,需指定两个偏移量

        注意:盒子阴影不占用空间,不会影响其他盒子排列。

border-radius 属性  用来设置圆角,圆角设置的圆的半径大小

        可以分别指定四个角的圆角

        四个值    左上  右上  右下  左下(顺时针)

        三个值    左上    右上/左下  右下

        两个值    左上/右下   右上/左下

        一个值    为四个角的半径大小均为该值

        当想用椭圆时,水平方向和垂直方向的半径用斜杠 / 隔开

        将元素设置为圆形,盒子为正方形: border-radius:50%

border-top-left-radius   设置左上角的圆角,当给一个属性值时,为圆角

             给两个属性值时为椭圆,且第一个值为水平方向的圆的半径大小,第二个值为垂直方向的

border-top-right-radius

border-bottom-left-radius

border-bottom-right-radius

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .box1{
            width: 200px;
            height: 200px;
            background-color: #bfa;
            /* border: 10px red solid; */
            /* outline: 10px red solid; */
            box-shadow:10px 10px 50px rgba(0,0,0,0.5) ;
        }
        .box2{
            width: 200px;
            height: 200px;
            background-color: orange;           
            border-radius: 10px / 100px 20px 30px;
            /* 将元素设置为圆形 */
            border-radius:50%
            /* border-top-left-radius:50px 100px;
            border-top-right-radius:50px 100px ;
            border-bottom-left-radius:100px 50px ;
            border-bottom-right-radius: 20px; */
        }
    </style>
</head>
<body>
    <div class="box1"></div>
    <span>hello</span>
    <div class="box2"></div>
</body>
</html>

疑难解惑:

1. 布局为啥用不同的盒子,我只想用div?

        标签都是有语义的,合理的地方用合理的标签。比如产品标题就用 h,大量文字段落就用 p。

2. 为啥用那么多类名?

        类名就是给每个盒子起了一个名字,可以更好的找到这个盒子,选取盒子更容易,后期维护也方便。

3. 到底用 margin 还是 padding ?

        大部分情况两个可以混用,两者各有优缺点,但是根据实际情况,总有更简单的方法实现。
4. 自己做没思路?

        布局有很多实现方式,可以开始模仿老师的写法,然后再做出自己的风格。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值