此文章用于总结最近遇到的一些坑,以供日后复习。已经好久没有写简书了,因为忙着期末考试,后来又因为一些事耽搁了。言归正传,总结一些坑,有已经解决了的,也有没有解决了,还有一些事概念不够清晰的,归类到CSS,是因为最近踩CSS的坑比较多....
17.7.10
首先说点不是CSS的坑:
- 并不是所有的浏览器都支持ES6。这个其实早该想到了,只是一直没遇到问题,因为都是用的谷歌浏览器。解决方式是用
babel
。 -
setTimeout()
的问题,这个问题不是我自己遇到的坑,是群里一个大神提出的,觉得特别有意思,就总结一下,万一以后遇到了,也不会太囧。具体如下:
首先,我们知道setTimeout()
有一个很“常规”的用法,那就是把定时器的时间设置成0
。其作用,用一句话概括就是把同步执行的代码变为异步,定时器里面的代码会放在普通流结束后立刻执行,这是前提。
下面,大神提出一个问题,setTimeout()
把时间设置成0,1,2.....20
有什么区别。
好吧,我当时的回答是,普通流执行完毕后会依次执行0,1,2...20
。
当然,答案并没有我想的这么简单。
不同浏览器对setTimeout()
的实现并不相同。
有些浏览器规定最短时间不能小于4ms
,如果小于4ms
,当4ms
算...
所以只能说在谷歌浏览器里,是每隔1ms
依次执行0,1,2...20
。
下面就是CSS的坑:
- 关于
flex
的,首先说明一下,这个问题是因为我自己对概念了解得不够细致。我们知道,如果申明了display:flex
,那么float,clear,text-align,等等属性就用不了了
这里的重点不是探讨哪些属性失效的问题。主要是float
,之前,我把float
和position
画上了等号。以为两者表达的是一个意思,所以,认为申明了display:flex
之后position
属性也会无效。当然,错得相当离谱....下面,重点分析一下float
与position
。
关于position
已经写过一篇了,所以重点分析一下float
。
首先,说一下,float
的历史,知道它被创造出来到底是做什么的...它一开始的作用只是解决文字环绕问题,就像word上,一段文字,中间加一张图,文字会包裹住那张图,一开始float
就是解决这个问题的。后来,人们惊奇的发现,可以用float
来进行布局,排版,而且挺方便的,就一直沿用至今。所以,就很清楚的明白,float
的一些特性了:
比如,当一个盒子是float
,并且这个盒子周围有text
的话,这个盒子脱离文档流,但是并没有完全脱离文档流,也就是说,它会占有之前的位置,用这种方式来让文字环绕它。
当一个盒子是float
,周围全是普通流,并且普通流没有text
的话,那么,普通流会穿过它,也就是它不会占有位置。
当一个盒子是float
,周围也是float
的盒子的话,他们相互间还是会保留位置。
说得很玄乎,很绕口。下面说一下自己的理解,其实上面也是自己的理解,可能理解是错的,毕竟没真的落实求证。
我把这种流,分为3种,分别以固态,液态,气态来形容。
普通流,就是固态,彼此之间,紧密堆叠,相互之间有影响。
float
,text
就是液态,液态与液态之间,彼此影响,但是对于固态,却没有影响。
position:absolute
就是气态,对什么都没有影响,包括气态本身。
所以,就会看到,申明了position:absolute
元素可以无限堆叠。而申明了float
的元素彼此之间却有影响。虽然用官方的话来说,它们都脱离了文档流,但是事实表示的效果却不太一样。
关于float
与position
,还有一种理解,是float
更加倾向于布局,而position
是定位,单独对一个盒子或者说页面的一小部分,进行定位,而不是布局,一个是宏观操作,一个是精细处理。 - 这个坑同样是来自于
flex
,貌似,在谷歌浏览器上,如果一个元素被申明了display:flex
,那么它的伪类元素,比如before,after
,都会受其影响,而其他浏览器,比如火狐,在同样的情况下,它的伪类元素却不受影响。当然,这只是我的初步判断。
17.7.13
1.关于火狐和谷歌的兼容问题,还是position:absolute
,如果使用position:absolute
加margin
的组合,如果是display:block
的元素,不会有问题,但是如果是内联或者inline-block
的元素,2个浏览器的绘制会不一样,比如如果是<a>,<img>
就会出问题。
解决的方法有2种,第一种是老老实实的使用position:absolute
+top:
+position:relative
的组合。
第二种就是给该元素加上display:block
。
17.8.4
1.ios和安卓,微信浏览器,后退键的机制是不一样的,ios会保留以前的信息,(貌似JS的信息不会保留),但是不会触发onload事件,而安卓简单粗暴,触发onload事件。
2.在安卓里,input标签被选中时,会弹出虚拟输入框,当时页面布局被挤压变形,如果用的是flex布局,当虚拟输入框关闭的时候,可能回不去了,就像物理中的弹性形变变成非弹性形变一样,弹不回去的感觉。。我的解决方案是,给他们加上
{
flex-shrink: 0;
flex-grow: 0;
}
不让他们变大或者变小。就不会出现非弹性形变。
17.8.17
这个问题不算BUG吧,当初设计原稿没有考虑微信浏览器顶部的黑条。所以长宽比例就不是很对,但是又要求一屏放下,我改了部分比例,勉强可以一屏放下了,以为差不多了。结果,杀出了华为手机(底部有虚拟键,长宽比例更加爆炸的那种),哎,确实这比例,怎么改都没办法一屏了,最后经过协商,决定长宽比例太过分的,让其中一部分滚动,放弃一屏。无奈,以后遇到这种问题,一定和设计师说好,要考虑微信顶部的黑条和部分手机的底部虚拟键呀0.0