CSS开发常识

- 一般会清除元素自带的外/内边距


    * {
        padding: 0;
        margin: 0;
    }

- <img>和<p>之间,即使清除默认的边距,也会有3px的间距,如何解决 --- 块级展示 即可

    image {
        display: block;
    }

- <p>元素里面,不要去嵌套<div>标签

- div容器默认宽度 100% ,没有默认高度(或者说默认高度为0)

- 浏览器默认字体大小是: 16px
  默认行高是: 21px

- 文字的垂直居中效果:行高和高度相同即可

- 单位:百分比,是相对父元素而言

    - <body>的宽度是100%,但是高度是0,它的高度是依赖 内容 撑起来的
      相当于,建高楼,地基(宽度)已打好,至于建多高,全靠你自己

overflow: hidden 解析

- 定义:超出的部分,剪掉

- 其他用途

  - 用来清除浮动
  
  - 解决'父子容器'外边距无效问题

- 示例: 新建150*150布局的容器div,放入一张超过150*150px的图片

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            div{ # 指定宽高
                height: 150px;
                width: 150px;
            }
        </style>
    </head>

    <body>
        <div>
            <img src="mid-autumnday.jpg" alt="">
        </div>
    </body>
</html>

- 效果:图片会正常显示,整个div容器会被撑开(容器div的实际像素不变)

- 需求:容器div占多少像素,图片就占多少像素,多余的就切掉!就用到了 overflow:hidden

......
        <style>
            div{
                height: 150px;
                width: 150px;
                overflow: hidden; # 容器有多大,图片就多大
            }
        </style>


    <body>
        <div>
            <img src="mid-autumnday.jpg" alt="">
        </div>
    </body>
</html>

- 注意,此时图片多余的部分被隐藏起来了,而不是说,图片进行了等比例缩放

text-align: center / margin: auto

  • text-align: center 让容器里面的元素相对于'该容器'水平居中(不管对div容器还是对p文本 使用这个属性,都是一样的效果)

  • margin: auto 让容器本身相对于'浏览器窗口'水平居中(容器里面的元素会一起被移动)(把这个属性加在容器上面)

  • 实例,文字标题和段落的排列


<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>

        </style>
    </head>

    <body>
        <h1 style="text-align: center"> <!--使标题居中-->
            <span style="background-color: black;color: white">千峰教育</span>
        </h1>
        <div style="width: 600px;margin: auto"> <!--使段落居中-->
            <p>
                千锋教育_国内IT职业教育良心品牌,专注Java培训,HTML5+WEB前端培训,Python+人工智能培训,Linux云计算培训,全链路UI培训,大数据培训,unity游戏开发,软件测试,PHP,互联网营
            </p>
            <p>
                千锋教育_国内IT职业教育良心品牌,专注Java培训,HTML5+WEB前端培训,Python+人工智能培训,Linux云计算培训,全链路UI培训,大数据培训,unity游戏开发,软件测试,PHP,互联网营
            </p>
            <p>
                千锋教育_国内IT职业教育良心品牌,专注Java培训,HTML5+WEB前端培训,Python+人工智能培训,Linux云计算培训,全链路UI培训,大数据培训,unity游戏开发,软件测试,PHP,互联网营
            </p>
        </div>
    </body>
</html>

css 权重

- 权重顺序.权重计算

    - 行内样式(1000) > ID选择器(100) >类选择器(10) >标签选择器(1) > 通用选择器(0)

    - 选择器选择的范围越小越精确,优先级就越高

- 示例一

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            #p1 {
                color: blue;
            }
            *{
                color: orange;
            }
            .pp {
                color: green;
            }
            p {
                color: red;
            }
        </style>
    </head>

    <body>
        <p class="pp" id="p1" style="color: slateblue"> # 权重最大
            猜猜我是什么颜色
        </p>
    </body>
</html>

- 示例二

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            #news {
                list-style: none;
                width: 370px;

            }
            #news li{
                height: 40px;
                line-height: 40px;
                border-bottom: dashed 1px purple;
            }
            #news li a {
                color: gray;
                text-decoration: none;
            }
            #news .last { # 这里若写成'last'是没有效果的
                border: none;
            }

        </style>
    </head>

    <body>
       <ul id="news">
           <li><a href="">新闻一号</a></li>
           <li><a href="">新闻二号</a></li>
           <li><a href="">新闻三号</a></li>
           <li><a href="">新闻四号</a></li>
           <li><a href="">新闻五号</a></li>
           <li class="last"><a href="">新闻六号</a></li>

       </ul>
    </body>
</html>

css文本属性

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .p1 {
                color: red;  /* 字体颜色 */
            }
            .p2 {
                font-family: 华文行楷;  /* 字体 */
            }
            .p3 {
                font-size: 26px; /* 文字大小默认16px */
            }
            .p4 {
                font-weight: bold;  /* 字体加粗 */
            }
            .p5 {
                font-style: italic; /* 斜体效果 */
            }
            .p6 {
                text-indent: 60px; /* 首行缩进 这种效果也可以使用 margin-left 来做*/
            }
            .p7 {
                text-align: center;  /* 居中 */
            }
            .p8 {
                line-height: 180px;  /* 行高 */
            }
            .p9 {
                height: 100px;
                background-color: gray; /* 水平方向上垂直居中 */
                line-height: 100px;
            }
            .p10 {
                text-decoration: underline;  /* 下划线 */
            }
        </style>
    </head>

    <body>
       <ul>
           <li class="p1">文字效果一</li>
           <li class="p2">文字效果二</li>
           <li class="p3">文字效果三</li>
           <li class="p4">文字效果四</li>
           <li class="p5">文字效果五</li>
           <li class="p6">文字效果六</li>
           <li class="p7">文字效果七</li>
           <li class="p8">文字效果八</li>
           <li class="p9">文字效果九</li>
           <li class="p10">文字效果十</li>
       </ul>
    </body>
</html>


- 注意事项: 字体是可以连续选择的

    h1 {    # 先找华文行楷,找不到就继续找宋体,若有,就不继续找
        font-family: 华文行楷, 宋体, 华文中宋;
    }

  • 实现文字的两端对齐和完全居中对齐
- text-align: justify;

- 使用 line-height 和 text-align:center,实现文本的完全居中

<!DOCTYPE html>
<html>
    <head>

        <style>

            .box2 {
                width: 500px;
                height: 100px;
                background-color: yellow;

                line-height: 100px; # 关注之处
                text-align: center;
            }
        </style>
    </head>

    <body>

        <div class="box2">
            大家好
        </div>

    </body>
</html>
  • 字符间隔/单词间隔/首行缩进/删除文本样式/字母大小写
- letter-spacing: 字符之间的间距

- word-spacing: 单词之间的间距(若负值,单词之间就交叉了)

- text-indent: 首行缩进

    - 介绍单位'em',倍数

        <style>
            .p1 {
                font-size: 16px;
                text-indent: 2em; # 上面的两倍,也就是 32px
            }
        </style>


- text-decoration: none; # 一般用来删除<a>标签的默认样式(下划线)

- text-transform: capitalize; # 单词首字母大写

    - lowercase: 全部小写

    - uppercase: 全部大写

背景图的使用

- 元素宽高的百分比,是相对于父元素而言,若父元素高度为0
  即使子元素高度100%,大小也是0

  html元素大小是相对与浏览器窗口而言

  - 实例:检查<body>元素,是没有高度的

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title>Title</title>
            <style>
                body {
                    height: 100%; # 设置高度
                }
            </style>
        </head>

        <body>

        </body>
    </html>

  - 此时,如何使<body>有高度呢,依据概念,父元素<html>设置高度即可

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title>Title</title>
            <style>
                html,body {
                    height: 100%; # html和body均设置高度
                    margin: 0; # 删除滚动条
                }
            </style>
        </head>

        <body>

        </body>
    </html>

- 背景图相关css属性

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title>Title</title>
            <style>
                html,body {
                    height: 100%;
                    margin: 0;
                }
                body {
                    # 背景图片默认'平铺'方式无限展开
                    background-image: url("mid-autumnday.jpg");
                    # 不重复平铺图片
                    background-repeat: no-repeat;
                    # 图片的位置:左右 上下
                    # background-position: right bottom; 图片位于右下角
                    background-position: center center;
                }
            </style>
        </head>

        <body>

        </body>
    </html>
  • 补充
- background-image 与 <img> 在 div 块中的区别

    - 当设置一个div区域时,假如div尺寸(宽度和高度)比较小,而<img>包裹的图片比较大时
      <image>里面的图片会把 整个div区域撑开,不受 div块区域的束缚
      而 background-image 受 div区域的束缚,示例代码

        <style>
            .d1 {
                width: 300px;
                height: 300px; # 设定尺寸
                background-color: yellow;
                background-image: url("pwd.png"); # 不管小图片/大图片,效果都受约束
            }
        </style>


        <div class="d1">
            Hello
        </div>

- background-repeat 的几个值

    - repeat

    - repeat-x

    - repeat-y

    - no-repeat

- background-position 的几个值

    - background-position: 20px 20px; # 可以通过调试工具,动态跳转图片的位置

    - background-position: 10% 30%; # 相对于'长度'和'宽度'的百分之多少(用得比较少)

    - background-position: center center; # 方便排序
- background-size: 设置背景图片的大小

    - 实例1,把图片大小设置成和div块一样,铺满整个div块(图片被拉伸,失真了)

    <style>
        div{
            width:300px;
            height:400px;
            background-color:yellow;
            background-image: url('pretty.png');
            background-repeat:no-repeat;
            background-size: 300px 400px; # 设置成一样
        }
    </style>

    body>

        <div>

        </div>
    </body>

    - 注意:这里 background-size: 100% 100%; 也是可以的,一样的效果

    - background-size的其他两个值学习

        - background-size: cover; 图片会尽量扩大覆盖整个div块,图片多余的部分被裁减掉

        - background-size: contain; 图片会'不失真'的适应div块的'高度'和'宽度',但是无法铺满整个div块,会空出多余div块
- 当滚动条时,保持图片显示/被滚动 background-attachment 介绍

    - 定义:使图片固定在容器内(占满整个容器)/随着容器滚动

    - background-attachment: fixed; 把背景图片固定在'浏览器左上角'

    - background-attachment: scroll; 默认值

- 实例1: 正常效果,随着鼠标滚动,图片消失

    <style>
        .box{
            width:300px;
            height:3000px;
            background-color:yellow;
            background-image: url('pretty.png');
            background-repeat:no-repeat;
            background-attachment: scroll; # 默认效果

        }
    </style>

    <body>

        <div class="box">

        </div>
    </body>

- 实例2: 不管再怎么拖动滚动条,图片不会消失,永远显示在浏览器左上角

    <style>
        .box{
            width:300px;
            height:3000px;
            background-color:yellow;
            background-image: url('pretty.png');
            background-repeat:no-repeat;
            background-attachment: fixed; # 永远显示

        }
    </style>

    <body>

        <div class="box">

        </div>
    </body>

- 实例3:神奇效果,当把div块移到中间的时候,图片即使fixed,也看不见,为什么?

    <style>
        .box{
            width:300px;
            height:3000px;
            background-color:yellow;
            background-image: url('pretty.png');
            background-repeat:no-repeat;
            background-attachment: fixed;
            margin:0 auto; # 把div块移动到中间

        }
    </style>

    <body>

        <div class="box">

        </div>
    </body>

    - 解析: 此时图片还是位于'左上角',但由于div块的移动,图片由于被固定,不会跟随着移动,所以不被显示,还是存在的,只是看不见
      改回'scroll'就可以了

- 实例4: 固定两张图片,然后看效果

    - 属于第一张的区域,就显示第一张

    - 当滚到到第二张的区域,就显示第二张

    - 有一种图片被替换掉的效果

    <style>

        div {
            width:300px;
            height:1000px;
        }
        .box1{

            background-color:yellow;
            background-image: url('pretty.png');
            background-repeat:no-repeat;
            background-attachment: fixed; # 固定

        }
        .box2{

            background-color:yellow;
            background-image: url('handsome.png');
            background-repeat:no-repeat;
            background-attachment: fixed; # 固定

        }
    </style>

    <body>

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

- 实例5:把实例4小改,图片放到中间

    <style>

        div {
            height:760px; # 重复的部分,放到div
            background-color:yellow;
            background-repeat:no-repeat;
            background-size: cover;
            background-position:center center;
            background-attachment: fixed;
        }
        .box1{
            background-image: url('pretty.png');
        }
        .box2{
            background-image: url('handsome.png');
        }
    </style>

    <body>

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


- 实例6: 知乎登录界面,背景图不会被滚掉

    <style>
        * {
            padding: 0;
            margin: 0;
        }
        div{
            width:400px;
            height:500px;
            background-color: darkblue;
            margin: auto; # 整体居中,但是紧贴窗口上方
            margin-top: 200px; # 与窗口上方拉开边距
        }
        body{
            background-image: url('bg.jpg');
            background-attachment: fixed;
        }

    </style>

    <body>

        <div></div>

    </body>



- 注意事项

    - 如果想移动'background-attachment: fixed;'的'背景图'

        - margin:0 auto; # 无效果
        - background-position:center center; # 有效果

表格

- <table> 表示表格

- tr 表示'行'

- td 表示'单元格'(支持嵌套标签,比如<p>)

- 快速创建表格:包含两行两列,table>tr*2>td*2
  • 表格的合并
- colspan: 要合并的'列数'

- rowspan: 要合并的'行数'

- 合并原则: 合并多少列/行,就要删掉被合并的列/行

- 实例:3行3列的改造

    <table border="1" width="300">
            <tr>
                <td>1</td> # 保持原样
                <td colspan="2" rowspan="2">2</td> 
            </tr>
            <tr>
                <td rowspan="2">4</td>
            </tr>
            <tr>
                <td colspan="2">8</td>
            </tr>
        </table>

css的语法和引入css的两种方式


- 语法

    选择器(符) {
        属性:属性值1 属性值2 属性值3;
    }


- 外部引用的两种方式

    - link(推荐,兼容性好)

        <link rel="stylesheet" href="kinds.css">

    - import

        <style>
            @import url('kinds.css');
        </style>

伪类选择器(和标签相关)

- 引入场景:改变<a>标签的默认颜色

    <style>
        a {
            background-color: red; # 如果这么写,那么该标签永远是红色,不会再有变化
        }
    </style>

    <a href="http://www.baidu.com">百度</a>

- 鼠标的<a>标签上面的状态有4种

    a:link: 链接的初始状态
    a:visited: 链接被访问过后的状态
    a:hover: 鼠标停留在a标签上面的状态
    a:active: 鼠标按下时,链接的状态

    顺序: link-visited-hover-active

- 所以,上述示例可以这么改

    <style>
        a:link {
            background-color: red; # 好处在于,a标签不会永远是红色
        }

    </style>

- 把上述说明依次示例

    <style>
        a:link {
            background-color: red; # 初始状态
        }

        a:visited{
            background-color: green; # 访问过后的状态
        }

        a:hover{
            background-color: orange; # 鼠标停留状态
        }

        a:active{
            background-color: aqua; # 鼠标点击时的状态
        }

    </style>

- 注意事项

    - 使用的时候,一定要按照顺序来,否则某个样式会被覆盖掉

    - 最常用的,就是 a:hover {}

- 新闻导航条示例

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title>Title</title>
            <style>
                body{
                    margin: 0; # 清除导航条边距
                }
                .navigation {
                    width: 100%; # 宽高
                    height: 30px;
                    background-color: slateblue; # 背景色,行高
                    line-height: 30px;
                    display: flex; # flex 布局
                    flex-direction: row;
                    justify-content: space-around;
                }
                a {
                    color: black; # 黑色字体
                }
                a:hover {
                    background-color: red; # 鼠标停留就显示红色
                }
            </style>
        </head>

        <body>
            <div class="navigation">
                <a href="http://www.baidu.com/news">新闻</a>
                <a href="http://www.baidu.com/animal">动物</a>
                <a href="http://www.baidu.com/nature">自然</a>
                <a href="http://www.baidu.com/fruit">水果</a>
                <a href="http://www.baidu.com/vagetable">蔬菜</a>
            </div>
        </body>
    </html>

列表属性

- list-style-type

    - 实心圆: disc
    - 空心圆: circle
    - 实心方块: square
    - none # 实战最常用(列表属性学这个就可以了)

- list-style-image: 将图片代替'实心圆'

- list-style-position: 将'实心圆'放里面/外面

- list-style: 简写(上面三个属性的位置,可以随意)



- 实例1:当清除所有元素的边距时,列表的默认样式(小圆点)也会被清除

    <style>

        * { # 清除所有边距
            margin: 0;
            padding: 0;
        }


    </style>

    <ul> # 无样式
        <li>111</li>
        <li>222</li>
        <li>333</li>
    </ul>

- 实例2:清除列表默认样式(最常用的)

    <style>
        ul {
            list-style-type: none;
        }
    </style>

- 实例2: 把列表的序号换成'图片'(这里图片的位置无法调整)

    <style>
        ul {
            list-style-type: none;
        }
        .l1 {
            list-style-image: url('1.png');
        }
        .l2 {
            list-style-image: url('2.png');
        }
        .l3 {
            list-style-image: url('3.png');
        }
    </style>

    <ul>
        <li class="l1">111</li>
        <li class="l2">222</li>
        <li class="l3">333</li>
    </ul>

- 实例3:给列表项添加边框,并把图片序号放进框里面

    <style>
        ul {
            list-style-type: none;
        }
        .l1 {
            list-style-image: url('1.png');
            list-style-position: inside; # 把图片序号放入边框里面
        }
        .l2 {
            list-style-image: url('2.png');
            list-style-position: inside;
        }
        .l3 {
            list-style-image: url('3.png');
        }
        li {
            border:1px solid red;
            list-style-position: inside;
        }
    </style>

    <ul>
        <li class="l1">111</li>
        <li class="l2">222</li>
        <li class="l3">333</li>
    </ul>

浮动 float

- 作用

    - 让竖直的东西横着来(主要)

    - 其他文本围绕该元素显示

- 特点:见缝插针,尽可能节约空间

- 参数

    - float:left/right/none

- 测试环境:三个相同尺寸的颜色块(颜色不同)

    <style>
        div {
            width: 100px;
            height: 100px;
        }
        .d1 {
            background-color: red;
        }
        .d2 {
            background-color: green;
        }
        .d3 {
            background-color: purple;
        }
    </style>
    ......
     <div class="d1"></div>
    <div class="d2"></div>
    <div class="d3"></div>

- 实例1: d1开始浮动,由于d1浮起来了,所以d2,d3向上挤压
  由于d1和d2的尺寸相同,d2的颜色块被d1遮起来了,所以看到的只有两个色块

        <style>
            div {
                width: 100px;
                height: 100px;
            }
            .d1 {
                background-color: red;
                float: left; # 添加浮动效果
            }
            .d2 {
                background-color: green;
            }
            .d3 {
                background-color: purple;
            }
        </style>

    - 此时,若更改 d2的尺寸,比如变大,是可以看到颜色的

        .d2 {
            background-color: green;
            width: 300px; # 可以很明显看到颜色块了
        }

- 实例2: 若三个颜色块均设置浮动,效果就是都浮起来,然后横向紧贴在一起

        <style>
            div {
                width: 100px;
                height: 100px;
            }
            .d1 {
                background-color: red;
                float: left; # 均设置浮动
            }
            .d2 {
                background-color: green;
                float: left;
            }
            .d3 {
                background-color: purple;
                float: left;
            }
        </style>

- 实例3: 若颜色块大小: 红>绿>紫,当都浮动的时候,就是'见缝插针'效果
  三个颜色块不是紧贴在一起,而是 红+绿紫(不是 红+绿+紫) 效果

    <style>
        div {
            width: 100px;
            height: 100px;
        }
        .d1 {
            background-color: red;
            float: left;
            height: 500px; # 最大尺寸
            width: 500px;
        }
        .d2 {
            background-color: green;
            float: left;
            height: 400px; # 第二大尺寸
            width: 400px;
        }
        .d3 {
            background-color: purple;
            float: left;
            height: 300px; # 最小尺寸
            width: 300px;
        }
    </style>

- 实例4:文本环绕'浮动元素'效果,本来 文字 应该被颜色块覆盖的,但是文字却围绕浮动元素显示
  这就是'float'的另一种效果

    <style>
        div {
            width: 100px;
            height: 100px;
        }
        .d1 {
            background-color: red;
            float: left; # 浮动
        }
        .d2 {
            background-color: green;
            height: 400px; # 大块颜色区域
            width: 400px;
        }
        .d3 {
            background-color: purple;
        }
    </style>
    ......
    <div class="d1"></div>
    <div class="d2">文字有什么效果</div> # 测试文字(不会被颜色块覆盖)
    <div class="d3"></div>
  • 清除浮动 clear
- 作用

    - 当子元素浮动起来的时候,会造成父元素尺寸之一的'高度塌陷',即父元素高度变为0
      解决'高度塌陷'的方法有好几种,而其中'清除浮动'是一种比较好的解决方案

- 参数

    - clear:none 允许有浮动对象

    - clear:both 不允许有浮动对象

    - clear:left 不允许左边有浮动对象

    - clear:right 不允许右边有浮动对象

- 注意: 清除浮动只是改变元素的排列方式,该元素还是漂浮着,不占据文档位置

- '高度塌陷'实验环境:父元素div,包裹两个子div块浮动,此时检查父div的尺寸就会发现高度为0

    <style>
        .box1,.box2 {
            width: 200px;
            height: 200px;
            float: left;
        }
        .box1 {
            background-color: red; 
        }
        .box2 {
            background-color: green;
        }
        .box {
            width: 300px;
            height: 300px; # 大颜色块
            background-color: purple;
        }
    </style>
    ......
    <div class="container"> # 高度变为0
        <div class="box1"></div>
        <div class="box2"></div>
    </div>

    <div class="box"></div>

- 解决方式一: 既然父元素此时没有高度了,那么设置一个高度即可

    # 在原来的样式上加上这句
    .container {
        height: 200px; # 设置和子元素高度相同即可
    }

    - 再次检查 父div高度,有高度了
    - 而且,原来的'大颜色块'不再插入'两个颜色块'的空间,回到'两个颜色块'下方的位置

- 解决方式二: 对于'浮动元素'的下一个元素,应用 clear:both,一模一样的效果

    # 恢复实验环境
    .box {
        width: 300px;
        height: 300px;
        background-color: purple;
        clear: both; # 加这句即可
    }
- 解决方式三:新增'浮动元素'的"兄弟元素",不设置宽高 clear:both,一模一样的效果

    # 恢复实验环境
    <div class="container">
        <div class="box1"></div>
        <div class="box2"></div>
        <div style="clear: both"></div> # 新增
    </div>

- 解决方式四: 对父元素应用 overflow: hidden 让浮动元素计算高度(可以先不懂)

    .container {
        overflow: hidden; # 新增
    }
  • 示例: 实现图片的横向排列
- 实现方式一: 对父元素使用flex 布局

    <style>
        .imageList { # flex 布局
            display: flex;
            flex-direction: row;
            justify-content:flex-start;
        }
        p {
            text-align: center;
        }
        img {
            margin-left: 20px; # 图片之间加边距
        }
    </style>
    ......
    <div class="imageList">
        <div>
            <img src="pretty.png" alt="">
            <p>文字效果</p>
        </div>

        <div>
            <img src="pretty.png" alt="">
            <p>文字效果</p>
        </div>

        <div>
            <img src="pretty.png" alt="">
            <p>文字效果</p>
        </div>
    </div>


- 实现方式二:使用'浮动'

    <style>
        div {
            float: left; # 对于每个div块设置浮动
            margin-left: 20px; # div块之前拉开下边距,不然紧凑一起,很挤
        }
        div img {
            width:187px;
            height:125px;

        }
        div p{
            font-size:12px;
            text-align:center;
             width:187px; /*宽度和图片宽度保持一致,所以居中;否则默认是相对于浏览器窗口居中,效果很差*/
            background-color:darkcyan;

        }
    </style>
    ......
    <div>
        <img src="pretty.png" alt="">
        <p>文字效果</p>
    </div>

    <div>
        <img src="pretty.png" alt="">
        <p>文字效果</p>
    </div>

    <div>
        <img src="pretty.png" alt="">
        <p>文字效果</p>
    </div>

- 再次美化,添加鼠标移动到文字的效果,背景变色

    <style>
        div {
            float: left;
            margin-left: 20px;
        }
        div img {
            width:187px;
            height:125px;

        }
        a { # 增加效果
            display: block;
            font-size:12px;
            text-align:center;
            background-color:darkcyan;
            text-decoration: none;
        }
        a:hover {
            background-color:red;
        }
    </style>
    ......
    <div>
        <img src="pretty.png" alt="">
        <a href="#">文字效果</a>
    </div>

    <div>
        <img src="pretty.png" alt="">
        <a href="#">文字效果</a>
    </div>

    <div>
        <img src="pretty.png" alt="">
        <a href="#">文字效果</a>
    </div>

盒子模型的四个构成要素

- 外边距: margin

- 边框: border

- 内边距: padding

- 元素本身
  • 内边距: padding
- 实例演示:没有加padding之前,文字与div块之间,是紧挨一起的

    <style>
        div {
            width: 500px;
            height: 300px;
            background-color: yellow;
            text-align: justify; # 文字两端对齐
        }
    </style>

    <div>
        lorem 测试文字...
    </div>

    - 现在,加上内边距

        <style>
            div {
                width: 500px;
                height: 300px;
                background-color: yellow;
                text-align: justify;
                padding: 30px; # 文字与div块之间,有了间隔,效果好很多
            }
        </style>

- 内边距效果:让子元素和父元素拉开距离

    - 背景色也会蔓延到 padding
  • 边框: border和外边距: margin
- 双边框效果: double

    <style>
        div {
            width: 500px;
            height: 300px;
            background-color: yellow;
            border:10px double red; # 边框厚度高,但是双边框效果
        }

    </style>

    <div>

    </div>


- 清除html标签默认的外边距,以 h1标签为例

    <style>
        div {
            width: 500px;
            height: 300px;
            background-color: yellow;
            border:10px double red;
        }
        h1 {
            margin: 0; # 默认情况下,h1和div是有距离的,因为h1默认有外边距
        }

    </style>

    <div></div>
    <h1>测试标题</h1>

- 元素的居中效果

    <style>
        div {
            width: 500px;
            height: 300px;
            background-color: yellow;
            border:10px double red;
            margin: 0 auto; # 上下边距为0,水平方向居中
        }
        h1 {
            margin:0;
            text-align: center; # 文字居中
        }

    </style>

    <div></div>
    <h1>测试标题</h1>
  • margin 的两个疑难杂症解析
- 兄弟关系,两个盒子的垂直外边距与水平外边距问题

    - 垂直边距:外边距取最大值

    <style>
        div {
            width: 200px;
            height: 200px;
        }
        .d1 {
            background-color: yellow;
            margin-bottom: 50px; # 底部边距
        }
        .d2 {
            background-color: green;
            margin-top: 100px; # 上方边距
        }

    </style>
    ......
    # 它们之间的边距(垂直)为 100px,而不是150px
    <div class="d1"></div>
    <div class="d2"></div>

    - 水平边距:合并处理

    <style>
        div {
            width: 200px;
            height: 200px;
        }
        .d1 {
            background-color: yellow;
            float: left;
            margin-right: 50px; # 右边距
        }
        .d2 {
            background-color: green;
            float: left;
            margin-left: 100px; # 左边距
        }

    </style>
    ......
    <div class="d1"></div>
    <div class="d2"></div>

- 父子关系,给 子 加外边距,会作用于 父容器 上面,此时该如何解决

    <style>
        .parent {
            width: 400px;
            height: 400px;
            background-color: red;
        }
        .child {
            width: 200px;
            height: 200px;
            background-color: yellow;
            margin-top: 50px; # 加上外边距,但作用于 父容器上了
        }
    </style>
    ......
    <div class="parent">
        <div class="child"></div>
    </div>


    - 解决办法1: 把子容器的 margin-top: 50px 变成 父容器的 padding-top: 50px;
      同时注意计算高度

      <style>
        .parent {
            width: 400px;
            height: 350px; # 高度的变更
            background-color: red;
            padding-top: 50px; # 新增
        }
        .child {
            width: 200px;
            height: 200px;
            background-color: yellow;
            /*margin-top: 50px;*/ # 注释掉
        }
    </style>
    ......
    <div class="parent">
        <div class="child"></div>
    </div>

    - 该给父容器加边框即可(原先的子容器,并不知道父容器的边框在哪里,所以不知道怎么办)

    <style>
        .parent {
            width: 400px;
            height: 350px;
            background-color: red;
            border: 1px solid purple; # 加边框,实现预计的效果(transparent)
        }
        .child {
            width: 200px;
            height: 200px;
            background-color: yellow;
            margin-top: 50px; # 边距
        }
    </style>

        - 拓展:这里可以把边框的颜色,设置成'透明效果',实际是存在的,只是由于透明,所以看不到
          有一种'掩耳盗铃'的效果: border: 1px solid transparent;

    - 解决办法3:使两个容器不在同一个平面上即可,加'浮动'

    <style>
        .parent {
            width: 400px;
            height: 350px;
            background-color: red;

        }
        .child {
            width: 200px;
            height: 200px;
            background-color: yellow;
            margin-top: 50px;
            float: left; # 浮动
        }
    </style>

    - 解决办法4: 父容器加这句 overflow: hidden;也可以实现效果(Question)