Html 基础 三

### 浮动

浮动最直接的价值就在于他可以多个div并排在同一行。

当然也可以设置盒子的样式为 inline-block, 但是带来的问题也随之而来,首先就是盒子之间右空隙,其次,盒子会依次从左到右并排,虽然可以通过padding控制他们之间的间距,但是变数太大了

  • 浮动会让盒子脱离标准流,盒子不再占用位置。
  • 浮动的盒子总是会找到离他最近的父元素进行对齐,但是不会超出内边距的范围。
  • 浮动的盒子不能越过父盒子的padding值

常见的布局

如下图,每一个图片都在一个div中,为了让他们可以并排在一行上,肯定就得添加浮动,同时浮动会影响其他标准流,所在在这些标记浮动的元素的最外层添加一个div,清除这些盒子的浮动。同时给最外层的盒子添加高,让他占位。这样再往下的标准流就不会再受到影响了。

尝试浮动

让多个div并排在同一列,给下面的两个div同时添加浮动即刻

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .dv1 {
            width: 200px;
            height: 200px;
            background-color: pink;
            float: left;
        }
        .dv2 {
            width: 300px;
            height: 300px;
            background-color: aqua;
            float: left;
        }
    </style>
</head>
<body>
<div class="dv1"></div>
<div class="dv2"></div>
</body>
</html>

浮动仅仅会影响他下面的元素,看下面的例子

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .dv1 {
            width: 200px;
            height: 200px;
            background-color: pink;
        }
        .dv2 {
            width: 300px;
            height: 300px;
            background-color: aqua;
            float: left;
        }
    </style>
</head>
<body>
<div class="dv1"></div>
<div class="dv2"></div>
</body>
</html>

最终的效果就像下面这样, 虽然水蓝色的盒子添加了浮动,但是这也是仅仅是会影响他之后的元素,而他上面的元素不会受到影响。

推断,父盒子中有多个子盒子,如果其中一个盒子存在浮动,那么其他的所有盒子都需要浮动。才能在一行内并排

浮动隐藏的模式转换

浮动可以让盒子隐式的转换成行内块元素。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .dv1 {
            background-color: aqua;
            float: left;
        }
    </style>
</head>
<body>
<div class="dv1">123</div>
</body>
</html>

效果:

布局和版心

示例1:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .top,
        .footer,
        .main,
        .banner{
            background-color: #eee;
            width: 1190px;
        }
        .top {
            height: 80px;
            margin: 0 auto 5px;
        }
        .banner {
            height: 200px;
            margin: 0 auto 5px;
        }
        .main {
              height: 600px;
              margin: 0 auto 5px;
          }
        .footer {
            height: 80px;
            margin: 0 auto;
        }
    </style>
</head>
<body>
<div class="top">123</div>
<div class="banner">123</div>
<div class="main">123</div>
<div class="footer">123</div>
</body>
</html>

效果图:

示例2:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .top,
        .footer,
        .main,
        .banner{
            background-color: #eee;
            width: 1190px;
        }
        .top {
            height: 80px;
            margin: 0 auto 5px;
        }
        .banner {
            height: 200px;
            margin: 0 auto 5px;
        }
        .main {
              height: 600px;
              margin: 0 auto 5px;
        }
        .left {
            background-color: pink;
            height: 600px;
            width: 300px;
            float: left;
        }
        .right {
            background-color: aqua;
            height: 600px;
            width: 890px;
            float: right;
        }
        .footer {
            height: 80px;
            margin: 0 auto;
        }
    </style>
</head>
<body>
<div class="top">123</div>
<div class="banner">123</div>
<div class="main">
        <div class="left"></div>
        <div class="right"></div>
</div>
<div class="footer">123</div>
</body>
</html>

注意点,比如main部分,父盒子的宽度是1190px, 里面的两个子盒子发生浮动实现了并排,这时如果子盒子的宽度相加大于父盒子的宽度,最终的效果就是右边的子盒子会被挤下去。 为了防止他们不被挤下去,就得修改相应的子盒子的宽度

此外,像这种布局方式,我们用鼠标推动着浏览器往左滑动,盒子是不会被挤下去的。

效果:

清除浮动

清除浮动的本质: 就是为了解决父级元素因为子集元素浮动后而导致高度为0的情况。

看下面的例子:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .main {
            width: 1190px;
            background-color: #eee;
            margin: 0 auto 5px;
        }
        .left {
            background-color: pink;
            height: 600px;
            width: 300px;
            float: left;
        }
        .right {
            background-color: aqua;
            height: 600px;
            width: 890px;
            float: right;
        }
        .footer {
            width: 100%;
            height: 80px;
            margin: 0 auto;
            background-color: #cccccc;
        }
    </style>
</head>
<body>
<nav>

</nav>
<div class="main">
    <div class="left"></div>
    <div class="right"></div>
</div>
<div class="footer">123</div>
</body>
</html>

因为我们并没有给main盒子设置高度,导致让它里面的子盒子发生发动脱离文档流后,没有人撑开它,他就重新变成了一条线

前面的解决方式是我们给main盒子设置一个固定的高度,但是很多情况下,我们的需求是根据子盒子的本身的高度去撑开盒子,而不是把高度写死,于是我们可以使用清除浮动。

清除浮动实现的最终效果就是:父盒子中子盒子并排,父盒子的高度 = 最高的子盒子的高度

  • 清除浮动方式1:

w3c推荐的方式,在存在浮动的元素后面添加一个新的空标签,如下:

<body>
<div class="main">
    <div class="left"></div>
    <div class="right"></div>
</div>
<!-就像下面这样-->
<div style="clear: both;"></div>
<div class="footer">123</div>
</body>
  • 清除浮动方式2:

第二种方式清除浮动,可以通过给父盒子添加属性 overflow

.main {
    width: 1190px;
    background-color: #eee;
    margin: 0 auto 5px;
    /*同样可以实现清除浮动*/
    overflow: hidden;
}

元素的定位

元素的定位属性主要是包含两部分: 定位模式 + 边偏移

边偏移

边偏移属性 描述
top 顶部偏移量:定义元素相对于其父元素上边距的距离
bottom 底部偏移量:定义元素相对于其父元素下边距的距离
left 左侧偏移量
right 右侧偏移量

四种定位模式

css中,通过position属性定义元素的定位模式,基本的语法如下

描述
static 默认值,自动定位。
relative 相对定位,相对于其文档流的位置进行定位。
absolute 绝对定位,相对于其上一个元素的父元素进行定位。
fixed 固定定位,相对于浏览器的窗口进行定位。
静态定位

网页中的元素默认的都是静态定位,比如一个div默认会自己独占一行,多个span可以并排在一行。

静态定位的唯一的作用就是取消其他的定位模式。

相对定位

相对定位:相对于自己当前的位置,再定位到新的位置上。

看下面的示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .dv {
            margin: 100px;
            background-color: aqua;
            width: 100px;
            height: 100px;
            position: relative;
            top: 100px;
        }
    </style>
</head>
<body>
<div class="dv"></div>
</body>
</html>

最终的效果就是会相对于自己的位置重新定位,在top方向上增加100px

在看下面的示例: 可以看到,使用相对定位,元素虽然会移动,但是元素的原来在标准流中所占的位置不会发生改变。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .dv1 {
            background-color: aqua;
            width: 100px;
            height: 100px;
            position: relative;
            top: 50px;
            left: 50px;
        }
        .dv2 {
            background-color: skyblue;
            width: 100px;
            height: 100px;
        }
    </style>
</head>
<body>
<div class="dv1"></div>
<div class="dv2"></div>
</body>
</html>

效果图:

绝对定位

如下例子:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .dv1 {
            background-color: aqua;
            width: 100px;
            height: 100px;
            position: absolute;
        }
        .dv2 {
            background-color: skyblue;
            width: 120px;
            height: 120px;
        }
    </style>
</head>
<body>
<div class="dv1"></div>
<div class="dv2"></div>
</body>
</html>

效果图:

给水蓝色的盒子设置定位方式:相对定位,他相对于自己的父元素进行定位,在上面的例子中,就是相对于body,也就是当前的屏幕进行定位。

再看下面这个例子:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .dv1 {
            margin: 50px;
            background-color: aqua;
            width: 100px;
            height: 100px;
        }
        .dv2 {
            background-color: skyblue;
            position: absolute;
            top: 20px;
            left: 20px;
            width: 80px;
            height: 80px;
        }
    </style>
</head>
<body>
<div class="dv1">
    <div class="dv2">

    </div>
</div>
</body>
</html>

效果图:

通过这个例子看到,当给子盒子添加相对定位时,如果他的直接父盒子并没有添加任何定位,这时子盒子实际上是会相对于body进行定位。

子绝父相

子绝父相说的是啥意思呢?意思就是说,如果我们想实现子元素相对于父元素进行定位时,子元素的定位方式需要设置成绝对定位,父元素的定位方式设置成相对定位才ok

还是上面的例子:像下面这样修改css样式:

    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .dv1 {
            margin: 50px;
            background-color: aqua;
            width: 100px;
            height: 100px;
            position: absolute;
        }
        .dv2 {
            background-color: skyblue;
            position: relative;
            top: 10px;
            left: 10px;
            width: 80px;
            height: 80px;
        }
    </style>

最终实现的效果就是:

加了定位的盒子水平对齐

首先来说,一个盒子只要是添加了定位,盒子就会飘起来,与此同时margin属性也会失效。

那怎么使一个添加了定位的盒子水平对齐呢? 如下:

        .dv1 {
            background-color: aqua;
            width: 100px;
            height: 100px;
            /*无论什么定位都ok*/
            position: absolute;
            /*以左上角为基准,移动到父盒子的百分之五十宽度的位置*/
            left: 50%;
            /*margin值,往左减少50px*/
            margin-left: -50px;
        }

显示和隐藏

css中与显示和隐藏相关的常见属性有如下几个

display

visiblity

overflow

我们的目的是让其在文档中消失,而不是在源码中将其删除。

  • 通过display隐藏元素后,元素原来的位置不再保留

div {
    /*隐藏之后,不再保留原位置*/
    display: none;
}

div {
    /*将元素转换成块级元素,第二层意思就是显示元素*/
    display: block;
}


通过visibility控制元素的隐藏,原位置将会被保留

div {
    /*对象可见*/
 	visibility: visible;   
}

div {
    /*对象隐藏*/
 	visibility: hidden;   
}


通过overflow控制

div {
    /*超出的部分依然会显示*/
    overflow: visible;
}

div {
    /*超出的部分隐藏*/
    overflow: hidden;
}

div {
    /*内容超出后,会显示滚动条*/
	overflow: auto;
}

div {
    /*总是显示滚动条*/
	overflow: scroll;
} 
posted @ 2020-05-16 23:32  赐我白日梦  阅读(196)  评论(0编辑  收藏  举报