HTML&CSS|青训营笔记

112 阅读9分钟

这是我参与「第四届青训营 」笔记创作活动的第1天

HTML

  • 一种标记语言,常被用于设计网页结构,用户界面。

举个例子

<!doctype html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>页面标题</title>
  </head>
  <body>
    <h1>一级标题</h1>
    <p>段落内容</p>
  </body>
</html>
  • 浏览器会将html文件解析成一个dom树

HTML语法

  • 标签和属性不区分大小写,推荐小写

  • 媒体:

    • audio和video可以通过control属性展示默认的进度条

      <img
        src="https://lf3-static.bytednsdoc.com/obj/eden-cn/ubqnuhbnuho/movable_type.jpg"
        alt="Metal movable type"
        width="400"
      />
      
      <audio 
        src="/assets/music.ogg"
        controls
      ></audio>
      
      <video
        src="/assets/video.mp4"
        controls
      ></video>
      
    • datalist:使用预制/用户自己输入

      <input list="countries" />
      <datalist id="countries">
        <option>Greece</option>
        <option>United Kingdom</option>
        <option>United States</option>
      </datalist>
      
    • <q></q>表示引用前文内容

    • <pre></pre>表示预编译框其内部文字格式固定

    • <strong></strong>表示语意上的强调

    • <em></em>表示在一句话中突出重音

内容划分

  • header展示一些导航栏,或者其他头部信息。
  • 一个页面有且仅有一个main标签,存放网站的正文。
  • aside

语义化

  • HTML中的元素,属性等都需要有特定的含义。(不要全使用div)
  • 例如
    • 无序列表就用ul,有序就用ol
    • lang属性表示内容所使用的语言

考虑谁在使用我们写的html

  • 开发者:便于开发者理解和修改html(代码可读性)
  • 浏览器:便于浏览器解析,对不同标签做出不同处理(可维护性)
  • 搜索引擎:便于搜索引擎提取文章关键词,更易被搜索(搜索引擎优化)
  • 屏幕阅读器:便于一些无障碍阅读插件提取页面内容(提升无障碍性)

要传达内容而不是样式

如何做到语义化?

  • 了解清楚每个属性的含义
  • 思考最适合当前内容的标签
  • 不要使用可视化工具生成前端代码

CSS基础

CSS是什么

  • Cascading Style Sheets

举个例子

h1 {

    color: white;

    font-size: 14px;

}

在页面中使用css的三种方法

<!-- 外链 -->
<link rel="stylesheet" href="/assets/style.css">

<!-- 嵌入 -->
<style>
  li { margin: 0; list-style: none; }
  p { margin: 1em 0; }
</style>

<!-- 内联 -->
<p style="margin:1em 0">Example Content</p>
  • 一般推荐使用外链形式

CSS的工作方法

选择器

  • 通配选择器

    * {
        color: red
    }
    

    所有元素都会被通配选择器选中

  • 标签选择器(直接使用标签类型选择)

    h1 {
        color: orange;
    }
    
    p {
        color: gray;
        font-size: 20px;
    }
    
  • id选择器(使用元素id选择元素)

  • 类选择器(通过class选择元素)

  • 属性选择器:

    <label>用户名:</label>
    <input value="zhao" disabled />
    
    <label>密码:</label>
    <input value="123456" type="password" />
    
    <style>
      [disabled] {
        background: #eee;
        color: #999;
      }
    </style>
    
    • a[href^="#"]:以"#"作为前缀的a标签
    • a[href$="#"]:以"#"作为后缀的a标签
  • 伪类选择器:

    • 不基于标签和属性定位元素

    • 两种

      • 状态伪类
      • 结构性伪类
    • 状态伪类

      a:active {
        color: red;
      }
      
    • 结构性伪类

      <ol>
        <li>阿凡达</li>
        <li>泰坦尼克号</li>
        <li>星球大战:原力觉醒</li>
        <li>复仇者联盟 3</li>
        <li>侏罗纪世界</li>
      </ol>
      
      <style>
      li {
        list-style-position: inside;
        border-bottom: 1px solid;
        padding: 0.5em
      }
      
      li:first-child {
        color: coral
      }
      
      li:last-child {
        border-bottom: none;
      }
      </style>
      
      • 通过first-child表示选中li中的第一个
      • last-child选中li中的最后一个
  • 组合选择器

    • 将选择器简单的组合起来

      <label>
        用户名:
        <input class="error" value="aa">
      </label>
      <span class="error">
        最少3个字符
      </span>
      
      <style>
        .error {
          color: red;
        }
        
        input.error {
          border-color: red;
        }/*要求既是input又有error类*/
      </style>
      
    • 组合方式

      • 直接组合:AB 满足A同时满足B
      • 后代组合:A B 选中B,如果它是A的子孙
      • 亲子组合:A > B 选中B,如果他是A的直接子元素
      • 兄弟选择器:A ~ B 选中B,如果它在A的后面并且和A同级
      • 相邻选择器:A + B 选中B,如果它紧跟在A后面
    • 选择器组:用逗号将选择器分隔开

颜色的表示

  • RGB
    • #93ac12 或者 rgb(123, 231, 43)
  • HSL
    • rgb不能与颜色的一些特性直接关联起来
    • hsl(0360, 0100%, 0~100%)
      • h:色相,基础的颜色
      • s:饱和度,越高颜色越鲜艳
      • l:亮度,越高颜色越亮
  • alpha 透明度(在css里其实是不透明度)
  • rgba(255, 0, 0, 0.00~1.00)
  • hsla(0, 100%, 50%, 0.00~1.00)
  • #ff000078 78表示透明度范围00~ff

字体

  • font-family

  • todo


理解CSS

选择器的特异度

  • id优先级最高,然后是类选择器,最后是标签选择器
<button class="btn">普通按钮</button>
<button class="btn primary">主要按钮</button>
<style>
  .btn {
    display: inline-block;
    padding: .36em .8em;
    margin-right: .5em;
    line-height: 1.5;
    text-align: center;
    cursor: pointer;
    border-radius: .3em;
    border: none;
    background: #e6e6e6;
    color: #333;
  }
  .btn.primary {
    color: #fff;
    background: #218de6;
  }
</style>

继承

  • 有一些属性的值会自动继承父元素的属性值,称为继承。
  • 继承的值是父元素的计算值!!!(计算值的概念在求值过程中)
  • 除非显示的指定子元素的属性值。
  • 与文字相关的属性是一般是可以继承的(font-size,font-family),和盒模型相关的属性一般不可继承(宽度,高度)。

显示继承

* {
  box-sizing: inherit;
}

html {
  box-sizing: border-box;
}

.some-widget {
  box-sizing: content-box;
}

初始值

  • css中每一个元素都有一个默认值
  • 可以使用initial关键字表示设置为初始值

CSS求值过程

  • filtering:获取dom树和样式规则,通过选择器匹配,属性有效等将规则中适用本元素的筛选出来
    • 声明值:对于一个元素所匹配到的样式规则,可能有0~多个
  • cascading:按照声明值中的来源,是否适用important,选择器特异性,顺序等选出优先级最高的一个属性值
    • 层叠值:在cascading中最高优先级的值,比如2em,也可能为空
  • defaulting:如果层叠值为空,使用继承的或者初始值
    • 指定值:通过了cascading和defaulting之后,指定值一定不为空
  • resolving:把一些相对值转换为绝对值,例如将em转换为px
    • 计算值:在浏览器在不开始进行具体布局的情况下所能得到的最具体的值。例如定义body宽度为60%必须在布局时获取设备宽度才能计算出具体值。
  • formatting:将计算值的剩余部分继续转换,将某些关键字,百分数等都转化为具体值。
    • 使用值:实际布局时候使用的值,不会再有相对值和关键字,例如400.2px
  • constraining:将使用值的小数转化成整数
    • 实际值:渲染时实际生效的值,比如400px

布局(Layout)是什么

  • 确定内容大小和位置的算法
  • 依据元素、容器、兄弟节点和内容等信息来计算

布局相关技术

  • 常规流

    • 行级
    • 块级
    • 表格布局
    • FiexBox
    • Grid布局
  • 浮动

  • 绝对定位

  • width:指定Content-box宽度;如果为百分数,其相对于容器的contentbox宽度

  • height:指定content-box高度;如果为百分数,其相对于容器的contentbox宽度;容器如果有指定的高度时,百分数才生效;

box-sizing: border-box;

<p class="a">
  This is the behavior of width and height as specified by CSS2.1. The
  specified width and height (and respective min/max properties) apply to
  the width and height respectively of the content box of the element.
</p>
<p class="b">
  Length and percentages values for width and height (and respective min/max
  properties) on this element determine the border box of the element.
</p>

<style>
  html {
    font-size: 24px;
  }

  .a {
    width: 100%;
    padding: 1em;
    border: 3px solid #ccc;
  }

  .b {
    box-sizing: border-box;
    width: 100%;
    padding: 1em;
    border: 3px solid #ccc;
  }
</style>

块级 VS 行级

  • 块级盒子(CSS)
    • 不和其他盒子并列摆放
    • 适用所有盒模型属性
  • 行级盒子(CSS)
    • 和其他行级盒子放在一起或者拆开成多行
    • 盒模型中height,width不可用
  • 块级元素
    • 生成一个块级盒子
    • body,article等
    • display: block;
  • 行级元素
    • 生成行级盒子
    • 内容分散在多个行盒(line box)中
    • display: inline;

display属性

  • block 块级
  • inline 行级
  • inline-block 它本身是一个行级,可以放在行盒中;可以设置宽高;不会被拆开分成多行。
  • none 排版时完全忽略

常规流

  • 根元素,浮动和绝对定位会脱离常规流,其他元素均在常规流之内
  • 每个元素在一个排版上下文中参与布局
    • 行级排版上下文
    • 块级排版上下文
    • Table排版上下文
    • Flex排版上下文
    • Grid排版上下文

行级排版上下文

  • Inline Formatting Context

  • 如果一个盒子内部仅包含行级元素,则会创建一个IFC

  • IFC内部的排版规则:

    • 盒子在行内水平摆放
    • 一行放不下换行显示
    • text-align表示一行内盒子的水平对齐
    • vertical-align表示一个盒子在行内的垂直对齐
    • 避开浮动元素
  • overflow-wrap: break-word;

    • 行内排版时加上这句可以使得长单词能够换行

块级排版上下文

  • Block Formatting Context
  • 某些容器会创建一个BFC:
    • 根元素
    • 浮动、绝对定位、inline-block
    • Flex和Grid的子元素
    • overflow不为visible的块盒
    • display: flow-root;
  • BFC内部排版规则
    • 盒子从上到下摆放
    • 垂直的mergin会合并
    • 盒子内部的mergin不和外部的mergin合并
    • 避开浮动元素

举个例子

<span>
  This is a text and
  <div>block</div>
  and other text.
</span>

<style>
  span {
    line-height: 3;
    border: 2px solid red;
    background: coral;
  }

  div {
    line-height: 1.5;
    background: lime;
  }
</style>
  • 在行级元素span内部放置了块级元素div
  • 浏览器渲染时,会对div前边的半部分和后边的半部分分别创建两个匿名块,此时span创建了一个BFC,不存在行级元素
  • 元素内部要么只有行级元素要么只有块级元素

Flex Box是什么

  • 可以控制box中的

    • 摆放的流向
    • 摆放顺序
    • 盒子宽度和高度
    • 水平和垂直方向的对齐
    • 是否允许换行
  • 在对齐时,使用主轴侧轴定位

  • flex-direction:设置flex的布局方向,从左到右从右到左从上到下从下到上四个方向

  • justify-content:主轴对齐方式

  • align-items:侧轴对齐方式

  • align-self:单独设置对齐

    align-self

  • order:排序

Flexibility

  • 可以设置盒子弹性,在有空余的时候,盒子可以伸展,空间不够也可以收缩。
  • flex-grow:伸展
  • flex-shrink:收缩
  • flex-basis:基础大小(没有伸展时候的大小,也可以用width)
flex-grow
  • <div class="container">
      <div class="a">A</div>
      <div class="b">B</div>
      <div class="c">C</div>
    </div>
    
    <style>
      .container {
        display: flex;
      }
    
      .a, .b, .c {
        width: 100px;
      }
    
      .a {
        flex-grow: 2;
      }
    
      .b {
        flex-grow: 1;
      }
    </style>
    
flex-shrink
  • <div class="container">
      <div class="a">A</div>
      <div class="b">B</div>
      <div class="c">C</div>
    </div>
    
    <style>
      .container {
        display: flex;
      }
    
      .a, .b, .c {
        width: 400px;
      }
    
      .a {
        flex-shrink: 0;
      }
    </style>
    

flex简写

  • flex: 1 <=> flex-grow: 1
  • flex: 100px <=> flex-basis: 100px
  • flex: 2 1 <=> flex-grow: 2; flex-shrink: 1
  • flex: 1 100px <=> flex-grow: 1; flex-basis: 100px
  • flex: 2 0 100px <=> flex-grow: 2; flex-shrink: 0; flex-basis: 100px
  • flex: auto <=> flex: 1 1 auto
  • flex: none <=> flex: 0 0 auto

Grid是什么

  • 使用display: grid 生成一个块级的grid容器

  • 使用grid-template相关属性将grid划分为网络

  • 设置每一个子元素占哪些行,列

  • grid line网格线

  • grid area网格区域

  • grid-area: 1/1/3/3;将1,1,3,3围成的区域作为元素位置

    .a {
      grid-area: 2/2/4/4;
    }
    .b {
      grid-area: 1/1/3/3;
    }
    

position属性

  • static 默认属性
  • relative
    • 在常规流内进行布局
    • 相对于自己本来应该在的位置偏移
    • 使用top,bottom,left,right定位
    • 流内其他元素当他没有偏移一样布局
  • absolute
    • 脱离常规流布局
    • 相对于最近的非static的元素进行定位
    • 不会对流内布局造成影响
  • fixed
    • 脱离常规流布局,和absolute差不多
    • 相对于窗口进行布局

总结

  • 布局时在常规流中进行布局
  • 脱离出常规流单独定位
  • 在出现嵌套情况时,比如一个绝对定位的元素有一些子元素,那么会创建一个新的常规流对于这个元素的子元素进行渲染。