CSS学习

265 阅读10分钟

CSS单位

em

  • 为css的相对单位,参照其父元素的fontSize;等于父元素的fontSize*em值
  • 如果没有设置父元素的font-size;则参照html元素的font-size值;没有html则参照浏览器一般字体大小值16px。

rem

  • 即:root em
  • rem也是css中相对单位,参照html的fontSize,没有则参照16px。
    • html:fontSize:12px ; fontSize:2rem==>24px
style{
    html{font-size:24px}
    div{height:10rem,width:10rem}
}
//div的宽高则都是240px,rem基于html的fontSize来的。
<html> <div>123</div> </html>

margin-top

注意点:即使div高度为0,设置了margin-top,上边距会占据文档流。

margin重叠

上下两个元素的margin重叠

  • 场景:

    • 如果上面的div元素设置了margin-bottom;下面的div元素设置了margin-top:会造成margin重叠,文档流两个div元素之间只会显示较大值得那个margin-bottom或margin-top的空间。
  • 上下两个元素的margin重叠的用处

    • 一个页面,多个上下排列的模块,中间有间隔的,做统一的设置
  • 代码

    .wrap{
        width: 100px;
        height: 100px;
        border: 1px dashed red;
        font-size: 10px;
    }
    .test1{
        background-color: pink;
        width: 100px;
        height: 100px;
        margin-bottom: 20px;
    }
    .test2{
        background-color: yellow;
        width: 100px;
        height: 100px;
        margin-top: 20px;
    }
    
    <div class="wrap">
        <div class="test1">margin-bottom: 20px;</div>
        <div class="test2">margin-top: 20px;</div>
    </div>
    
  • 效果演示:

margin重叠.png

父元素的上边距重叠

  • 说明:

    • 父元素和子元素都设置了marginTop则会marginTop重叠,显示高的那个
  • 场景

    • 场景1:
      • 父元素没有marginTop,第一个子元素marginTop:20px
      • 则父元素的上边距为20px;

    父元素的上边距.png

    • 场景2:

      • 父元素marginTop:20px,第一个子元素marginTop:20px
      • 则父元素的上边距为20px;margin重叠了
    • 场景3:

      • 父元素marginTop:20px,第一个子元素marginTop:30px
      • 则父元素的上边距为30px;取比较大的那个值
    • 场景4:

      • 父元素没有marginTop,第一个子元素marginTop:20px
      • 父元素有文字内容
      • 则父元素没有上边距 截屏2021-08-29 下午7.10.34.png
  • 解决方法

    1. 父元素不设置marginTop,使用paddingTop,通用
    2. 子元素的marginTop高于父元素的,父元素设置overflow:hidden解决
    3. 浮动元素使用clear:both
    4. 使用first-child方法,:first-child写在子元素上
.wrap{
    margin-top: 20px;
    //去除第一个子元素的样式
    .item1:first-child{
        margin-top:0;
    }
    //子元素
    .item1{
        margin-top:20px;
        width: 100%
    }
}

line-height

  • 属性值
    • 百分比
      • 根据父元素字体大小计算
      • 先计算父元素的行高,然后让子元素继承
      • 行高=16px*150%=24px,子元素继承行高
    • em
      • 根据父元素字体大小计算
      • 先计算父元素的行高,然后让子元素继承
      • 行高=16px*1.5em=24px,子元素继承行高
    • 数字
      • 根据子元素字体大小计算
      • 行高30px*1.5=45px
  • 案例
<div style="line-height:150%;font-size:16px;background-color: rosybrown;">
  父元素内容
  <div style="font-size:30px;background-color: sienna;">
    Web前端开发
  </div>
</div>

background

背景图片

background-image

值:

  • url('') 引入本地图片

理解:

  • 设置元素的背景图片

默认显示效果:

  • 如果图片太大,会充满整个元素,元素的背景可能只会看到图片的一部分
  • 如果图片大小比元素小,则repeat排列在元素的背景
  • 背景图像在不占据border-box,占据content-box/padding-box,background-color之上

图片比元素大的显示

图片比元素小的显示

background-repeat

  • 理解:

    • 应用在background-image的图像上,设置图像的平铺效果,就像平时设置电脑桌面图片一样
  • 值:

    • repeat 【默认】
    • no-repeat 【如下图所示,是了no-repeat之后的效果,background-color出来了】

在这里插入图片描述

background-position

理解:

  • 应用在background-image背景图像上
  • 控制背景图像在背景区域中的起始显示位置

CSS1:

  • 2个参数值
  • 默认值0%,0%;
  • 第一个横坐标,第二个值纵坐标【背景区域的左上角】

三种值方式:

  • xpos ypos: 关键字定位,应用的对齐规则;

    • xpos:
      • left【图像的左边与与元素的左边对齐】
      • center:背景图像的中心与元素的中心对齐
      • right;
  • ypos:top|center|bottom

  • x% y%: 百分比定位,应用坐标轴定位 x = (对象的宽度 - 图像的宽度) * x%;y = (对象的高度 - 图像的高度) * y%; 3 . x y:表示使用长度值定位,应用坐标轴定位;是将背景图像的左上角,放置在对象的背景区域中(x, y)

  • 值可以省略

    • 有一个值:则第二个值是center;
    • 有两个值:第一个是水平偏移【长度或百分比】,第二个垂直偏移【长度或百分比】
    • 所有值得方式都是简写成长度值得方式,默认0px 0px
  • 相关写法:

    • background-position: left 10px top 15px; 【表示图像在左上角区域,且左边偏移10px,上边偏移15px,可以简写成10px 15px】
    • background-position: left top ; 【表示图像在左边边区域,偏移0px,上边偏移0px,可以简写成0px 0px】
    • background-position: left 10px ;【可以简写成:0px 10px】

    background-position

background-size

  • 作用:设置背景图片大小;
  • 初始值:
    • auto auto
    • 以背景图片的比例缩放背景图片
  • 属性值:
    • 一个值:则是宽度值,高度值为auto
    • 两个值:则第一个值为宽度值,第二个值为高度值
  • 属性值的类型:
    • 百分比:相对于背景区域的百分比
    • 长度:具体的带单位的长度
    • 关键字:
      • auto:以背景图片的比例缩放背景图片;如果背景图片比背景区域大很多,如果不设置background-size,则只会看到图片的左上角区域;
      • contain
      • cover

背景图片代码和显示效果:

代码含义
不设置background-size;则使用默认值background-size:auto auto不缩放背景图片。如果背景图片和背景区域大小不一致:1. 如果背景图片大,则背景区域只会显示图片的左上角部分,2. 如果背景图片小,则背景区域全部包含了图片,出现空白处,显示背景颜色
background-size: 100% 0.7rem;设置背景图片的具体高度为0.7rem
background-size: 3rem;设置背景图片的宽度为3rem,高度为auto(根据背景图片的比例缩放图片)
background-size: 100% 0.7rem;设置背景的具体高度为0.7rem
background-size: cover;与contain正相反,图片覆盖了背景区域 1.背景图片被缩放 2. 保留了图片的宽高比,不会被压扁 3.图片宽或高会被剪裁 4. 如果图片和背景区域大小不一致,4.1)如果图片大与背景区域且全部的图片的高覆盖了背景区域,则图片的宽度被剪裁,如果图片全部的宽覆盖了背景区域,图片的高会被剪裁 4.2)图片小于背景区域,则背景图片会全部填满背景区域
background-size: contain;与cover正相反,图片包含在背景区域中,出现空白处 1. 背景图片会被缩放 2. 保留了图片的宽高比,不会被压扁 3. 图片不会被剪裁 4. 如果图片和背景区域大小不一致:情况1:如果图片大与背景区域,会出现空白处,显示背景颜色。 情况2:背景图片小与背景区域区域,则背景图片会全部填满背景区域

根据案例查看样式效果

比如:

  • 背景图片比元素大
  • 元素大小:200*100;
  • 背景图片500*200;

代码:

//样式
<style>
  .wrap{
    color: blue;
    width: 200px;
    height: 100px;
    border: 10px dashed red;
    background-color: yellow;
    background-image: url('./img/500.png') ;
    background-repeat: no-repeat;
    }
</style>
//元素
 <div class="wrap">
   <div>元素大小:200*100</div>
   <div>背景图片:500*200</div>
   <div>background-color: yellow</div>
 </div>

原图片:

500.png

不设置background-size的情况下,取默认值

  • 没有设置background-size;则默认background-size: auto auto; 即图片原始大小,不会进行缩放。

不设置background-size,查看样式为:

默认值.png

设置background-size: cover

  • cover英文意思:覆盖,盖住;指背景图片覆盖了整个背景区域 特点:
  • 背景图片被缩放,图片的宽或者高覆盖背景区域
  • 图片不会被压扁,保留了原来的宽高比
  • 图片的宽或者高被剪裁,如果图片高覆盖的背景区域,图片宽度就会被剪裁 查看效果:

cover.png

设置background-size: contain

  • contain英文翻译:包含,容纳;指的全部的背景图片包含在整个背景区域中 特点:

  • 图片被等比例缩放

  • 保留了图片的宽高比

  • 图片全部被包含在背景区域

  • 图片和背景区域大小不同时,背景区域会出现空白处,显示背景颜色

  • 不会被剪裁,永远显示完整的背景图片

查看效果:

contain.png

截屏2021-08-29 下午5.26.42.png

背景图片与背景区域一样大小

效果:背景图片填满背景区域

截屏2021-08-29 下午5.20.19.png

背景图片小于背景区域:设置cover

背景图片宽度等于背景区域,但高度 效果

背景图片小于背景区域:设置contain

  • 案例

    • 背景区域宽度等于图片
    • 高度大于图片
  • 效果:

    • 图片为原来尺寸
    • 背景图片完整的包含在背景区域中
    • 背景区域高度出现空白处,,显示背景颜色 图片小于区域contain.png
  • 案例

    • 背景区域宽度大于图片
    • 高度等于图片
  • 效果

    • 图片为原来尺寸
    • 背景图片完整的包含在背景区域中
    • 背景区域宽度出现空白处,显示背景颜色

背景区域宽度大于图片.png

  • 案例
    • 背景区域宽度和高度都大于图片
  • 效果
    • 图片被等比例放大
    • 背景图片完整的包含在背景区域中
    • 背景区域宽度大于高度,所以宽度完整的被图片填满,高度出现空白处
    • 此处规律MDN解释:最大的包含背景区域

背景区域宽高都大于图片.png

背景图片和渐变同时存在

方法1: 使用background写组合属性

//写法
.bar {
       width: 50px; height: 100px;
       background-image: gradient(...);

       /* 不推荐 */
       background-size: 25px;
       background-size: 50%;
       background-size: auto 50px;
       background-size: auto 50%;

       /* 可行 */
       background-size: 25px 50px;
       background-size: 50% 50%;
}

案例:

.wrap{
    color: blue;
    width: 700px;
    height: 400px;
    border: 1px solid;
    background: url('./img/500.png') 100% 100% no-repeat , 
    linear-gradient(90deg, rgb(173, 165, 90) 0%, rgba(73, 71, 110, 1) 100%);
    background-position: left top;
}

背景图片和渐变同在.png 效果演示:

方法2 将背景图片写在伪类上

  • 渐变写在元素上
  • 背景图片写在元素伪类上
.product {
    width: 6.86rem;
    height: 4.48rem;
    background: linear-gradient(90deg, rgb(173, 165, 90) 0%, rgba(73, 71, 110, 1) 100%);
    &::before{
        position: absolute;
        content: ' ';
        left:0;
        top: 0;
        width: 100%;
        height: 100%;
        background-image: url('./img/4.png') no-repeat;
        /* 注意点 */
        background-size: 50%;
        background-position: top center;
    }
}

注意点: 如果UI给的背景图片比元素尺寸大,则使用background-size: 50%; 缩小图片的比例来适配元素宽高

手写CSS:background案例

不规则卡片效果 radial-gradient函数的效果

    <style>
      main {
        padding: 80px 0px;
        display: flex;
        flex-wrap: wrap;
        justify-content: space-around;
      }

      .progress-outer {
        width: 60%;
        height: 12px;
        border-radius: 8px;
        /* background-color: pink; */
        overflow: hidden;
        position: relative;
      }

      .progress-enter {
        height: inherit;
        background: rgba(180, 160, 120, .2);
      }

      .progress-bg {
        width: 60%;
        height: inherit;
        border-radius: 6px;
        background: repeating-linear-gradient(-45deg, #D9CFBB 25%, #C3B393 0, #C3B393 50%,
            #D9CFBB 0, #D9CFBB 75%, #C3B393 0);
        background-size: 16px 16px;
        animation: panoramic 20s linear infinite;
      }

      @keyframes panoramic {
        to {
          background-position: 200% 0;
        }
      }

    </style>
<main>
  <div class="progress-outer">
    <!--更好的扩展-->
    <div class="progress-enter">
      <div class="progress-bg"></div>
    </div>
    <!-- <span>60%</span> -->
  </div>
</main>

radial-gradient函数

属于background-image属性,border之下,background-color之上

理解

radial-gradient() 径向渐变函数,CSS函数创建一个图像,该图像是由从原点发出的两种或多种颜色之间的逐步过渡组成的,他的形状是圆形或椭圆形 重复的径向渐变函数:repeating-radial-gradient()


滚动条

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

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    ::-webkit-scrollbar {

      display: none
    }
  </style>
</head>

<body>
  <div style=" width:200px; height: 200px; overflow-y: scroll;">

    ckidzhh<br />

    ckidzhh<br />

    ckidzhh<br />

    ckidzhh<br />

    ckidzhh<br />

    ckidzhh<br />

    ckidzhh<br />

    ckidzhh<br />

    ckidzhh<br />

    ckidzhh<br />

    ckidzhh<br />

    ckidzhh<br />

    ckidzhh<br />

  </div>
</body>

</html>

面试题

如何实现左侧宽度固定,右侧宽度自适应的布局

小提示:这个问题面试官会要求说出几种解决方法。