Go to comments

HTML+CSS宝典 CSS进阶[扩展] body的背景

袁老师说body元素的背景是css里面的一个巨大的天坑


给body元素设置一个背景,整个网页的背景是填充满的

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>body背景</title>
    <style>
        body{
            background-color: #008c8c;
        }
    </style>
</head>
<body>

</body>
</html>

右键检查,选中body元素,发现body元素的高度是0

image.png

body元素也只是一个普通元素而已,没有什么特殊的,

它里面没有内容高度是0,背景怎么跑到外面去了?


之前学过背景颜色填充的是边框盒,body元素高度是0,应该看不到背景才对,为什么会出现背景色?


这还不是最奇怪的,我们给body元素设置一个宽高和边框

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>body背景</title>
<style>
    body{
        background-color: #008c8c;
        width: 100px;
        height: 100px;
        border: 2px dashed;
    }
</style>
</head>
<body>

</body>
</html>

描边部分是body的边框盒,它的背景依然超过出了范围


再来看一个更加奇怪的现象,给html元素设置一个背景色

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>body背景</title>
    <style>
        html{
            background-color: lightblue;
        }
        body{
            background-color: #008c8c;
            width: 100px;
            height: 100px;
            border: 2px dashed;
        }
    </style>
</head>
<body>

</body>
</html>

body元素的背景色又正常了


HTML元素的背景又不正常了,HTML元素只有120像素的高度,背景又超出了元素尺寸

image.png


怎么回事呢?

需要了解一个知识画布(canvas)


一、画布 canvas

这个画布不是HTML5里面那个<canvas>画布元素,这里的canvas是一块区域


一般背景是覆盖边框盒,但是有块特殊的区域,就是画布canvas区别,它的背景不是这样


canvas区域的特点

1. 最小宽度为视口宽度

2. 最小高度为视口高度


也就是说画布canvas的区域,不可能比视口小,

但是有可能比视口大,比如网页的内容很多


二、HTML元素的背景

HTML元素的背景比较特殊,HTML元素的背景覆盖画布canvas(其它元素的背景覆盖边框盒)


这就解释了给HTML设置背景,设置的不是元素背景,设置的是画布canvas的背景


给HTML元素设置背景body元素背景正常了,覆盖边框盒


一般不太会给HTML元素设置背景,通常给body元素设置背景

三、BODY元素的背景

给body元素设置背景有两种情况

1、如果给HTML元素有背景,BODY元素背景正常(背景覆盖边框盒)

2、如果HTML元素背景,BODY元素饿背景覆盖画布


这个规则是为了在高度不够的情况下,设置整个网页的背景

四、关于画布canvas背景图片

背景图片整体的规则和背景颜色是一样的,给body设置背景的时候,如果html元素没有设置背景,那么body设置的背景是覆盖画布的


给body元素设置背景图

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8">
<title>body元背景图片</title>
<style>
    body{
        background: url("http://www.ruyic.com/blog/uploads/image/202201/164242168139798.jpg");
        width: 100px;
        height: 100px;
        border: 2px dashed #fff;
    }
</style>
</head>
<body>

</body>
</html>

背景图覆盖整个画布,无视body元素的尺寸


给html元素设置背景色

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>body背景图片</title>
<style>
    html{
        background-color: lightblue;
    }
    body{
        background: url("http://www.ruyic.com/blog/uploads/image/202201/164242168139798.jpg");
        width: 100px;
        height: 100px;
        border: 2px dashed #fff;
    }
</style>
</head>
<body>

</body>
</html>

body背景图片又正常了,覆盖的是边框盒



接下来两个属性

1、背景图的尺寸 background-size

1).  背景图的宽度百分百比,是相对于视口的宽度(不是相对于画布)

2).  背景图的高度百分百比,相对于于HTML元素的高度(也就是网页高度)

3).  背景图的横向上的位置,百分比,预设值、相对于视口的

4).  背景图的纵向位置,百分比、预设值、是相对于网页高度(html元素)


因为背景图太大,我们设置背景图的尺寸  background-size: 100%;  横向撑满,纵向自适应

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8">
<title>body背景图片</title>
<style>
    body{
        background: url("http://www.ruyic.com/blog/uploads/image/202201/164242168139798.jpg") no-repeat;
        width: 100px;
        height: 100px;
        border: 2px dashed #008c8c;
        
        /* 设置背景图的尺寸 */
        background-size: 100%;
    }
</style>
</head>
<body>

</body>
</html>

好像没有什么问题


接着看

把body的宽度设置3000像素,画布canvas的宽度也是3000像素,

画布canvas的宽度最小为视口宽度,现在超过了视口宽度,那么画布也会自动进行延伸,正常情况下是这样的

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>body背景图片</title>
<style>
    body{
        background: url("http://www.ruyic.com/blog/uploads/image/202201/164242168139798.jpg") no-repeat;
        width: 3000px; /* 设置背景图的尺寸 */
        height: 100px;
        border: 2px dashed #008c8c;
        background-size: 100%;
    }
</style>
</head>
<body>

</body>
</html>

横向的滚动条出现,右边没有背景了


背景图的宽度百分比,是相对于视口的宽度(不是相对于画布)

这里说的是非正常情况(body的背景图,或html元素的背景图),正常情况是相对于元素的边框盒,


这是第一个坑,下面是第二个坑


设置背景图高度百分比  background-size: 100% 100% 

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8">
<title>body背景图片</title>
<style>
    body{
        background: url("http://www.ruyic.com/blog/uploads/image/202201/164242168139798.jpg") no-repeat;
        width: 3000px;
        height: 100px;
        border: 2px dashed #008c8c;
        
        /* 设置背景图的尺寸高度百分比 */
        background-size: 100% 100%;
    }
</style>
</head>
<body>

</body>
</html>

看效果

宽度是相对视口,高度是相对于HTML元素


背景图的高度百分百比,相对于于HTML元素的高度,也就是网页高度,

不是画布的高度,也不是视口高度,是网页的高度

2、背景图的位置 background-position

设置靠右  background-position: right;  位置相对的是视口

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>body背景图片</title>
<style>
    body{
        background: url("http://www.ruyic.com/blog/uploads/image/202201/164242168139798.jpg") no-repeat;
        width: 3000px;
        height: 100px;
        border: 2px dashed #008c8c;
        background-size: 50%; /* 宽度设置为50% */
        
        background-position: right;  /* 位置靠左 */
    }
</style>
</head>
<body>

</body>
</html>


 background-position: center top;  垂直设置为top,横线设置居中center,center相对的是视口的中心

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>body背景图片</title>
<style>
    body{
        background: url("http://www.ruyic.com/blog/uploads/image/202201/164242168139798.jpg") no-repeat;
        width: 3000px;
        height: 100px;
        border: 2px dashed #008c8c;
        background-size: 50%;
        
        background-position: center top;
    }
</style>
</head>
<body>

</body>
</html>


background-position: 10% top;  横向百分之十,也是相对于视口的

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>body背景图片</title>
<style>
    body{
        background: url("http://www.ruyic.com/blog/uploads/image/202201/164242168139798.jpg") no-repeat;
        width: 3000px;
        height: 100px;
        border: 2px dashed #008c8c;
        background-size: 50%; /* 就设置宽度,高度自适应 */
        
        background-position: 10% top;
    }
</style>
</head>
<body>

</body>
</html>


接下来看纵向的,设置纵向的center

background-position: left center;  背景图的center相对的是网页的高度(html元素),根body、视口没有关系

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>body背景图片</title>
<style>
    body{
        margin-top: 200px; /* 为了看的更清楚,设置margin-top */
        background: url("http://www.ruyic.com/blog/uploads/image/202201/164242168139798.jpg") no-repeat;
        width: 3000px;
        height: 100px;
        border: 2px dashed #008c8c;
        background-size: 50%; /* 就设置宽度,高度自适应 */
        
        background-position: left center;
    }
</style>
</head>
<body>

</body>
</html>


这一切都是不正常的,除非给html设置背景,body元素正常了,不然body元素一切都不正常

一般我们平时不会出现横线滚动条,不会出现这些坑


Leave a comment 0 Comments.

Leave a Reply

换一张