HTML5+CSS3学习笔记(三)文档流和盒子模型【附练习:图片列表、左侧导航栏】

HTML5+CSS3学习笔记(三)

本系列更多文章,可以查看专栏 HTML+CSS学习笔记



一、CSS布局

1. 文档流(块级元素、行内元素、行内块元素)

部分内容参考博客常用的块级元素(block)、行内元素(inline)以及行内块元素(inline-block)的解析

元素类型特点常见标签
块级元素1.独占网页一行,自上至下垂直排列 div、p、h1~h6、ul、ol、dl、li、dd、 table、hr、blockquote、address、menu、pre、 HTML5新增的header、section、aside、footer
2.默认宽度由父元素宽度决定
3.默认高度由内容撑开(子元素)
行内元素1.不会独占一行,只占自身的大小 span、img、a、lable、input、abbr(缩写)、em(强调)big、cite(引用)、i (斜体)、q(短引用)、textarea、select、small、sub、sup、strong、u(下划线)、button(默认display:inline-block)
2.自左向右水平排序,若不能容纳所有行内元素
则在第二行自左向右水平排序
3.默认高度由内容撑开(子元素)

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

以下图片来源于盒子模型 / 框模型
框模型/盒子模型

  • 所有元素均为 矩形 盒子
  • 盒子的可见区域大小 内容区 ( c o n t e n t ) 、边界 ( b o r d e r ) 、内边距 ( p a d d i n g ) \color{#FF3030}{内容区(content)、边界(border)、内边距(padding)} 内容区(content)、边界(border)、内边距(padding)所决定【此时,box-sizing属性值默认为content-box】
  • 盒子的位置 外边距 ( m a r g i n ) \color{#FF3030}{外边距(margin)} 外边距(margin)所决定
  • 若box-sizing值为border-box,则width和height直接决定盒子可见区域大小。

1. 内容区(content)

  • width: 决定内容区的宽度
  • height: 决定内容区的高度

2. 边框 / 边界(border)

对于边框,边框宽度(border-width)、边框样色(border-color)、边框样式(border-style) 缺一不可

  • border-width: 设置边框宽度
  • border-color: 设置边框颜色
  • border-style: 设置边框样式
  • border:可用此一个属性同时设置以上三种属性,三个值不区分顺序,只需填入边框宽度、颜色和样式即可。
  • 例如:border:10px blue solid;

(1)边框宽度(border-width)

实际上存在四个方向上边框宽度的设置,包括: border-top-width(上)、border-right-width(右)、border-bottom-width(下)、border-left-width(左)

以下表格对border-width属性值,进行具体说明

属性值类型含义示例备注
1.未设置此属性值时一般默认为3px
2.一个属性值时默认对上、右、下、左,四个方向的边框宽度进行设置border-width:10px;相当于上下左右边框宽度值均设置为10px
3.两个属性值时默认对上下、左右,两组方向的边框宽度进行设置border-width:10px 20px;相当于上下边框宽度值设置为10px,左右边框宽度值设置为20px
4.三个属性值时默认对上、左右,下的边框宽度进行设置border-width:10px 20px 30px;相当于上边框宽度值设置为10px,左右边框宽度值设置为20px,下边框宽度值设置为30px
4.四个属性值时默认对上、左右,下的边框宽度进行设置border-width:10px 20px 30px 40px;相当于上边框宽度值设置为10px,右边框宽度值设置为20px,下边框宽度值设置为30px,左边框宽度值设置为40px

(2)边界颜色(border-color)

实际上存在四个方向上边框颜色的设置,包括: border-top-color(上)、border-right-color(右)、border-bottom-color(下)、border-left-color(左)

默认border-color为black,若存在1-4个属性值时参考以上border-width的表格。

(3)边界样式(border-style)

实际上存在四个方向上边框样式的设置,包括: border-top-style(上)、border-right-style(右)、border-bottom-style(下)、border-left-style(左)

border-color默认继承父元素的color值,若未设置则使用浏览器默认的颜色black,若存在1-4个属性值时参考以上border-width的表格。

  • none,无边框
  • solid,实现边框
  • dashed,虚线边框
  • dotted,点状虚线边框
  • double,双线边框

3. 内边距(padding)

实际上存在四个方向上内边距的设置,包括: padding-top(上)、padding-right(右)、padding-bottom(下)、padding-left(左)

默认padding为0,若存在1-4个属性值时参考以上border-width的表格。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>盒子模型</title>
    <style>
        .outer {
            /* 内容区content */
            width: 200px;
            height: 200px;
            background-color: #bfa;
                
            /* 边界border,盒子可见区域大小210×210 */
            border-width: 10px;
            border-color: red orange yellow green;
            border-style: solid dashed dotted double;
            
            /* 内边距,盒子可见区域大小410×310*/
            padding:50px 100px; 
        }

        .inner{
            /* width和height由父元素的width和height决定 */
            width: 100%;
            height: 100%;
            color: white;
            background: blue;
        }
    </style>
</head>

<body>
    <div class="outer">
        <div class="inner"></div>
    </div>
</body>

</html>

展示效果如下图所示:
在这里插入图片描述
盒子整体大小为410宽×310高
在这里插入图片描述

4. 外边距(margin)

实际上存在四个方向上内边距的设置,包括: margin-top(上)、margin-right(右)、margin-bottom(下)、margin-left(左)

默认margin为0,若存在1-4个属性值时参考以上border-width的表格。

margin类型取值特点
margin-top正值当前盒子向下移动
负值当前盒子向上移动
margin-right正值默认无效果
负值默认无效果
margin-bottom正值下方盒子向下移动
负值下方盒子向上移动
margin-left正值当前盒子向右移动
负值当前盒子向左移动

5. 盒子大小

box-sizing属性值

  • content-box默认值,width和height用来设置内容区content)的大小
  • border-box:width和height用来设置整个盒子可见区域content+padding+border)的大小

6. 轮廓、阴影和圆角

1. 轮廓outline属性值 & 边框border属性值

  • 相同点:outline和border属性值用法一致
  • 不同点:outline不会影响整个盒子的大小,border会影响整个盒子的大小(box-sizing为content-box时)

2. 阴影box-shadow属性值

  • 第一个值: 水平偏移量,正值表示阴影向右移动,负值代表阴影向左移动
  • 第二个值: 垂直偏移量,正值表示阴影向下移动,负值代表阴影向上移动
  • 第三个值: 阴影颜色

3. 圆角border-radius属性值:为了设置圆角的半径大小

  • 四个值时: 设置左上、右上、右下、左下圆角半径大小
  • 三个值时: 设置左上、右上/左下、右下圆角半径大小
  • 两个值时: 设置左上/右下、右上/左下圆角半径大小
  • 一个值时: 设置左上/右上/右下/左下圆角半径大小
    • 只有一个值,且为50%时,表示设置成正圆

实际上存在四个方向上内边距的设置,包括: border-left-top-radius(左上)、border-right-top-radius(右上)、border-right-bottom-radius(右下)、border-left-bottom-radius(左下)


三、盒子模型——布局

1. 水平方向布局

子元素在父元素中水平方向所在位置由以下几个属性共同决定:
(1)margin-left
(2)border-left
(3)padding-left
(4)width
(5)padding-right
(6)border-right
(7)margin-right

必须满足: \color{#FF3030}{必须满足:} 必须满足:子元素以上七种属性值之和 = 父元素内容区宽度

当七种属性值之和不满足等式时,称为过渡约束加粗样式,等式会自动调整。调整情况如下所示:

  • 1. 当七个值没有 auto 时,浏览器会自动调整 margin-right的值使等式成立
  • 2. 当width、margin-left、margin-right设置为auto时,浏览器会自动调整设置为auto的值使等式成立
    • (1)当只有一个值设置为auto时: 仅调整auto值使等式成立
    • (2)当width和某一外边距同时为auto时: auto的外边距设置为0,width自动调整为最大值
    • (3)三个值均为auto时: width为最大值,两个外边距均为0
    • (4)当width设置为固定值,其它两个外边距设置为auto时: 保证width不变,auto的外边距设置为相同的两个值

常用 width:xxxpx; margin: 0 auto;来设置某一元素在父元素中水平居中

状态margin-left值border-left值padding-left值width值padding-right值border-right值margin-right值父元素内容区宽度
1.调整前000200000800
1.调整后00020000600800
2.调整前auto0040000200800
2.调整后2000040000200800
3.调整前auto00auto00200800
3.调整后00060000200800
4.调整前auto00auto00auto800
4.调整后000800000800
5.调整前auto0050000auto800
5.调整后1500080000150800
6.调整前0001000000800
6.调整后000100000-200800

2. 垂直方向布局

  • 默认情况,父元素高度由内容撑开
  • 如果子元素大小超出了父元素,子元素会从父元素中溢出,可采用overflow属性处理溢出元素内容区的部分:
    • visible默认值,不修剪溢出的内容,呈现溢出的内容
    • hidden :隐藏溢出的内容
    • scoll :内容会被修剪,但可以通过水平和垂直滚动条查看修剪的内容,如果某一方向不需要滚动条仍会添加不可滚动的滚动条
    • auto :内容会被修剪,如水平或垂直方向需要滚动条时,会增加对应的滚动条
    • inherit :子元素继承父元素的overflow属性值

3. 实际问题:外边距的折叠(垂直方向相邻元素)

(1)相邻兄弟元素的外边距【开发中一般不处理这种情况的外边距折叠问题】
讨论垂直方向上方元素的margin-bottom值和下方元素的margin-top值

margin-bottom值margin-top值实际兄弟元素间的距离
正值正值两值中较大的值
正值负值两者之和
负值正值两者之和
负值负值两值中绝对值较大的值

(2)相邻父子元素的外边距【影响开发】

  • 子元素的上外边距会传递给父元素的上外边距

初始状态如下如图所示,如何将子元素向下移动100px的同时,保证父元素位置不变?
在这里插入图片描述
错误方式,仅修改子元素的上外边距,父子元素均向下移动
在这里插入图片描述

外边距的折叠练习代码如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>父子元素外边距的折叠</title>
    <style>
        body {
            background-color: antiquewhite;
        }
        /* 如何将子元素向下移动100px的同时,保证父元素位置不变 */
        /* 错误方式,忽略子元素的上外边距会传递给父元素 */
        /*.box1{
			width: 200px;
			height: 200px;
			background-color: #bfa;
		}
		.box2{
			width: 100px;
			height: 100px;
			background-color: orange;
			margin-top: 100px;

		}*/
        /* 正确方式1,修改父元素的内上边距,将子元素下移,并同时修改父元素的高度值 */
        
        /*.box1 {
            width: 200px;
            height: 100px;
            background-color: #bfa;
            padding-top: 100px;
        }
        
        .box2 {
            width: 100px;
            height: 100px;
            background-color: orange;
        }*/
		
		/* 正确方式2,添加外边距使父子元素之间不再处于相邻关系 */
        .box1 {
            width: 200px;
            height: 199px;
            background-color: #bfa;
            border-top: 1px #bfa solid;
        }       
        .box2 {
            width: 100px;
            height: 100px;
   			margin-top: 99px;
            background-color: orange;
        }
    </style>
</head>
<body>

    <div class="box1">
        <div class="box2"></div>
    </div>
</body>
</html>

4. 行内元素的盒子模型

关于行内元素更为准确的内容,可以查看 HTML5+CSS3学习笔记(七)行内元素设置margin和padding是否生效(以span、img为例)

  • 行内元素不可以设置width和height
  • 行内元素可以设置padding,但垂直方向的padding不会影响页面布局
  • 行内元素可以设置border,但垂直方向的border不会影响页面布局
  • 行内元素可以设置margin,但垂直方向的margin不会影响页面布局

通过display属性值的设置,改变元素的类型

  • block,设置为块级元素
  • inline,设置为行内元素
  • inline-block,设置为行内块元素,既可设置高度和宽度,但不会独占页面一行
  • table,设置为表格
  • none,元素不在页面显示,但不占据页面中的位置

通过visible属性设置

  • visible,使元素在页面中可见
  • hidden,元素在页面中隐藏,但会占据页面的位置

5. 浏览器的默认样式

代码练习中,常通过以下代码去除浏览器对网页的默认样式【不可以完全去除】

*{
	margin: 0;
	padding: 0;
}

实际开放中,常通过引入外部样式表,来去除网页的默认样式


四、练习代码

1. 图片列表

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>京东图片列表</title>
    <link rel="stylesheet" href="../css/reset.css">
    <style>
        /* 为了方便观察图片列表外层容器的背景颜色 */
        body {
            background-color: antiquewhite;
        }
        
        .img-list {
            width: 190px;
            height: 470px;
            overflow: hidden;
            margin: 50px auto;
            background-color: #F4F4F4;
        }
        
        .img-list img {
            width: 100%;
            margin-bottom: 9px;
        }
    </style>
</head>

<body>
    

    <!-- 创建图片列表的外层容器 -->
    <ul class="img-list">
        <!-- 使用列表项可以将超链接转化为块元素 -->
        <li>
            <a href="javascript:;">
                <img src="../imgs/exercise1/1.jpg.webp" alt="">
            </a>
        </li>
        <li>
            <a href="javascript:;">
                <img src="../imgs/exercise1/2.jpg.webp" alt="">
            </a>
        </li>
        <li>
            <a href="javascript:;">
                <img src="../imgs/exercise1/3.jpg.webp" alt="">
            </a>
        </li>
    </ul>
</body>

</html>

2. 左侧导航栏

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>京东左侧导航栏</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        
        body {
            background-color: #bfa;
        }
        
        .left-nav {
            width: 190px;
            height: 450px;
            margin: 50px auto;
            padding: 10px 0;
            background-color: #fff;
        }
        
        .item {
            /* 不指定width可以让子元素盒子宽度和父元素相等 */
            padding-left: 18px;
            height: 25px;
            line-height: 25px;
        }
        
        .item:hover {
            background-color: #d9d9d9;
        }
        
        .item a {
            color: #333;
            font-size: 14px;
            text-decoration: none;
        }
        
        .item a:hover {
            color: #c81623;
        }
        
        .item a:visted {
            color: gray;
        }
        
        .a_text {
            padding: 0 2px;
            font-size: 12px
        }
    </style>
</head>

<body>
    <nav class="left-nav">
        <div class="item">
            <a href="#">家用电器</a>
        </div>
        <div class="item">
            <a href="#">手机</a><span class="a_text">/</span><a href="#">运营商</a><span class="a_text">/</span><a href="#">数码</a>
        </div>
        <div class="item">
            <a href="#">电脑</a><span class="a_text">/</span><a href="#">办公</a>
        </div>
        <div class="item">
            <a href="#">家居</a><span class="a_text">/</span><a href="#">家具</a><span class="a_text">/</span><a href="#">家装</a><span class="a_text">/</span><a href="#">厨具</a>
        </div>
        <div class="item">
            <a href="#">男装</a><span class="a_text">/</span><a href="#">女装</a><span class="a_text">/</span><a href="#">童装</a><span class="a_text">/</span><a href="#">内衣</a>
        </div>
        <div class="item">
            <a href="#">美妆</a><span class="a_text">/</span><a href="#">个护清洁</a><span class="a_text">/</span><a href="#">宠物</a>
        </div>
        <div class="item">
            <a href="#">女鞋</a><span class="a_text">/</span><a href="#">箱包</a><span class="a_text">/</span><a href="#">钟表</a><span class="a_text">/</span><a href="#">珠宝</a>
        </div>
        <div class="item">
            <a href="#">男鞋</a><span class="a_text">/</span><a href="#">运动</a><span class="a_text">/</span><a href="#">户外</a>
        </div>
        <div class="item">
            <a href="#">房产</a><span class="a_text">/</span><a href="#">汽车</a><span class="a_text">/</span><a href="#">汽车用品</a>
        </div>
        <div class="item">
            <a href="#">母婴</a><span class="a_text">/</span><a href="#">玩具乐器</a>
        </div>
        <div class="item">
            <a href="#">食品</a><span class="a_text">/</span><a href="#">酒类</a><span class="a_text">/</span><a href="#">生鲜</a><span class="a_text">/</span><a href="#">特产</a>
        </div>
        <div class="item">
            <a href="#">艺术</a><span class="a_text">/</span><a href="#">礼品鲜花</a><span class="a_text">/</span><a href="#">农资绿植</a>
        </div>
        <div class="item">
            <a href="#">医药保健</a><span class="a_text">/</span><a href="#">计生情趣</a>
        </div>
        <div class="item">
            <a href="#">图书</a><span class="a_text">/</span><a href="#">文娱</a><span class="a_text">/</span><a href="#">教育</a><span class="a_text">/</span><a href="#">电子书</a>
        </div>
        <div class="item">
            <a href="#">机票</a><span class="a_text">/</span><a href="#">酒店</a><span class="a_text">/</span><a href="#">旅游</a><span class="a_text">/</span><a href="#">生活</a>
        </div>
        <div class="item">
            <a href="#">理财</a><span class="a_text">/</span><a href="#">众筹</a><span class="a_text">/</span><a href="#">白条</a><span class="a_text">/</span><a href="#">保险</a>
        </div>
        <div class="item">
            <a href="#">安装</a><span class="a_text">/</span><a href="#">维修</a><span class="a_text">/</span><a href="#">清洗</a><span class="a_text">/</span><a href="#">二手</a>
        </div>
        <div class="item">
            <a href="#">工业品</a>
        </div>
    </nav>
</body>

</html>

结尾

如有错误,欢迎评论区指正。

更多其它知识可查询在线文档:[w3school在线教程链接](https://www.w3school.com.cn/)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想要大口炫榴莲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值