CSS-03

148 阅读13分钟

CSS特性

  1. CSS属性继承
    常见的font-size/font-family/font-weight/line-height/color/text-align都具有继承性
    默认继承:
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    /* h1, p, span, strong {
      color: red;
    } */
    div.box {
      color: red;
    }

  </style>
</head>
<body>
  
  <div class="box">
    <h1>我是h1元素</h1>
    <p>
      我是p元素
      <span>哈哈哈</span>
      <strong>呵呵呵</strong>
    </p>
    <span>我是span元素</span>
  </div>

</body>
</html>

继承性继承的是父类的计算值,而不是设置值

<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .box {
      color: red;
      /* font-size: 30px; */
      /* 相对于自身字体(父元素的字体) */
      /* 浏览器 16px */
      font-size: 2em;/* 32px */
    }

    p {
      /* p元素继承了父类的32px */
      /* font-size: 2em; */
    }
  </style>
</head>
<body>
  
  <div class="box">
    box本身的内容
    <p>我是p元素</p>
  </div>

</body>
</html>

强制继承,并不是所有属性都有继承性的,如果想要父类的某个属性,这个属性又没有继承性,则可以强制继承,但是不常用

<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .box {
      color: red;

      border: 2px solid purple;
    }

    .box p {
      /* 很少用 */
      border: inherit;
    }
  </style>
</head>
<body>
  
  <div class="box">
    <p>我是p元素</p>
    <h1>我是h1元素</h1>
  </div>

</body>
</html>
  1. CSS属性层叠
    在一个项目中,一个元素的某个CSS属性可能会被设置多次不同的值,但是最后只能有一个生效,这就是属性的层叠性。
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    div {
      color: red;
    }

    .box {
      color: blue;
    }

    .one {
      color: green;
    }

    .first {
      color: purple;
    }

    .content {
      color: orange;
    }
  </style>
</head>
<body>

  <div class="box one first content">我是box</div>

</body>
</html>

在权重相同的情况下,后面会覆盖前面的(上面的代码就是权重相同的情况下);如果权重不同,则权重高的会生效。

<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>

  <!-- 
     !important:10000
     内联样式:1000
     id选择器:100
     类选择器、属性选择器、伪类:10
     元素选择器、伪元素:1
     通配符:0
    继承非选择器,但是它的优先级最低
   -->
  
  <style>
    div.box {
      color: red !important; /* 10000 */
    }

    /* id选择器: 100 */
    #main {
      color: orange;
    }

    /* 类选择器: 10 */
    .box {
      color: blue;
    }

    /* 元素选择器: 1 */
    div {
      color: purple;
    }

    /* 通配选择器: 0 */
    * {
      color: yellow;
    }
  </style>
</head>
<body>
  
  <!-- 内联样式: 1000 -->
  <div id="main" class="box one two" style="color: blue;">我是div元素</div>

</body>
</html>
  1. HTML元素的类型
    (一) 块级元素:独占父元素的一整行,如div,h1,p...
    (二) 行内级元素:多个行内元素可以在父元素的同一行显示,如img,span...

  2. 修改HTML元素类型---display
    元素与元素之间其实没有区别,div之所以是块级元素,占据父元素的一整行,是因为浏览器默认给div加上了display:block属性,让div成为了父元素;span标签也可以设置display:block属性成为一个块级元素,当然div设置display:inline也能成为span一样的行内元素。
    display除了以上两个属性值,还有其他属性值:
    1). inline-block: 让元素同时拥有行内级元素和块级元素的特点,称为行内块元素
    2). none: 隐藏元素
    块级元素除了独占一行这个特点外,还有可以设置宽高的特点(设置宽高任然独占一行,原因是块级元素的右外边距为auto,当元素有宽度时,会将除了自身宽度以外的值赋值给它),这点行内级非替换元素是没有的,行内级非替换元素设置宽高无效。
    如果想让行内级非替换元素可以设置宽高,且行内级特点(多个行内级元素可以在同一行显示)不变的情况下,可以将元素的display设置为inline-block;

  3. 元素隐藏
    (1) 方式一:display:none ---元素不显示出来, 并且也不占据位置, 不占据任何空间(和不存在一样)
    (2) 方式二:visibility:hidden ---元素不可见,但是会占据元素原本的位置
    (3) 方式三:rgba设置颜色,将a的值设为0,不影响子元素;本质就是设置背景颜色透明,只能看见子元素
    (4) 方式四:opacity设置透明度, 设置为0;子元素也跟着透明

  4. CSS属性-overflow
    overflow用于控制内容溢出时的行为
     visible:溢出的内容照样可见
     hidden:溢出的内容直接裁剪
     scroll:溢出的内容被裁剪,但可以通过滚动机制查看;会一直显示滚动条区域,滚动条区域占用的空间属于width、height
     auto:自动根据内容是否溢出来决定是否提供滚动机制

<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .box {
      width: 300px;
      height: 100px;
      background-color: #f00;

      /* overflow: visible */
      overflow: auto;
    }
  </style>
</head>
<body>
  
  <div class="box">
    从充满历史气息的传统对称式花园,到各地功能与美感俱佳的小小菜园,再到与大艺术家们设计园林的邂逅,还是蒙顿·唐,说着一口流利的法语,寻访法国的每个角落,让人领略到原汁原味的法国风情,体会法国人融入骨子里的浪漫与优雅。
  </div>

</body>
</html>

盒子模型

HTML中的每个元素其实都可以看作是一个盒子,一个盒子具有以下四个属性

  1. 内容:width/height
    设置盒子的内容是通过高度和宽度设置,width默认宽度为auto(理解为什么块级元素独占父元素一行),且行内非替换元素设置width是无效的。
  2. 内边距:padding
    通常设置内容和边框之间的间距
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .box {
      /* 设置一个红色的实体边框 */
      border: 1px solid red;
      display: inline-block;

      /* 设置行高也能达到设置内边距一样的效果,但是设置行高终归是设置内容的 */
      /* line-height */
      /* line-height: 36px; */

      /* 内边距: padding */
      /* padding-top: 10px;
      padding-right: 20px;
      padding-bottom: 30px;
      padding-left: 40px; */

      /* 等价于: 缩写属性 */
      padding: 10px 20px 30px 40px;

      /* 其他值的情况 */
      /* 3个值 */
      /* 省略left -> 使用right */
      padding: 10px 20px 30px;
      /* 2个值 */
      /* 省略: left -> 使用right */
      /* 省略: bottom -> 使用top */
      padding: 10px 20px;
      /* 1个值 */
      /* 上下左右都使用同一个值 */
      padding: 10px;
    }
  </style>
</head>
<body>
  
  <div class="box">我是box</div>

</body>
</html>
  1. border
    与padding/width/height略有不同,它可以设置四个方向的宽度,颜色,样式;
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .box {
      display: inline-block;

      width: 300px;
      height: 300px;

      /* width */
      /* border-top-width: 10px;
      border-right-width: 20px;
      border-bottom-width: 30px;
      border-left-width: 40px; */
      /* border-width: 10px 20px 30px 40px; */

      /* style */
      /* border-top-style: solid;
      border-right-style: dashed;
      border-bottom-style: groove;
      border-left-style: ridge; */
      /* border-style: solid dashed groove ridge; */

      /* color */
      /* border-top-color: red;
      border-right-color: blue;
      border-bottom-color: green;
      border-left-color: orange; */
      /* border-color: red blue green orange; */

      /* 总缩写属性 */
      border: 10px solid red;
    }
  </style>
</head>
<body>
  
  <div class="box">我是box</div>

</body>
</html>
  1. border-radius
    设置盒子圆角的
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>

    div {
      width: 180px;
      height: 100px;
      background-color: #f00;

      border: 10px solid green;
    }

    .box {
      /* 设置圆角 */
      /* 设置具体的数值 */
      /* border-radius: 20px; */
      /* 设置百分比 */
      /* 百分比相对于谁, 了解即可 */
      /* 该处的百分比相对于:盒子的具体宽度(包括width,border,padding) 以及具体的高度 */
      border-radius: 10%;
    }

    .content {
      border-radius: 20px;
    }

    .home {
      width: 100px;
      height: 100px;
      border: 10px solid red;
      background-color: #0f0;

      border-radius: 50%;
    }
  </style>
</head>
<body>
  
  <div class="box"></div>
  <div class="content"></div>


  <div class="home"></div>

</body>
</html>
  1. margin
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    /* 暂时解决方案:取消盒子之间的默认间距 */
    body {
      font-size: 0;
    }

    .box {
      display: inline-block;
      width: 100px;
      height: 100px;
      background-color: #f00;

      /* margin-bottom: 30px; */
      /* margin-right: 30px; */
    }

    .container {
      display: inline-block;
      width: 100px;
      height: 100px;
      background-color: #0f0;

      /* margin-top: 30px; */
      /* margin-left: 30px; */

      /* 缩写属性 */
      margin: 10 20px;
    }
  </style>
</head>
<body>
  
  <div class="box"></div>

  <div class="container"></div>

</body>
</html>
  1. padding与margin的对比
    padding是内边距,margin的外边距,他俩貌似没有什么关系,但是当我们设置要让子元素和父元素之间有一定的间距,padding与margin视乎都可以,但是又都有问题。
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .box {
      width: 300px;
      height: 300px;
      background-color: #f00;
      /* 
      父元素设置内边距,如果盒子大小为content-box时,padding会加大盒子的体积
      */
      /* 这个是设置内边距的解决方案 */
      /* padding-left: 30px;
      box-sizing: border-box; */

      /* 这个是子元素设置外边距的解决方案 */
      /* overflow: auto; */
      padding-top: 100px;

      box-sizing: border-box;

    }

    .container {
      width: 100px;
      height: 100px;
      background-color: #0f0;
      margin-left: 100px;
      /* 如果子元素设置margin时,设置上外边距时,父元素则会一起下调(这与给父元素设置margin-top无异),这也是一个问题 */
      /* margin-top: 100px; */
    }

    /* 
      总结:虽然这种问题有两个解决方案,且每个解决方案都有自己的问题
      一般来说,margin设置的是外边距,其实更倾向于兄弟之间的距离
      而padding是内边距,在这里其实更适合使用内边距
    
    */
  </style>
</head>
<body>
  
  <div class="box">
    <div class="container"></div>
  </div>

</body>
</html>
  1. margin上下传递问题
    margin左右不传递
    margin-top传递:如果块级元素的顶部线和父元素的顶部线重叠,那么这个块级元素的margin-top值会传递给父元素
    margin-bottom传递:如果块级元素的底部线和父元素的底部线重写,并且父元素的高度是auto,那么这个块级元素的margin-bottom值会传递给父元素
    解决方案 :
    (1). 设置边框(border):在父元素上设置边框可以阻止margin的传递。但请注意,这会增加额外的宽度。
    (2). 使用BFC(块级格式化上下文):BFC可以防止margin的传递。通过触发BFC,可以解决margin的传递问题。
    (3). 明确高度:为父元素设置明确的高度可以避免margin的传递。

  2. margin上下折叠问题
    Margin折叠现象:垂直方向上相邻的两个margin可能会合并成一个margin。
    折叠分为两种情况:相邻的两个元素之间的折叠和父子元素之间的折叠。折叠后,会把两个值进行比较,最后取那个相对比较大的值。
    防止Margin折叠的方法

  • 给相邻的盒子分别设置bottom margin。
  • 给父元素设置明确的高度。
  • 避免在相邻的元素或父子元素之间使用相同的margin值。
  1. 块级元素水平居中 块级元素居中的原理 :当块级元素的左右边距(margin)都设置为auto时,浏览器会自动分配剩余空间,实现居中效果。块级元素默认占据整行,因此当左右边距都设置为auto时,浏览器会将剩余空间平均分配,实现居中。 块级元素居中的方法
    方法一:将块级元素的左右边距(margin)都设置为auto。 方法二:将块级元素的父元素设置为display: flex或display: grid,并使用justify-content或align-items属性实现居中。 方法三:使用CSS的transform属性实现居中。 块级元素居中的注意事项 :块级元素居中时,要确保父元素有足够的宽度。在使用transform属性实现居中时,要注意兼容性问题。
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    body {
      margin: 0;
      padding: 0;

      /* inline-level box */
      /* 行内级: 行内非替换元素span/a 行内替换元素 img input inline-block */
      /* text-align: center; */
    }

    .container {
      width: 800px;
      height: 150px;
      background-color: #0f0;
    }

    .box {
      width: 100px;
      height: 100px;
      background-color: #f00;

      margin: 0 auto;
    }
  </style>
</head>
<body>
  
  <div class="container">
    <div class="box"></div>
  </div>

</body>
</html>
  1. outline外轮廓
  • 外轮廓是元素边框外部的一个轮廓,不占用空间,不影响布局。
  • 外轮廓可以用来突出显示元素,常用于可点击元素的视觉效果。
  • 可以设置外轮廓的宽度、样式和颜色。
  • 外轮廓可以通过outline属性进行设置。
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .box {
      width: 100px;
      height: 100px;
      background-color: #f00;

      border: 50px solid orange;
      padding: 30px;

      outline: 30px solid #0f0;
    }

    /* 行内级元素设置margin-top无效 */
    a {
      margin-top: 100px;
      display: inline-block;

      outline: none;
    }

    input {
      outline: none;
    }

    /* a:focus {
      outline: none;
    } */
  </style>
</head>
<body>
  
  <div class="box"></div>

  <a href="#">百度一下</a>
  <input type="text">

</body>
</html>
  1. 阴影-box-shadow
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .box {
      width: 100px;
      height: 100px;
      background-color: #f00;
      /* 
      x轴偏移量
      y轴偏移量
      模糊度
      扩散半径
      颜色
      outset:向内扩散(默认向外)
      */
      box-shadow: 5px 5px 10px orange, 10px 10px 10px green;
    }
  </style>
</head>
<body>
  
  <div class="box"></div>

</body>
</html>
  1. 文字阴影

知识点1:text-shadow的基本概念

- text-shadow用于给文本添加阴影效果,增强视觉层次感。
- text-shadow可以设置阴影的水平偏移、垂直偏移、模糊距离和颜色。   

知识点2:text-shadow的属性值

- 水平偏移:决定阴影在水平方向上的位置,可以为正数或负数。
- 垂直偏移:决定阴影在垂直方向上的位置,可以为正数或负数。
- 模糊距离:决定阴影的模糊程度,值越大,阴影越模糊。
- 颜色:设置阴影的颜色。   

知识点3:text-shadow的多个阴影效果

- 可以为同一个文本设置多个text-shadow效果,通过逗号分隔每个阴影的属性值。
- 多个阴影会按照从上到下、从左到右的顺序叠加显示。   

知识点4:text-shadow的特殊之处

- text-shadow没有向外延伸(spread)的属性值,因此不能设置阴影的扩展半径。
- text-shadow没有“inset”值,因此阴影不会向内偏移。   

知识点5:text-shadow的浏览器兼容性

- text-shadow在主流浏览器中具有良好的兼容性,但在一些较旧或非主流浏览器中可能不支持。
- 为了确保跨浏览器的兼容性,可以使用前缀版本,如-webkit-、-moz-、-ms-等。   

13. CSS盒子模型中的行内非替换元素

知识点1:行内非替换元素的特性- 宽度和高度不生效,无法改变元素的大小。

- padding属性上下特殊,撑大内容但不占据空间,左右撑大占据空间。
- border属性上下特殊,撑起元素但不占据空间,左右撑大占据空间。
- margin属性上下不生效,不会影响其他元素,左右生效。
- merging属性上下不生效,无法合并边距。

知识点2:行内非替换元素的适用场景- 用于内联元素,如文本、链接等。

- 用于需要与其他内容在同一行显示的元素。

知识点3:行内非替换元素的注意事项

- 在设置盒子模型属性时要特别小心,尤其是上下方向的属性。
- 避免破坏段落的美感,避免设置不必要的边距和边框。

知识点4:行内非替换元素的浏览器兼容性

- 在主流浏览器中具有良好的兼容性,但在一些较旧或非主流浏览器中可能不支持。
- 为了确保跨浏览器的兼容性,可以使用前缀版本,如-webkit-、-moz-、-ms-等。
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .content {
      background-color: #f00;
      color: white;

      /* 内容: width/height(压根不生效) */
      width: 300px;
      height: 300px;

      /* 内边距: padding */
      /* 特殊: 上下会被撑起来, 但是不占据空间 */
      /* padding: 50px; */

      /* 边框: border */
      /* 特殊: 上下会被撑起来, 但是不占据空间 */
      /* border: 50px solid orange; */

      /* 外边距: margin */
      /* 特殊: 上下的margin是不生效的 */
      margin: 50px;
    }
  </style>
</head>
<body>
  
  <span class="content">
    我是span内容, 哈哈哈
  </span>
  aaaaaaa
  <div>bbbbbb</div>

</body>
</html>