# 非布局样式

# 字体族

serif sans-serif monospace cursive fantasy

  • 多字体 fallback 一级一级往下找
  • 网络字体、自定义字体
  • iconfont
<!DOCTYPE html>
<html>
<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">
    <title>fonts</title>
    <style>
        body{
            /* font-family: "monaco"; */
            /* font-family: "monaco", "PingFang SC"; */
            font-family: "aaaaa", "monaco", "PingFang SC";
        }
        .chinese{
          /* monospace等宽字体 */
            font-family: "PingFang SC", "Microsoft Yahei", monospace;
            /* serif衬线字体 */
            /* font-family: "Microsoft Yahei", serif; */
            /* font-family: "serif"; */
        }
        .weight{
            font-weight: bold;
            font-weight: bolder;
            font-weight: lighter;
            font-weight: normal;
            font-weight: 100;
        }
        /* 自定义字体 iconfont的原理也就是自定义字体*/
        @font-face {
            font-family: "IF";
            src: url("./IndieFlower.ttf");
        }
        .custom-font{
            font-family: IF;
        }
    </style>
</head>
<body class="body" id="body">
    Hello world 你好,世界
    <div class="chinese">你好</div>
    <!-- <div class="weight">你好 Hello World</div> -->
    <div class="custom-font">你好 Hello World</div>
</body>
</html>

# 行高

  • 行高的构成
  • 行高相关的现象和方案
  • 行高的调整

行高会决定上下多余的宽度,会把外面的盒子的高度撑起来。比如下面的代码最外层的盒子的高度inline box这个div会被c3的元素的行高撑起来。

inline的元素背景颜色是根据字体大小进行渲染的。

<!DOCTYPE html>
<html>
<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">
    <title>inline</title>
    <style>
        span{
            background:red;
        }
        .c1{
            line-height: 20px;
        }
        .c2{
            line-height: 8px;
        }
        .c3{
            line-height: 30px;
        }
        .c5{
            line-height: 28px;
        }
        .cc1 {
          font-size: 12px;
        }

        .cc2 {
          font-size: 18px;
        }

        .cc3 {
          font-size: 24px;
        }
    </style>
</head>
<body>
    <div>
        <span class="c1">inline box xfg中文</span>
        <span class="c2">inline box</span>
        <span class="c3">inline box</span>
        inline box
        <span class="c5">inline box</span>
    </div>


  <div style="border:solid 1px red;">
    <span style="background:blue;color:#fff;font-size:20px;line-height:60px;">
      居中xfg&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;
    </span>
  </div>
  <!-- 字体大小不同是按照基线对齐的 -->
  <div class="c1">
    <span class="cc1">第一段</span>
    <span class="cc2">第二段</span>
    <span class="cc3">第三段</span>
  </div>
  <div style="background:red">
    <span>文字</span>
    <img src="test.png" />
  </div>
  <div>
    <div style="float:left">
      <span>第一段</span>
    </div>
    <div style="float:left">
      <span>第二段</span>
    </div>
  </div>
</body>
</html>

如果需要垂直居中,可以设置inline元素的行高来进行实现:

    <div style="border:solid 1px red;">
        <span style="background:blue;color:#fff;font-size:20px;line-height:60px;">
            居中xfg&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;
        </span>
    </div>

如下面的如果子元素的font-size是不同大小的,我们需要子元素居中对齐:可以设置三个子元素的vertical-align为middle,这样就居中显示了。 这个属性vertical-align也可以基于像素的,是基于底线进行移动,比如vertical-align:2px,就是比底部高2px

  <style>
    .cc1 {
      font-size: 12px;
      vertical-align: middle;
    }

    .cc2 {
      font-size: 18px;
      vertical-align: middle;
    }

    .cc3 {
      font-size: 24px;
      vertical-align: middle;
    }
  </style>
  <!-- 字体大小不同是按照基线对齐的 -->
  <div class="c1">
    <span class="cc1">第一段</span>
    <span class="cc2">第二段</span>
    <span class="cc3">第三段</span>
  </div>

下面的代码:会发现照片的底部有一些空隙,img也是一个inline的元素,这是因为图片是以基线的对齐方式,基线到底线的距离就是有一些空隙, 这个空隙是根据字体的大小来决定的,如果字体大小为12px那么空隙大概就是3px;这个就是经典的图片3px问题。这时候我们设置图片的vertical-align:bottom 这样就按照底线对齐方式,空隙就没有了。使用display:block也可以解决。

  <div style="background:red">
    <span>文字</span>
    <img src="test.png" />
  </div>

# 背景

  • 背景颜色
  • 渐变色背景
  • 多背景叠加:css3新增,可以指定多个颜色
  • 背景图片和属性(雪碧图):雪碧图就是吧不同的背景集中到同一张图片当中,减少http请求。
  • base64和性能优化
  • 多分辨率适配

渐变色:

/* 左到右红色到绿色 */
background: linear-gradient(to right, red, green);
/* 角度渐变:默认0deg为从下到上的,45deg从左下角到右下角。90就是从左往右,180是从上往下 */
background: linear-gradient(180deg, red, green);

/* 下面的百分数是指到元素的百分之多少显示什么颜色 ,比如下面的0是代表坐左边最开始的颜色,然后元素10%的位置是绿色*/
background: linear-gradient(135deg, red 0, green 10%, yellow 50%, blue 100%);

/* 多背景的叠加 transparent是透明色*/
background: linear-gradient(135deg, transparent 0, transparent 49.5%, green 49.5%, green 50.5%, transparent 50.5%, transparent 10,
  linear-gradient(45deg, transparent 0, transparent 49.5%, red 49.5%, red 50.5%, transparent 50.5%, transparent 100%);
/* 背景图的大小对渐变色也起作用 */
background-size: 30px 30px;

背景图片的属性

.c1 {
  height: 90px;
  background: red url(./test.png);
  /* 不让图片平铺 */
  background-repeat: no-repeat;
  /* 背景图的位置 -也可以指定为像素*/
  background-position: center center;
  /* 指定背景图的大小 */
  background-size: 100px 50px;
}

雪碧图设置:一般设置background-position来找图片上对应的位置进行展示。一般是负值。 background-position是相对于容器的,如果容器的大小变了,也需要进行改变。

    .c2 {
      width: 20px;
      height: 20px;
      background: url(./test_bg.png) no-repeat;
      background-position: -17px -5px;
      background-size: 261px 113px;
    }

# 边框

  • 边框的属性:线型 大小 颜色
  • 边框背景图
  • 边框衔接(三角形)
/* dotted点状、dashed虚线 */
    .c1 {
      width: 400px;
      height: 200px;
      /* border: 1px solid red; */
      /* border:5px solid red; */
      /* border: 5px dotted red; */
      border: 5px dashed red;
    }
    /* 边框背景图,30 round,30是图片大小,round是按照图片的整数进行显示,不显示半个图片,可能会对图片进行压缩 */
    .c2 {
      width: 400px;
      height: 200px;
      /* border-width: 30px; */
      border: 30px solid transparent;
      border-image: url(./border.png) 30 round;
    }
    /* 一个梯形 */
    .c3 {
      width: 400px;
      height: 200px;
      border-bottom: 30px solid red;
      /* border-right:30px solid blue; */
      border-left: 30px solid transparent;
      border-right: 30px solid transparent;
    }
    /* 一个三角形 */
    .c3 {
      width: 0;
      height: 200px;
      border-bottom: 30px solid red;
      /* border-right:30px solid blue; */
      border-left: 30px solid transparent;
      border-right: 30px solid transparent;
    }

# 滚动

  • 滚动行为和滚动条 visible 滚动条隐藏(文字内容撑出div),hidden 滚动条隐藏(文字不会撑出来),scroll显示滚动条、auto自动显示
.c1{
    background:red;
    height:200px;
    overflow: hidden;
}

# 文字折行

  • overflow-wrap(word-wrap)通用换行控制 是否保留单词,是否换行。
  • word-break 针对多字节文字 是否将一个单词看做一个单位,或者是否将一个字母看做一个单位;中文句子也是单词;
  • white-space 空白处是否断行。
    <style>
        .c1{
            border: 1px solid;
            width: 8em;
            /* 进行换行 */
            overflow-wrap: break-word;
            /* 打断所有单词,keep-all是让所有的单词都是一个单位,比如单词会换行,以及一个句子会换行 */
            word-break: break-all;
            /* 让文本不换行 */
            white-space: nowrap;
        }

    </style>
    <div class="c1">
        This is a long and Supercalifragilisticexpialidocious sentence. 一二三四五六,七八九零一二,这是一句巨长巨长又没有空间可以换行的句子哦。
    </div>

# 装饰性属性以及其他

  • 字重(粗体)font-weight
  • 斜体 font-style:itatic
  • 下划线 text-decoration
  • 指针 cursor
.weight{
    /* 相当于font-weight:400 */
    font-weight: normal;
    /* 相当于font-weight:700 */
    font-weight: bold;
    /* 根据父级元素更粗 */
    font-weight: bolder;
    font-weight: lighter;
    /* 100-900 */
    font-weight: 200;
}

# 处理浏览器兼容 CSS Hack

  • Hack即不合法但生效的写法
  • 主要用于区分不同浏览器
  • 缺点:难理解 难维护 易失效
  • 替代方案:特性检测
  • 替代方案:针对性加class

# 案例

美化checkbox

    .checkbox {}
    .checkbox input {
      display: none;
    }

    /* +代表相邻的兄弟元素 */
    .checkbox input+label {
      background: url(./checkbox1.png) left center no-repeat;
      background-size: 20px 20px;
      padding-left: 20px;
    }
    /* input选中的时候 */
    .checkbox input:checked+label {
      background-image: url(./checkbox2.png);
    }
  </style>

  <div class="checkbox">
    <input type="checkbox" id="handsome" />
    <label for="handsome">我很帅</label>
  </div>

# CSS 面试真题

  • css样式(选择器)的优先级 计算权重、!important、内联样式、后写的优先级

  • 雪碧图的作用 减少HTTP请求数 提高加载性能; 有一些情况下可以减少图片大小

  • 自定义字体的使用场景 宣传、品牌、banner等固定文案 字体图标

  • base64 的使用 减少http请求、适用于小图片、case64的体积约为图片的四分之三

  • 伪类与伪元素 伪类表状态、伪元素时真的有元素,前者单冒号,后者双冒号

  • 美化checkbox label 的for指向他的id,隐藏原生input :checked + label写样式

# 其他

<!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>
    body {
      padding: 10px;
      font-size: 10px;
    }

    .body {
      font-size: 20px;
      background-color: red;
    }

    #body {
      background: blue;
    }

    .cc1 {
      font-size: 12px;
    }

    .cc2 {
      font-size: 18px;
    }

    .cc3 {
      font-size: 24px;
    }
  </style>
</head>

<body class="body" id="body">
  <!-- css选择器是从右往左进行解析,加快浏览器对css解析速度 -->
  <!-- 属性选择器[type=radio]{} -->
  <!-- 伪元素选择器::before{} 真实存在的元素-->
  <!-- 伪类选择器:hover{} 一个元素的状态-->
  <!-- 组合选择器:[type=checkout] + label {}-->
  <!-- 否定选择器:not(.link){}  只要不是括号里面的元素都选择-->


  <!-- 选择器权重:!important优先级最高、元素属性,优先级高、相同权重,后写的生效 -->

  <h1>非布局样式</h1>
  <ul>
    <li>字体族</li>
  </ul>
  <div style="border:solid 1px red;">
    <span style="background:blue;color:#fff;font-size:20px;line-height:60px;">
      居中xfg&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;
    </span></div>
  <div class="c1">
    <span class="cc1">第一段</span>
    <span class="cc2">第二段</span>
    <span class="cc3">第三段</span>
  </div>
  <div style="background:red">
    <span>文字</span>
    <img src="test.png" />
  </div>
  <div>
    <div style="float:left">
      <span>第一段</span>
    </div>
    <div style="float:left">
      <span>第二段</span>
    </div>
  </div>
</body>

</html>

评 论:

更新: 11/21/2020, 5:50:48 PM