博客列表 >9月3日作业(相邻选择器、兄弟选择器、伪类选择器、padding对于盒模型的影响以及margin对于盒模型的影响)

9月3日作业(相邻选择器、兄弟选择器、伪类选择器、padding对于盒模型的影响以及margin对于盒模型的影响)

卢骏的博客
卢骏的博客原创
2019年09月15日 15:55:57391浏览

9月3日作业:
1. 实例演示相邻选择器与兄弟选择器,并分析异同

为了实例演示出相邻选择器和兄弟选择器的功能,我们设计了10个li标签组成的小球,其中,1、3、4、5、6号小球被定义为class=“bg-green”,2号小球被定义为id=“bg-blue”

实例

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="css/style.css">
    <title>伪类中子元素选择器和类型选择器的差异</title>
</head>

<body>
    <ul>
        <li class="bg-green">1</li>
        <li id="bg-blue">2</li>
        <li class="bg-green">3</li>
        <li class="bg-green">4</li>
        <li class="bg-green">5</li>
        <li class="bg-green">6</li>
        <li>7</li>
        <li>8</li>
        <li>9</li>
        <li>10</li>
    </ul>


</body>

</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例

通过群组选择器,我们将这6个小球都定义为蓝色边框

#bg-blue, .bg-green {
    border: 2px solid blue;
}

1.png

通过定义相邻选择器

#bg-blue + * {
    background-color: yellow;
}

第2个li标签的下一个相邻标签,也就是第3个li标签背景颜色将被定义为黄色,结果如下:

2.png

我们可以看到,如果将+替换为~,与#bg-blue相邻的同级元素(第3个开始的同一级的元素,背景色全部变为灰色。)

#bg-blue ~ * {

    background-color: grey;
}

而我们这里也需要特别注意,兄弟选择器的属性优先级高于相邻选择器,我们可以注意到,#bg-blue的黄色背景被灰色背景替换了。

4.png

总结:相邻选择器和兄弟选择器是对相邻元素的选择定义,可以理解为与他相邻的下一个元素定义属性值,相邻选择器一般采用“ 选择器 + * {   }”方式定义,只能针对下一个元素定义属性值;

兄弟选择器是对选择器相邻的(下一个的)所有同级元素的定义,一般来说,兄弟选择器采用 “ 选择器 ~ * {    }”方式定义,可将属性值应用到相邻同级的全部元素上 。

2. 实例演示:nth-child() 和 :nth-of-type()选择器,并分析异同

nth-child() 和 :nth-of-type() 同属于伪类选择器,其中:

:nth-child() 属于子类选择器,从字面上看,child可以理解为对于子元素的控制,()是指定的子元素位置,从1开始;

还是以上面的小球举例,我们针对ul标签下的子元素进行定义,下面共计10个标签,我们选择将其中的第5个子元素的背景颜色改为亮粉色,只需要:

/* 伪类:子元素选择器,如果我们需要指定第几个,采用:nth-child(),其中()内填入的就是第几个,此处是从1开始 */
/* 例如,我们希望对第5个球的背景色指定为lightpink,可以改为 */
ul :nth-child(5) {
    background-color: lightpink;
}

5.png

:nth-of-type() 属于类型选择器,of-type可以从字面上理解为对于同类型的元素的选择,同样()也是对于元素的索引,从1开始,例如,我们针对li类型的第5个li元素的背景和字体颜色进行设置。

ul li:nth-of-type(5) {
    background-color: gray;
    color: white;
}

6.png

在实际使用中,如果关注点在于位置,那么采用:nth-child() 即可,如果既关注位置,又关注类型,采用:nth-of-type()。


3. 实例演示:padding 对盒子大小的影响与解决方案, 使用宽度分离或box-sizing

我们首先设置了一个宽度为400px的div,然后将一张300像素的图片放置到容器中,并将padding设置为50px,从理论上,图片将会居中显示,但实际情况却不是,padding将容易撑大了,增加了100个px。

<body>
    <div class="box1">
        <img src="images/girl.jpeg" alt="妹纸" width="300">
    </div>
</body>
.box1 {
    width: 400px;
    border: 1px solid black;
    background-color: lightgreen;
}
.box1 {
    padding: 50px;
    /* width: 300px; */
}

1.png

在本例中,如果我们需要将将图片居中显示,而又不改变显示效果的情况下,有三种方式:

a、采用修改div容器的大小,将box1的宽度改成300px,与图片相同,再周边增加50的padding值,最后时限400像素容器,图片居中显示的效果。

.box1 {
    width: 300px;
    border: 1px solid black;
    background-color: lightgreen;
}
.box1 {
    padding: 50px;
    /* width: 300px; */
}


2.png

b、采用宽度分离方式,宽度分离实际是在div的外层再嵌套一个div作为中间件,设置外层div宽度,内层div仅仅设置padding值来实现宽度分离效果,这种方式已经被淘汰,并不建议使用。

    <div class="box1">
        <img src="images/girl.jpeg" alt="妹纸" width="300">
    </div>
    <div class="wrap">
        <div class="box2">
            <img src="images/girl.jpeg" alt="妹纸" width="300">
        </div>
    </div>
.wrap {
    width: 400px;
}
.box2 {
    background-color: lightblue;
    padding: 50px;
    border: 1px solid black;
}

3.png

c、采用box-sizing方法,box-sizing是一种在css3中常见的定义盒模型大小的方式,特点是一旦采用这种方式定义大小,padding和broder等都会被考虑进去,padding挤压出多余宽度高度的情况被有效避免,是一种现阶段最常用的定义大小的方式。

    <div class="box1">
        <img src="images/girl.jpeg" alt="妹纸" width="300">
    </div>
    <div class="wrap">
        <div class="box2">
            <img src="images/girl.jpeg" alt="妹纸" width="300">
        </div>
    </div>
    <div class="box3">
        <img src="images/girl.jpeg" alt="妹纸" width="300">
    </div>
/* box-sizing */
.box3 {
    width: 400px;
    box-sizing: border-box;
    padding: 50px;
    background-color: bisque;
    border: 1px solid black;
}

4.png

4. 实例演示: margin中的同级塌陷, 嵌套传递与自动挤压, 并提出解决方案或应用场景

当出现上下两个并列的div块,上面div的margin-bottom和下面div的margin-top会塌陷,也就是会取上下两者margin里最大值作为显示值,例如在本例子中,当box1的外边距为50像素,box2的上外边距为30像素时,两个box之间的间距并非50+30,而是取其中最大的50px作为值。

    <!-- 1.同级塌陷; 2.嵌套传递; 3.自动挤压。 -->
    <div class="box1"></div>
    <div class="box2"></div>
.box1 {
    width: 100px;
    height: 100px;
    background-color: lightblue;
}
.box2 {
    width: 100px;
    height: 100px;
    background-color: lightcoral;
}
.box1 {
    margin-bottom: 50px;
}
.box2 {
    margin-top: 30px;
}

5.png

b、嵌套传递,是指在当一个div嵌套另一个div时,当设置里面子div的margin值,会传递给父div,例如本例中,div4设置的margin值,会传递给div3,当我们设置div4的margin-top为50px,div4没有如我们的期望的,距离div3的上边框50px,而是和div3一起,距离顶端出现50px。这就是margin的嵌套传递。

    <!-- 2嵌套传递 -->
    <div class="box3">
        <div class="box4"></div>
    </div>
.box3 {
    width: 200px;
    height: 200px;
    background-color: lightblue;
}
.box4 {
    width: 100px;
    height: 100px;
    background-color: lightcoral;
    margin-top: 50px;
}

8.png

如果我们希望将div4距离div3的上边距30px,我们可以采用2种方式解决:

第一种方式是设置div3的padding值,div4的外边距对于他的父级元素div3来说,就是内边距,因此,我们设置DIV3的padding-top即可实现将div4下移。

.box3 {
    width: 200px;
    height: 200px;
    background-color: lightblue;
    padding-top: 50px;
}
.box4 {
    width: 100px;
    height: 100px;
    background-color: lightcoral;
    /* margin-top: 50px; */
}

8.png

从图中我们可以看到,div4已经距离div3的上边距30px,但同时,div3被撑大,为了实现不撑大的效果,我们需要将div3的高度减去增加的50px,将高度设置为150px,可以实现我们希望的效果。

1.png

.box3 {
    width: 200px;
    height: 150px;
    background-color: lightblue;
    padding-top: 50px;
}
.box4 {
    width: 100px;
    height: 100px;
    background-color: lightcoral;
    /* margin-top: 50px; */
}

c、自动挤压,当我们对一个margin设置auto属性时,他会依据我们设置的左右来判断是给左侧还是右侧最大的数值,例如margin-left:auto时,div将会被挤到浏览器的最右侧显示,当margin-right:auto的时候,div将被挤压到最左侧显示。

当我们同时设置margin-left:auto ,margin-right:auto的时候,div将居中显示,一般此时我们会简写为margin:auto

.box5 {
    width: 150px;
    height: 150px;
    background-color: lightblue;
}
.box5 {
    /* margin: auto; 会自动居中*/
    margin-left: auto;
    margin-right: auto;
}


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议