# CSS 踩坑小结
### 一、iOS 上的 Safari 没有滑动惯性
在开发 iphone 微信端的时候,如果给一个`div`设置样式为滑动,样式如下:
```css
div {
overflow-y: scroll;
}
```
会发现 Safari 的滑动很僵硬,这时候可以用以下样式来解决:
```css
div {
-webkit-overflow-scrolling: touch;
}
```
### 二、去除 iphone 中点击按钮会出现一个半透明的灰色背景的问题
在开发 iphone 微信端的时候,同样发现,如果点击一个按钮,按钮会出现一个半透明的灰色背景,这时候可以用以下样式来解决:
```css
a,
img,
button,
input,
textarea,
div {
-webkit-tap-highlight-color: rgba(255, 255, 255, 0);
}
```
### 三、div 中保留文本的空格、换行以及 tab 字符的处理
在后台用`textarea`标签写入文本放入前端显示的时候,发现之前在`textarea`中的文本都被格式化了(浏览器默认把文本中的空格、换行以及 tab 字符都处理掉了),如果想保留文本的格式,可以用以下样式来解决:
```css
div {
white-space: pre-wrap;
}
```
需要特别注意的是,`white-space`有五种值可以选择,`normal`、`pre` 、`nowrap` 、`pre-wrap`、`pre-wrap`,每一种值都有不同的表现形式,其中:
> - `normal` 是 `white-space` 的默认值;
> - `pre` 会保留文本中额外的空格, 而且会保留文本中的换行;
> - `nowrap` 不会保留文本中额外的空格,而且会禁止文本中的换行;
> - `pre-wrap` 会保留文本中额外的空格, 而且会让文本正常的换行;
> - `pre-line` 不会保留文本中额外的空格,但是会让文本正常的换行;
这样解释读者会有一些迷惑,接下来用代码进一步说明,参考如下代码:
```html
hdfkf sjnfjsdkfn sdjf d d dfklsf sdfhjs sdfbsjdh df djfsf dsfsdf sdfbsjdh hfh
hfjsgjf
hdfkf sjnfjsdkfn sdjf d d dfklsf sdfhjs sdfbsjdh df djfsf dsfsdf sdfbsjdh hfh
hfjsgjf
hdfkf sjnfjsdkfn sdjf d d dfklsf sdfhjs sdfbsjdh df djfsf dsfsdf sdfbsjdh hfh
hfjsgjf
hdfkf sjnfjsdkfn sdjf d d dfklsf sdfhjs sdfbsjdh df djfsf dsfsdf sdfbsjdh hfh
hfjsgjf
hdfkf sjnfjsdkfn sdjf d d dfklsf sdfhjs sdfbsjdh df djfsf dsfsdf sdfbsjdh hfh
hfjsgjf
hdfkf sjnfjsdkfn sdjf d d dfklsf sdfhjs sdfbsjdh df djfsf dsfsdf sdfbsjdh hfh
hfjsgjf
```
这里我们要特地留意一下 `pre` 与 `pre-wrap` 的区别,正常情况下,两者的现实没有差异,如下图:

但是如果将窗口拉窄,我们会发现,`pre-wrap`会让文本根据窗口宽窄自动换行,而`pre`的换行不会受窗口宽窄影响:

### 四、让盒子里的字超出长度后,可以缩略显示变成点点点
1、在 `div` 框里的内容超出长度后,我们可以让超出部分的内容变成点点点,样式如下:
```css
div {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
```
然后我们就能获得我们想要的样式:
```html
Wow,CSS is very very very very very cool !
Wow,CSS is very very very very very cool !
```
效果图如下:

2、但是**如果我们想让 div 里的内容两行或者三行之后再显示点点点**,我们应该怎么办呢?如果你也有疑惑,可以参考如下代码:
```html
Wow,CSS is very very very very very cool !
Wow,CSS is very very very very very cool !
```
效果图如下:

> 这时候变成三行后再省略也相当简单,直接将 `-webkit-line-clamp` 变成 3 就行了。
3、特别特别需要注意的是,如果遇到丧心病狂的测试,他会给出一长串连续的英文字符,那么以上代码有可能会失效,这时候就需要`word-break: break-all;` 来帮助我们,参考如下代码:
```html
ssssssasjdjdfjsdfksdfgksdfgskdfgskjdfksdf
ssssssasjdjdfjsdfksdfgksdfgskdfgskjdfksdf
ssssssasjdjdfjsdfksdfgksdfgskdfgskjdfksdf
ssssssasjdjdfjsdfksdfgksdfgskdfgskjdfksdf
```
效果图如下:

### 五、word-wrap 和 word-break 的区别
1、word-wrap 和 word-break 都能使过长的字符串断开,防止其溢出,那他们两的区别又是什么呢?
2、我们先从[MDN](https://developer.mozilla.org/zh-CN/docs/Web/CSS/word-break)文档里了解它们的概要:
CSS 属性 `word-break` 指定了怎样在单词内断行。
他的属性有:
> - `normal` 使用默认的断行规则。
> - `break-all` 对于 non-CJK (CJK 指中文/日文/韩文) 文本,可在任意字符间断行。
> - `keep-all` CJK 文本不断行。 Non-CJK 文本表现同 normal。
CSS 属性 `word-wrap` 是用来说明当一个不能被分开的字符串太长而不能填充其包裹盒时,为防止其溢出,浏览器是否允许这样的单词中断换行。
他的属性有:
> - `normal` 表示在正常的单词结束处换行。
> - `break-word` 表示如果行内没有多余的地方容纳该单词到结尾,则那些正常的不能被被分割的单词会被强制分割换行。
3、仅仅看解释并不能看出什么头绪,接下来用代码来演示他们的差异,代码如下:
```html
you are vvvvvvvvvvvvvvvvvvvvvvvery beautiful!
you are vvvvvvvvvvvvvvvvvvvvvvvery beautiful!
you are vvvvvvvvvvvvvvvvvvvvvvvery beautiful!
```
效果图如下:

我们发现,当使用`word-wrap: break-word;`时,如果这个时候文本溢出,它会首先尝试挪到下一行,看看下一行的宽度够不够,不够的话才会进行单词内的断句。而使用`word-break:break-all`时,他会直接进行单词内的断句。