zoukankan      html  css  js  c++  java
  • 侯策《前端开发核心知识进阶》读书笔记——html与css要点

    HTML 语义化

    根据结构化的内容,选择合适的标签。

    为什么要做到语义化?

    “合适的标签”是内容表达的高度概括,这样浏览器爬虫或者任何机器在读取 HTML 时,都能更好地理解,进而解析效率更高。这样带来的收益如下:

    • 有利于 SEO
    • 开发维护体验更好
    • 用户体验更好(如使用 alt 标签用于解释图片信息)
    • 更好的 accessibility,方便任何设备解析(如盲人阅读器)
    if (导航) {
      return <nav />
    }
    else if (文稿内容、博客内容、评论内容...包含标题元素的内容) {
      return <article />
    }
    else if (目录抽象、边栏、广告、批注) {
      return <aside />
    }
    else if (含有附录、图片、代码、图形) {
      return <figure />
    }
    else if (含有多个标题或内容的区块) {
     return <section />
    }
    else if (含有段落、语法意义) {
      return <p /> || <address /> || <blockquote /> || <pre /> || ...
    }
    else {
      return <div />
    }

    语义化中的Microformats

    Microformats,翻译为微格式,是 HTML 标记某些实体的小模式,这些实体包括人、组织、事件、地点、博客、产品、评论、简历、食谱等。它们是在 HTML 中嵌套语义的简单协议,且能迅速地提供一套可被搜索引擎、聚合器等其他工具使用的 API。

    BFC 背后的布局

    BFC 是 Block Formatting Context 的简写,我们可以直接翻译成“块级格式化上下文”。它会创建一个特殊的区域,在这个区域中,只有 block box 参与布局。而 BFC 的一套特点和规则就规定了在这个特殊的区域中如何进行布局,如何进行定位,区域内元素的相互关系和相互作用。这个特殊的区域不受外界影响。

    block box 是指 display 属性为 block、list-item、table 的元素。

    相应地,我们有 inline box,它是指 display 属性为 inline、inline-block、inline-table 的元素。

    如何形成 BFC

    • 根元素或其他包含它的元素
    • 浮动元素 (元素的 float 不是 none)
    • 绝对定位元素 (元素具有 position 为 absolute 或 fixed)
    • 内联块 (元素具有 display: inline-block)
    • 表格单元格 (元素具有 display: table-cell,HTML 表格单元格默认属性)
    • 表格标题 (元素具有 display: table-caption, HTML 表格标题默认属性)
    • 具有 overflow 且值不是 visible 的块元素
    • display: flow-root 的元素
    • column-span: all 的元素

    关键要点:

    • float的值不为none
    • overflow的值不为visible
    • display的值为table-cell、tabble-caption和inline-block之一
    • position的值不为static或则releative中的任何一个

    BFC 决定了什么

    • 内部的 box 将会独占宽度,且在垂直方向,一个接一个排列
    • box 垂直方向的间距由 margin 属性决定,但是同一个 BFC 的两个相邻 box 的 margin 会出现边距折叠现象
    • 每个 box 水平方向上左边缘,与 BFC 左边缘相对齐,即使存在浮动也是如此
    • BFC 区域不会与浮动元素重叠,而是会依次排列
    • BFC 区域内是一个独立的渲染容器,容器内元素和 BFC 区域外元素不会形成任何干扰
    • 浮动元素的高度也参与到 BFC 高度的计算当中

    关键要点:

    • 边距折叠
    • 清除浮动
    • 自适应多栏布局

    看一个case:

    <style>
        body {
            width: 600px;
            position: relative;
        }
    
        .left {
            width: 80px;
            height: 150px;
            float: left;
            background: blue;
        }
    
        .right {
            height: 200px;
            background: red;
        }
    </style>
    
    <body>
        <div class="left"></div>
        <div class="right"></div>
    </body>

    得到如下布局:

    根据 BFC 布局规则:“每个 box 水平方向上左边缘,与 BFC 左边缘相对齐。即使存在浮动也是如此”,因此 .left 和 .right 的左边相接触。

    再想想 BFC 布局规则:“BFC 区域不会与浮动元素重叠,而是会依次排列”,因此我们可以使 .right 形成 BFC,来实现自适应两栏布局。

    .right {
        overflow: hidden;
    }

    可以得到:

    再看一个case:

    <style>
        .root {
            border: 5px solid blue;
            width: 300px;
        }
    
        .child {
            border: 5px solid red;
            width:100px;
            height: 100px;
            float: left;
        }
    </style>
    <body>
        <div class="root">
            <div class="child child1"></div>
            <div class="child child2"></div>
        </div>
    </body>

    因为 .child 为浮动元素,因此造成了“高度塌陷”现象,.root 的高度为 0:

    BFC 规则:“浮动元素的高度也参与到 BFC 高度的计算当中”,因此使 .root 形成 BFC,就能解决高度塌陷的问题:

    .root {
        overflow: hidden;
    }

    再看一个case:

    <style>
        p {
            color: blue;
            background: red;
            width: 400px;
            line-height: 100px;
            text-align:center;
            margin: 40px;
        }
    </style>
    <body>
        <p>paragraph 1</p>
        <p>paragraph 2</p>
    </body>

     BFC 规则:“box 垂直方向的间距由 margin 属性决定,但是同一个 BFC 的两个相邻 box 的 margin 会出现边距折叠现象”。两段之间的垂直距离为 40px。

    我们可以在 p 标签再包裹一个元素,并触发该元素形成一个BFC。那么这两个 p 标签,不再属于同一个 BFC,从而解决问题。

    <style>
        p {
            color: blue;
            background: red;
            width: 400px;
            line-height: 100px;
            text-align:center;
            margin: 40px;
        }
        .wrapper {
            overflow: hidden
        }
    </style>
    <body>
        <p>paragraph 1</p>
        <div class="wrapper">
            <p>paragraph 2</p>
        </div>
    </body>

    实现居中的方式

    仅适用于居中元素定宽高

    • absolute + 负 margin
    .wp {
        position: relative;
    }
    
    //绝对定位的百分比是相对于父元素的宽高
    .box {
        position: absolute;;
        top: 50%;
        left: 50%;
        margin-left: -50px;
        margin-top: -50px;
    }
    • absolute + margin auto
    .wp {
        position: relative;
    }
    .box {
        position: absolute;;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        margin: auto;
    }
    • absolute + calc
    .root {
        position: relative;
    }
    .textBox {
        position: absolute;;
        top: calc(50% - 50px);
        left: calc(50% - 50px);
    }
    • absolute + transform
    .wp {
        position: relative;
    }
    .box {
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
    }
    • lineheight
    //把 box 设置为行内元素,通过 text-align 也可以做到水平居中,同时通过 vertical-align 做到垂直方向上的居中
    .wp {
        line-height: 300px;
        text-align: center;
        font-size: 0px;
    }
    .box {
        font-size: 16px;
        display: inline-block;
        vertical-align: middle;
        line-height: initial;
        text-align: left; /* 修正文字 */
    }
    • table
    <table>
        <tbody>
            <tr>
                <td class="wp">
                    <div class="box">test</div>
                </td>
            </tr>
        </tbody>
    </table>
    
    .wp {
        text-align: center;
    }
    .box {
        display: inline-block;
    }
    • css-table
    .wp {
        display: table-cell;
        text-align: center;
        vertical-align: middle;
    }
    .box {
        display: inline-block;
    }
    • flex
    .wp {
        display: flex;
        justify-content: center;
        align-items: center;
    }
    • grid
    .wp {
        display: grid;
    }
    .box {
        align-self: center;
        justify-self: center;
    }
  • 相关阅读:
    顺序容器2(用法)
    运算符重载
    IO相关3(string流)
    IO相关2(文件输入输出)
    C语言--指针
    Java---匿名类
    Andriod开发 --插件安装、环境配置、问题集锦
    ubuntu--vim 技巧
    ubuntu--命令大全
    各浏览器userAgent汇总
  • 原文地址:https://www.cnblogs.com/fmyao/p/12815681.html
Copyright © 2011-2022 走看看