jQuery系列(三) -- DOM

创建元素与属性

JavaScript:

  • 创建元素:document.createElement()
  • 设置属性:setAttribute()
  • 添加文本:innerHTML()
  • 加入文档:append()

jQuery:

  • 创建元素节点:$( 'html结构' )
  • 创建文本节点:$( '<div>text node</div>' )
  • 创建属性节点:$( '<div id="text" class="className">text node</div>' )

jQuery DOM API

DOM node 插入

  1. 内部插入

    • .append(content) ==> 向每个匹配的元素内部追加内容。前面是被插入的对象,后面是要在对象内插入的元素内容
    • .appendTo(obj) ==> 把所有的匹配元素追加到另一个指定的元素集合中。前面是要插入的元素内容,而后面是被插入的对象
  2. 外部插入

    • .after(content) ==> 在匹配元素集合中的每个元素后面插入参数所指定的内容,作为其兄弟节点
    • before(content) ==> 在匹配的元素的前面插入内容
  3. 内部插入

    • .prepend() ==> 向每个匹配的元素内部前置内容
    • .prependTo() ==> 把所有匹配的元素前置到另一个指定的元素集合中

说明:.peopend() 方法将指定元素插入到匹配元素里面作为他的第一个子元素。.append() 方法最为最后一个参数。

  1. 外部插入:content 在前,() 内为元素
    • .insertAfter() ==> 在目标元素后面插入集合中每个匹配的元素
    • .insertBefore() ==> 在目标元素前面插入集合中每个匹配的元素

DOM node 删除

  • .empty() ==> 移除指定元素的所有子节点
  • .remove() ==> 将自身移除,同时也会移除元素内部的一切,包括绑定的事件及与该元素相关的 jQuery 数据
    注意:.remove() 可以传递一个选择器表达式用来过滤将被移除的匹配元素集合,可以选择性地删除节点
  • .detach() ==> 保留数据的删除操作。让一个 web 元素托管,即从当前页面中移除该元素,但保留这个元素的内存模型对象
    注意:.detach() 方法是 jQuery 特有的,所以它只能处理通过 jQuery 的方法绑定的事件或者数据,可以通过 .append() 是删除的元素重新回到文档流中

DOM node 复制与替换

  • .clone() ==> 复制所有匹配的元素集合,包括所有匹配元素、匹配元素的下级元素和文字节点
    注意:若节点有事件或者数据之类的其他处理,我们需要通过 .clone(true) 传递一个布尔值 true 用来指定,这样不仅仅是简单的克隆节点结构,还把附带的事件与数据复制。

  • .replaceWith(newContent) ==> 用提供的内容替换集合中所有匹配的元素并且返回被删除元素的集合

  • .replaceAll(target) ==> 用集合的匹配元素替换每个目标元素
    注意:

    1. .replaceWith().replaceAll() 会删除与节点相关联的所有数据和 event handler
    2. .replaceWith() 返回 jQuery 对象,可链式使用,但返回的 jQuery 对象引用的是替换前的节点,而不是通过 .replaceWith() / .replaceAll() 方法替换后的节点
  • .wrap() ==> 将元素用其他元素包裹起来,即给元素增加一个父元素,返回原始的元素集,以便以后使用链式方法

  • .unwrap() ==> 将匹配的元素的父级元素删除,保留自身在原来的位置
  • .wrapAll() ==> 将集合中的元素用其他元素包裹起来,增加一个父元素(每个元素分别包裹)
  • .wrapInner() ==> 将集合中的元素内部所有的子元素用其他元素包裹起来,并当做指定元素的子元素

jQuery 遍历

  • .children() ==> 返回匹配元素集合中每个元素的所有子元素,并且可以接受一个选择器

  • .find() ==> 查找 DOM 树中元素的后代元素(只在后代中遍历,不包括自己)

  • .parent() ==> 查找集合中每一个元素的父元素
  • .parents() ==> 查找集合中每一个元素的祖辈元素
  • .closest() ==> 从元素本身开始,在 DOM 树上逐级向上元素匹配,并返回最先匹配的祖先元素
    注意:.parents().closest() 区别

    1. 起始位置不同:.parents() 开始于父元素; .closest() 开始于当前元素
    2. 遍历的目标不同:.parents() 一直查找到根元素,并将匹配的元素加入集合; .closest() 向上查找,直到找到一个匹配的就停止查找
    3. 结果不同:.parents() 返回的是包含0个或1个或多个元素的 jQuery 对象; .closest() 返回的是包含0个或1个元素的 jQuery 对象
  • .next() ==> 查找指定元素集合中每一个元素紧邻的后面同辈元素的元素集合

  • .prev() ==> 查找指定元素集合中每一个元素紧邻的前面同辈元素的元素集合
  • .siblings() ==> 查找指定元素集合中每一个元素的同辈元素
  • .add() ==> 创建一个新的 jQuery 对象,元素添加到匹配的元素集合中
  • .each() ==> 一个 for 循环的迭代器,迭代 jQuery 对象中的每一个 DOM 元素,每次回调函数执行时,会传递当前循环次数作为参数(从0开始)
    .each() 通过回调的方式处理,并且会有两个固定的实参 ==> 索引(index)和元素(element)
    .each( (index,element) => {} )

CSS 最佳实践 + 套路(十) -- 混合篇

概述

本文章主要就是将之前几篇文章中没有提到的,但是个人认为比较重要的 CSS 的最佳实践和套路

居中

水平居中:

  • 内联元素:父元素加 text-align:center;
  • 块级元素(固定宽度):margin: 0 auto;
  • 元素不是上述两种情况:
    1. 将元素变成内联元素 ` display: inline-block; ` + ` text-align:center; ` + ` vertical-align: top `
    2. 固定宽度(不推荐)
    

垂直居中

  • 内联元素:line-height: height;
  • 块级元素:line-height + padding 构造高度,达到垂直居中(凑高度)

定位居中法

  • 宽度固定

    1
    2
    3
    4
    5
    position: absolute;
    left: 50%;
    top: 50%;
    margin-top: -width/2;
    margin-left: -heigth/2
  • 宽度不固定

    1
    2
    3
    4
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%,-50%) // CSS3 属性

弹出层或者 loading 定位居中

1
2
3
4
5
6
position: absolute; // 此种方法需要配合定宽定高
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;

Flex 布局居中

1
2
3
display: flex;
justify-content: center;
align-items: center;

滚动但是不显示滚动条

1
2
3
4
5
6
selector{
overflow: auto;
}
selector::-webkit-scrollbar {
display: none;
}

纯 CSS 实现三角形

  • first

    1
    2
    3
    4
    5
    div.first{
    border:10px solid transparent;
    width:0;
    border-top-color: red;
    }

    三角形-first.png

  • second

    1
    2
    3
    4
    5
    6
    div.second{
    border:40px solid transparent;
    width:0;
    border-top-width:0;
    border-left-color: red;
    }

    三角形-second.png

  • third

    1
    2
    3
    4
    5
    6
    div.third{
    border:20px solid transparent;
    width:0;
    border-top-color: red;
    border-left-color: red;
    }

    三角形-third.png

这里推荐一个使用纯 CSS 实现各种图形的网站

两个元素重叠一部分

效果图
方法:

  • margin 负值法: margin-top: -
  • CSS3 transform属性: transform: translate(- ) [ 原始位置保留不变,下方元素和 transform 元素有间隔 ]
  • 相对定位:position: relative; top(- ) [ 原始位置保留不变,下方元素和相对定位元素有间隔 ]

内联元素消除空隙

当元素为内联元素 | 内联块级元素时,该元素下方会有小空隙,消除空隙

1
2
display: inline | inline-block;
vertical-align: top;

如果想要整个页面的遮罩层,需要使用

1
2
3
4
5
6
7
8
9
10
    position: fixed;
width: 100%;
height: 100%;
```
不能使用 ` position: absolute; ` ,其高度不是页面的高度,是窗口的高度。


##伪类
CSS伪类是添加到选择器的关键字,指定要选择的元素的特殊状态。
- 动态伪类

:link ==> 未访问前的样式效果
:hover ==> 鼠标悬停时的样式效果
:active ==> 鼠标点击时的样式效果
:visited ==> 访问后的样式效果
:focus ==> 元素成为焦点时的样式效果

1
- 结构伪类(CSS选择符)

:first-child ==> 第一个子元素
:last-child ==> 最后一个子元素
:nth-child(n) ==> 第 n 个子元素
:nth-child(2n) === :nth-child(even) ==> 偶数元素
:nth-child(2n+1) === :nth-child(odd) ==> 奇数元素

1
2

- 否定伪类(CSS选择符)

:not() ==> 不符合参数选择器 X 描述的元素。

1
2
3
4
5

## 伪元素
伪元素添加到选择器,但不是描述特殊状态,它们可以为元素(**非空元素**)的某些部分设置样式。
- `::before` 为当前元素创建一个**伪元素**,做为已选中元素的**第一个**子元素。常通过 `content` 属性来为该元素添加修饰性的内容。 这个**虚拟元素**默认是行内元素。
- `::after` 为当前元素创建一个**伪元素**,做为已选中元素的**最后一个**子元素。常通过 `content` 属性来为该元素添加修饰性的内容。这个**虚拟元素**默认是行内元素。

div::before{
content: ‘’; // 必须有,才能显示出内容。
}
div::after{
content: ‘’; // 必须有,才能显示出内容。
}

1
2
3
4
5
6
7
8


## CSS 属性
1. `work-break: break-all` 打断所有的单词,从而使得词语(单词)换行

2. 圆:`border-radius: 50%;`

3. `position` 属性:用于指定一个元素在文档中的定位方式。值:

static:该关键字指定元素使用正常的布局行为,即元素在文档常规流中当前的布局位置。
relative  
absolute  
fixed
sticky(粘性定位[ 粘性定位是相对定位和固定定位的混合 ]):盒位置根据正常流计算(这称为正常流动中的位置),然后相对于该元素在流中的 flow root(BFC)和 containing block(最近的块级祖先元素)定位
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

4. `box-sizing` 属性:用于更改用于计算元素宽度和高度的默认的 CSS 盒子模型。
**值:**
- `content-box`:默认值,标准盒子模型。`width` 与 `height`只包括内容的宽和高, 不包括边框(border),内边距(padding),外边距(margin)。
**维度计算:**
`width` = 内容的 width
`height` = 内容的 height。
- `border-box`: `width` 和 `height`属性包括内容,内边距和边框,但不包括外边距。
**维度计算:**
`width` = border + padding + 内容的 width
`height` = border + padding + 内容的 height

5. `display: inline` 元素
- 设置 `width` 和 `height` 是无效的
- 设置 `margin-top` 和 `margin-bottom` 是无效的(解决方案:设置为 `display: inline-block; vertical-align: top;` ,如果此时该元素要居中,给其设置一个**行内父元素**,之后此**行内父元素** `text-align: center;`)
- 设置 `margin-left` 和 `margin-right` 是**有效**的


## 小技巧 & 注意点

1. `img` 的 `height` 和 `width` 写在 `img` 标签中,作为标签属性,这样可以避免重排的发生从而浪费了 CPU 性能(页面性能优化)。
<img src= '' width= 200 height= 300 alt= ''>
1
2

2. `hr` 的**最佳实践**
.hr{ border: none; border-top: 1px solid color; } ```
  1. span 元素内可以包裹 span ,不能包裹块级元素 div ,可以为 span 设置 display: block 从而达到效果

  2. li 里面有 a 元素时,如果 a 元素有 padding ,则 li 不能完全包裹 a ,此时需要给 a 添加 display: block; 属性即可。

  3. CSS中 width 的默认值是 auto

  4. 如果要继承父元素的颜色,要声明 color: inherit;

  5. animation 动画的时候要注意使用 opacity

  6. vh(viewport height):视图高度单位,100vh:表示整个视图高度

  7. 属性 text-transform: uppercase 将小写字母转化为大写字母

  8. position: absolute; 时,使用 top: 100%;,而不使用 bottom: 0;

  9. 注意使用 white-space: nowrap ,强制文本不换行,从而避免使用 width (在创建二级菜单时尤其注意)

  10. 有时父元素不能完全包裹住带有 padding 的子元素,此时可以尝试给子元素添加 display: inline-block; vertical-align: top; 或者 display: block;

CSS 最佳实践 + 套路(九) -- Bootstrap

概述

Bootstrap 是一个用于前端开发的开源工具包,Bootstrap 可以适配所有设备,主要就是采用了媒体查询功能,当我们知道它是怎么实现的了,那么它也就不那么神秘了。当我们在使用 Bootstrap 时,主要需要掌握的就是栅格布局,剩下的就是复制粘贴了。
英文官网
中文官网

准备工作

开始使用 Bootstrap 之前我们需要引入 Bootstrap

1
2
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" >
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js">

之后我们还需要引入一个 meta 标签

1
<meta name="viewport" content="width=device-width, initial-scale=1, maximun-scale=1, minimum-scale=1, user-scalable=no"

栅格系统

栅格系统主要就是将屏幕分成12等份。栅格系统主要创建在布局容器中,布局容器中存放行(row)和列(column),每行只能有12列,超出元素将作为一个整体存放在下一行中

布局容器

布局容器主要有两个类
.container ==> 固定宽度并支持响应式布局的容器,主要用于 PC 端
.container-fluid ==> 100% 宽度,占据全部视口 viewport 的容器,主要用于移动端
注意:我们所要做的就是将我们的所有内容都使用布局容器盛放

行表示在水平方向上创建一行,它的类只有一个.row

栅格参数

栅格参数主要就是表示栅格系统是如何在页面中显示的
栅格参数

在使用的时候我们需要将我们的内容放在每个行中,如果我们需要加一些 CSS 属性,此时需要做的便是加一层 div ,用来添加自己的样式
示例:

1
2
3
4
5
6
7
<div class="container">
<div class="row">
<div style="padding: 10px;"> // 这个就是我们添加的 div,用来添加我们自己的样式
我们的内容
</div>
</div>
</div>

相关知识点

  • 生产环境:程序所在的机器 | 操作系统面向真实的用户
  • 开发环境:只给自己 | 内部人员使用的程序,例如 http-server

以上便是 Bootstrap 需要了解的知识,剩下的便是去官方网站粘贴复制,个人推荐:不要去使用 Bootstrap,因为 CSS 是一个牵一发而动全身的技术,如果你选择了 Bootstrap,那么你的想象力将会受到限制

CSS 最佳实践 + 套路(八) -- BFC

概述

BFC(Block Formatting Context)块级格式化上下文。我并不知道 BFC 是什么,但是只要写出样式,我就知道这是不是 BFC。BFC 没有明确的定义,只有特征或功能。

形成 BFC 条件

  1. 浮动(float: left | right

  2. 绝对定位元素(position: absolute

  3. 非块盒的块容器(display: inline-block | table-cells | table-captions

  4. overflow 不为 visible 的块盒(visible: auto | hidden | scroll

  5. display: flow-root ==> 专门用于使得当前元素触发 BFC

功能

  1. 将内部浮动元素包裹起来
    使用 BFC 将其内部浮动元素包裹起来
    BFC 将内部浮动元素包裹起来

代码地址

  1. 两个相邻的 BFC 划清界限
    float + div 左右自适应布局
    BFC 两个相邻 BFC 划清界限

代码地址

BFC 与 文档流

BFC 是本身特性,它会影响元素的宽高
文档流指内联元素从左到右排列,块级元素从上到下排列。它会影响元素的排列顺序
二者没有关系
BFC 里面有文档流,BFC 本身也可以是文档流

最佳实践 & 套路

不要去使用 BFC

  1. 清除浮动使用 clearfix

    1
    2
    3
    4
    5
    clearfix::after{
    content: '';
    display: block;
    clear: both;
    }
  2. 划清界限使用 display: flex
    使用 display: flex + flex: 1
    display: flex + flex: 1

相关知识点

BFC 内部相邻块级元素竖直 margin 合并

CSS 最佳实践 + 套路(七) -- 布局

概述

在我们平时布局的时候,一般都是选择 Float 布局和 Flex 布局。如果项目需要支持 IE8 ,那么推荐选择 Float 布局,如果不需要支持 IE8 ,那么尽量选择 Flex 布局,当我们不需要支持 IE8 的时候,那么我们就能使用很多高级的语法,例如:calc()

原则

  1. 不要写死 widthheight
  2. 尽量选择 flex、calc
  3. 如果是 IE ,那么上述两点全部推翻,能写死就写死

Float 布局

  1. 子元素:float: left | right
  2. 父元素:添加 clearfix
    1
    2
    3
    4
    5
    clearfix::after{
    content: '';
    display: block;
    clear: both;
    }

Flex 布局

CSS 最佳实践 + 套路(六) – flex 一文中已经详细介绍了关于 FLex 的相关属性。Flex 布局主要是

  1. 父元素: display: flex; + 弹性容器相关属性
  2. 子元素:弹性项目相关属性

最佳实践 & 套路

实现这种布局
布局
每个模块都是一样的,四个模块占据一行,中间有 margin ,四个模块占据的宽度是一定的。

  1. float + margin 负值法
    HTML:

    1
    2
    3
    4
    5
    6
    7
    <div class="container">
    <div class="inner">
    <ol class="clearfix">
    li*10
    </ol>
    </div>
    </div>

    CSS:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    .container{
    width: 960px;
    margin: 0 auto;
    }
    .clearfix{
    content: '';
    display: block;
    clear: both;
    }
    .inner{
    margin: 0 -间距/2px;
    }
    li{
    width:
    float: left;
    }
  2. flex + margin负值法
    HTML:

    1
    2
    3
    4
    5
    6
    7
    <div class="container">
    <div class="inner">
    <ol>
    li*10
    </ol>
    </div>
    </div>

    CSS:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    .container{
    width: 960px;
    margin: 0 auto;
    }
    ol{
    display: flex;
    justify-content: space-between;
    margin: 0 -间距/2px;
    }
  3. flex + calc
    HTML:

    1
    2
    3
    4
    5
    6
    7
    <div class="container">
    <div class="inner">
    <ol>
    li*10
    </ol>
    </div>
    </div>

    CSS:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    .container{
    width: 960px;
    margin: 0 auto;
    }
    ol{
    display: flex;
    justify-content: space-between;
    }
    li{
    calc(25% - 8px) //20%*父元素宽度 - 8px
    }

CSS 最佳实践 + 套路(六) -- flex

概述

CSS 弹性盒子(Flexible box 或 Flexbox)是一种用于在页面上布置元素的布局模式,它的目的是允许容器可以让其子项目(子元素)能够改变宽度、高度、顺序等等,以最佳的方式填充空间(父元素)

弹性盒布局是指通过调整其内元素的宽高,从而在任何显示设备上实现对可用的显示空间最佳的填充能力

特点

  • 与方向无关
  • 实现空间的自动分配,自动对齐
  • 适用于简单的线性布局

基本概念

flexbox 基本概念

弹性容器(Flex container)

包含这弹性项目的父元素,通过设置 display: flex | inline-flex 定义弹性容器

弹性项目(Flex item)

弹性容器中的每个子元素都被称为弹性项目

轴(Axis)

每个弹性框包含两个轴。弹性项目延其依次排列的那根轴称为主轴(main axis),垂直于主轴的那根轴称为侧轴(cross axis)

方向(direction)


很重要,知道方向才能了解弹性容器上的属性


主轴方向:弹性容器的主轴起点(main start)主轴终点(main end)的方向
侧轴方向:弹性容器的侧轴起点(cross start)侧轴终点(cross end)的方向

弹性容器属性

定义弹性容器

1
2
3
display: flex;            // 弹性容器是块级元素
或者
display: inline-flex; // 弹性容器是行内元素

flex-direction

确立主轴方向,可以改变 main start 到 main end 的方向

值:

  • flex-direction: row ==> 横向排列弹性项目,方向与内容方向相同(main start 到 main end 的方向与内容方向相同

  • flex-direction: row-reverse ==> 横向排列弹性项目,方向与内容方向相反(main start 到 main end 的方向与内容方向相反

  • flex-direction: column ==> 纵向排列弹性项目,方向与内容方向相同(main start 到 main end 的方向与内容方向相同

  • flex-direction: column-reverse ==> 纵向排列弹性项目,方向与内容方向相反(main start 到 main end 的方向与内容方向相反

flex-wrap

指定 flex 元素是单行显示还是多行显示,可以改变 cross start 到 cross end 的方向

值:

  • flex-wrap: nowrap ==> 不允许弹性项目换行

  • flex-wrap: wrap ==> 允许弹性项目换行

  • flex-wrap: wrap-server ==> 允许弹性项目换行,cross start 到cross end 的方向颠倒

flex-flow

这是一个集合属性
flex-flow === flex-direction + flex-wrap

justify-content

主轴方向上伸缩项目的对齐方式

值:

  • justify-content: space-between ==> 在主轴方向上均匀分配弹性项目,相邻弹性项目距离相同。主轴方向上的第一个弹性项目和行首对齐,主轴方向上的最后一个弹性项目和行尾对齐

  • justify-content: space-around ==> 在主轴方向上均匀分配弹性项目,相邻弹性项目距离相同。主轴方向上第一个弹性项目到行首的距离和主轴方向上最后一个弹性项目到行尾的距离等于相邻元素距离的一半

  • justify-content: flex-start ==> 弹性项目与主轴起点对齐

  • justify-content: flex-end ==> 弹性项目与主轴终点对齐

  • justify-content: center ==> 弹性项目在主轴起点到主轴终点距离的中点

align-items

侧轴方向上伸缩项目的对齐方式

值:

  • align-items: flex-start ==> 弹性项目项与侧轴起点对齐

  • align-items: flex-end ==> 弹性项目与侧轴终点对齐

  • align-items: center ==> 弹性项目在侧轴起点到侧轴终点距离的中点

align-content

多行或者多列的对齐方式

值:

  • align-content: space-between ==> 在侧轴方向上均匀分配弹性项目,相邻弹性项目距离相同。主轴方向上的第一个弹性项目和行首对齐,主轴方向上的最后一个弹性项目和行尾对齐
  • align-content: space-around ==> 在侧轴方向上均匀分配弹性项目,相邻弹性项目距离相同。侧轴方向上第一个弹性项目到行首的距离和侧轴方向上最后一个弹性项目到行尾的距离等于相邻元素距离的一半

  • align-content: flex-start ==> 弹性项目项与侧轴起点对齐

  • align-content: flex-end ==> 弹性项目与侧轴终点对齐

  • align-content: center ==> 弹性项目在侧轴起点到侧轴终点距离的中点
    align-content 属性全解

弹性项目属性

flex-grow

主轴方向上增长比例。指空间过多时,多余空间分配比例
值: ,负值无效

flex-shirk

主轴方向上收缩比例。指空间不足时,溢出空间在每个伸缩项目的收缩比例
值: ,负值无效

flex-basis

主轴方向上伸缩项目的初始大小
值:

  • ,负值无效
  • content ==> 基于 flex 的伸缩项目的内容自动调整大小

flex

flex 是一个复合属性
flex === flex-grow + flex-shirk + flex-basis

order

主轴方向上弹性项目布局时的顺序
值: ,负值有效

align-self

自身的对齐方式
值:

  • align-self: flex-start ==> 弹性项目项与侧轴起点对齐

  • align-self: flex-end ==> 弹性项目与侧轴终点对齐

  • align-self: center ==> 弹性项目在侧轴起点到侧轴终点距离的中点

最佳实践 & 套路

  1. 垂直水平居中
    1
    2
    3
    display: flex;
    justify-content: center;
    align-items: center;

相关知识点

这里有两个小游戏,可以练习 flex 属性
网站一
网站二

CSS 最佳实践 + 套路(五) -- icon

概述

icon 有很多做法,主要的做法有

  • img 标签
  • background-image 属性
  • CSS Sprites
  • font
  • svg
  • 纯 CSS 实现

在这些方法中,目前最值得推荐的就是 svg 方法,其他的大家可以了解一下。

img 标签

1
<img src="./img/xxx.png" alt="icon">

此种方法可以自适应宽高,只需要给 img 一个 width 属性或者一个 height 属性即可

background-image 属性

1
2
3
4
5
6
7
CSS:
div{
background-image: url(./image/xxx.png);
}

HTML:
<div></div>

CSS Sprites

可以使用工具自动生成 Sprites ,之后进行使用,此种方法便是工具的使用

font

font 方法主要是使用阿里的 Unicode 和 Font class 方法
Font 方法

svg

svg 方法是现在最值得推荐的方法
SVG是可缩放矢量图形,是W3C XML的分支语言之一,用于标记可缩放的矢量图形。它支持 CSS 属性

首先去阿里的 iconfont 网站

  1. 选取相应的图标并加入购物车
  2. 将购物车中的图标添加至项目
  3. 生成 Symbol 代码
  4. 拷贝生成的 Symbol 代码,放在 HTML 中
  5. 引入通用css代码

    1
    2
    3
    4
    5
    6
    7
    8
    <style type="text/css">
    .icon {
    width: 1em; height: 1em;
    vertical-align: -0.15em;
    fill: currentColor;
    overflow: hidden;
    }
    </style>
  6. 挑选相应图标并获取类名,应用于页面

    1
    2
    3
    4
    5
    6
    7
    8
    9
        <svg class="icon" aria-hidden="true">
    <use xlink:href="#icon-xxx"></use>
    </svg>
    ```
    ![SVG](http://upload-images.jianshu.io/upload_images/9617841-1b6964ececccf5f7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    ![阿里 iconfont 使用](http://upload-images.jianshu.io/upload_images/9617841-ccdc31dd20104add.gif?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    `<svg>` 属性:

width: // icon 宽度
height: // icon 高度
fill: // icon 颜色
stroke: // 描边
vertical-align: top; //可以用于调整上下间距。
```

纯 CSS 实现

纯 CSS 实现就是使用 CSS 去画一些图标,推荐一个网站

CSS 最佳实践 + 套路(四) -- 移动端适配

脚本实现自动创建移动端适配的相关文件

概述

手机上显示网页是将整个网页缩小,模拟页面宽度 980px ,可以使用 document.documentElement.clientWidth 来获取到页面宽度为 980px。在移动端加上 <meta> 标签才是自适应,否则就是 980px ,即网页整体缩小。

meta 标签

1
<meta name=' viewport ' content=' width=device-width user-scalable=no initial-scale=1.0 maximum=1.0 minimum-scale=1.0 '>

说明:

  • width=device-width ==> 网页宽度默认等于屏幕宽度
  • user-scalable=no ==> 用户是否可以缩放
  • initial-scale=1.0 ==> 原始缩放比例为 1.0 ,即网页初始大小占屏幕面积的 100%
  • maximum=1.0 ==> 最大缩放比例
  • minimum-scale=1.0 ==> 最小缩放比例

<meta> 标签可以防止手机模拟 980px,防止页面在用户双击的时候放大和防止用户横屏

Media Query (媒体查询)模块

由一个可选的媒体类型和零个或多个使用媒体功能的限制了样式表范围的表达式组成,即对媒体进行某些条件的查询

  1. 目前来说只用两种模式 :

    • 移动端
    • PC 端
  2. 两种技术:

    • mobiles-first ==> 先做移动端页面后做 PC 端页面(推荐)
    • desktop-first ==> 先做 PC 端页面后做移动端页面
  3. 两种方案:

    • 移动端和 PC 端分别跳转不同网站(京东、淘宝)
    • 渲染不同的 HTML+CSS(知乎)

元素中的 CSS 媒体查询

满足查询条件,则生效,否则不生效。但是无论生效与否都会下载

1
<link rel="stylesheet" media="(max-width: 800px)" href="example.css" />

样式表中的CSS媒体查询

满足查询条件,则生效,否则不生效。

1
2
3
4
5
6
7
<style>
@media (max-width: 600px) {
.facet_sidebar {
display: none;
}
}
</style>

操作符

  • and 操作符 ==> 把多个媒体属性组合成一条媒体查询,对成链式的特征进行请求,只有当每个属性都为真时,结果才为真

    1
    (min-width: 700px) and (max-width: 960px) { ... }
  • 逗号分隔列表 ==> 使用逗号分隔效果等同于or逻辑操作符。当使用逗号分隔的媒体查询时,如果任何一个媒体查询返回真样式就是有效

    1
    @media (min-width: 700px), handheld and (orientation: landscape) { ... }
  • not 操作符 ==> 应用于整个媒体查询,在媒体查询为假时返回真

  • only 操作符 ==> 防止老旧的浏览器不支持带媒体属性的查询而应用到给定的样式

    1
    <link rel="stylesheet" media="only screen and (color)" href="example.css" />

说明:若使用了not或only操作符,必须明确指定一个媒体类型。

媒体特征

  • device-width ==> 设备宽度
  • width ==> 宽度。描述了输出设备渲染区域的宽度。接受 mix/min 前缀

响应式

响应式即不同的屏幕得到不同的样式

长度单位

  • px ==> 绝对长度单位,像素
  • em ==> 相对长度单位,这个单位表示元素的 font-size 的计算值
  • rem ==> 相对长度单位,这个单位代表根元素()font-size 大小
    说明:网页默认的 font-size: 16px
  • vh ==> viewport hight,相对长度单位,视口高度的 1/100。
  • vw ==> viewport width,相对长度单位,视口宽度的 1/100。
    说明:vh 和 vw 的兼容性比较差,使用较少

动态 REM

由于手机上分辨率太多,不是做响应式,只能退而求其次

  • 百分比布局:高度问题,宽度不知道具体大小,仅仅知道百分比。造成了宽度不确定导致高度和宽度不能做任何配合
  • 动态REM:一切单位以宽度为基准(vw 啊,但是 vw 兼容性较差),退而求其次:rem

rem ==> html font-size =(JS实现)=> page width(页面宽度)

1
2
3
4
5
6
7
8
9
10
11
<head>
<script>
var pageWidth = window.innerWidth
document.write( '<style>html{font-size:' + pageWidth/10 + 'px;}</style>' )
</script>
<style>
body{
font-size: 16px;
}
</style>
</head>

将 rem 变为 pageWidth/100 即可以表示 vw(视口宽度的 1/100),Chrome 浏览器默认最小字号 12px,此时的 font-size 被 Chrome 浏览器强制为 12px。所以将 rem 变为 pageWidth/10 。

最佳实践 & 套路

SASS 实现将 px 自动变为 rem

LUNIX 安装SASS
SASS 文件内容

1
2
3
4
@function px( $px ){
@return $px/$designWidth*10 + rem; // 此处的 10 是 html{font-size:' + pageWidth/10 + 'px;} 中的10
}
$designWidth : 640; // 640 是设计稿的宽度,需要根据设计稿的宽度填写

相关知识点

  1. 移动端中没有 hover 事件,但是有 touch 事件
  2. 移动端中没有 resize 事件,并且没有滚动条(隐藏滚动条)
  3. 使用相对大小的字体 rem
  4. 流动布局,各个区块都是浮动的
  5. 选择加载 CSS ,Media Query 模块(CSS3)自动探测屏幕宽度,然后加载相应的 CSS 文件
  6. CSS 的 @media 规则
  7. 图片自适应 max-width: 100%;
  8. 很小很小的地方使用 px ==> 1px
  9. rem 单位和其他单位混用,例如:font-size: 16px

CSS 最佳实践 + 套路(三) -- 堆叠上下文

条件

文档中的层叠上下文由满足以下任意一个条件的元素形成:

  • 根元素(HTML)
  • z-index 不为 auto 的 absolute/relative
  • 一个 z-index 值不为 auto 的 flex 项目,即父元素 display: flex/inline-flex
  • opacity 属性值小于 1 的元素
  • transform 属性不为 none 的元素
  • mix-blend-mode 属性值不为 normal 的元素
  • filter 不为 none 的元素
  • perspective 值不为 none 的元素
  • isolation 属性被设置为 isolate 的元素
  • position: fixed
  • 在 will-change 中指定了任意 CSS 属性,即使没有直接指定这些属性的值
  • -webkit-overflow-scrolling 属性被设置为 touch 的元素

#堆叠层级:

1
负z-index(父元素没有position: relative/absolute) < position: static(background-color < border < 负z-index(父元素position: relative/absolute)  < div/块级元素 < 浮动元素 < 浮动元素内的文字/内联元素 < 浮动元素外面的文字/内联元素) < position: relative/absolute < 正z-index

  • 相同的属性按先后顺序排列
  • 具有相同 position 属性的 + z-index 只能覆盖相同 position 属性(relative === absolute)的元素

作用 + 影响

堆叠上下文主要是影响 z-index
z-index: 2 永远在 z-index: 0 的上方么?
堆叠上下文影响 z-index 01
堆叠上下文影响 z-index 02

堆叠上下文影响 z-index 03

堆叠上下文影响 z-index 04

堆叠上下文影响 z-index 05

具体使用示例

最佳实践 & 套路

z-index 需要配合 position: relative | absolute 使用

CSS 最佳实践 + 套路(二) -- height width

文档流

文档内元素的流动方向

  • 内联元素 ==> 从左向右依次流动,若 width 不足,则换行
  • 块级元素 ==> 从上到下依次流动,每个块级元素独占一行

脱离文档流

将会影响其祖先元素(块级元素)的 height

脱离文档流的三种方式:

  • position: fixed 相对于窗口定位
  • position: absolute 相对于定位包含框定位(position: absolute; top: 100%;
  • float: 浮动,可以利用 .clearfix 类清除浮动

height 问题

  • div (块级元素)==> 由其内部文档流元素的 height 总和决定
  • span (内联元素) ==> spanheight 决定于具体的字体(建议行高 + 设计字体的设计师决定)。

建议行高

字体都有一个建议行高,每种字体的建议行高是不同的。以下面的 span 为例:

1
2
<span style= 'font-family: 字体A; font-size: 20px; line-height: 40px;'>字体hug</span>
<span style= 'font-family: 字体B; font-size: 20px; line-height: 40px;'>字体hug</span>

  • 两个 span 的字体不同,所以两个 spanheight 就不相同。
  • font-size: 20px; 指的是英文字母 h 的上部 英文字母 g 的下部的距离为 20px ,中文汉字会比 20px 偏小一些。

最佳实践

  1. line-height 设置的比 font-size 大一些,那么行内元素的 height 将会等于 line-height 的值

  2. 内联元素设置 widthheight 时,不要使用

    1
    2
    3
    4
    display: block;
    height:
    line-height:
    text-align: center;

    通过添加 padding 从而达到想要的 widthheight (添加 line-height 明确 height),并且宽度(max-width)自适应

    1
    2
    padding: 
    line-height:

套路

设置一个 height40px (近似)的 div ,其内部包含内敛元素 span

1
2
3
<div style= 'line-height: 24px; border: 1px solid green; padding: 6px 0;'>
<span style= 'font-size: 14px; border: 1px solid red;'>hug</span>
</div>

两个 span 两端对齐方法

text-align: justify ==> 定义行内内容(例如文字)如何相对它的块父 元素对齐。text-align 并不控制块元素自己的对齐,只控制它的行内内容 的对齐。文字向两侧对齐(必须是多行文本)

1
2
3
4
5
6
7
8
9
10
11
12
13
span{ 
display: block;
width: // 设置宽度,从而让两端对齐
line-height: //设置行高和高度,固定下来
height:
taxt-align: justify; //设置两端对齐
overflow: hidden;
}
span::after{ // 设置伪类,从而有第二行。
content: '';
display: inline-block;
width: 100%;
}

注意:可以将 span 设置为 display: inline-block ,之后在第一个 span 后面加上 <br>

两端对齐

文字省略溢出

单行文本省略溢出
1
2
3
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis
多行文本省略溢出(css multi line text ellipsis)
1
2
3
4
display: -webkit-box;
-webkit-line-clamp: 3; //控制行数
-webkit-box-orient: vertical;
overflow: hidden;

实现一个 1:1 的 div

1
2
border: 1px solid red;
padding-top: 100%;

margin 合并

一个 div 标签中有一个子标签 div ,如果父标签有以下属性,则子标签中的 margin(上下) 属性不会合并。

  • border:
  • padding:
  • overflow: hidden;( 不推荐 )

相关知识点

  1. 文字和单词、单词和单词都是以基线对齐。

  2. 内联元素的 paddingmarginborder 不会影响 height ,但是会影响 width