css
# 1. 怎么让一个 div 水平垂直居中
|
|
简单粗暴
1 2 3 4 5 6 7 8 9 10 11 12
div.parent { background-color:red; height:300px; display: flex; justify-content: center; align-items: center; } div.child { background-color:blue; height:50px; width:20%; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
div.parent { background-color:red; height:300px; position: relative; } div.child { background-color:blue; height:50px; width:20%; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); //主要原理是先top后child位于父亲的150-200高度,left后位于50%-70%宽度,再自身transform50%后,就能向左上平移半个自己的身位,正好居中 }
1 2 3 4 5 6 7
div.parent { display: grid; } div.child { justify-self: center; align-self: center; }
# 2. 分析比较 opacity: 0、visibility: hidden、display: none 优劣和适用场景。
display: none;
- DOM 结构:浏览器不会渲染
display
属性为none
的元素,不占据空间; - 事件监听:无法进行 DOM 事件监听;
- 性能:动态改变此属性时会引起重排,性能较差;
- 继承:不会被子元素继承,毕竟子类也不会被渲染;
- transition:
transition
不支持display
。
visibility: hidden;
- DOM 结构:元素被隐藏,但是会被渲染不会消失,占据空间;
- 事件监听:无法进行 DOM 事件监听;
- 性 能:动态改变此属性时会引起重绘,性能较高;
- 继 承:会被子元素继承,子元素可以通过设置
visibility: visible;
来取消隐藏; - transition:
transition
不支持display
。
- opacity: 0;
- DOM 结构:透明度为 100%,元素隐藏,占据空间;
- 事件监听:可以进行 DOM 事件监听;
- 性 能:提升为合成层,不会触发重绘,性能较高;
- 继 承:会被子元素继承,且,子元素并不能通过
opacity: 1
来取消隐藏; - transition:
transition
不支持opacity
。
# 3. 如何修改才能让图片宽度为 300px ?注意下面代码不可修改。
<img src="1.jpg" style="width:480px!important;">
增加max-width:300px
或transform: scale(0.625)
,但后者元素本身大小还是480。
# 4. BFC、IFC、GFC 和 FFC
BFC(Block formatting contexts):块级格式上下文 页面上的一个隔离的渲染区域,那么他是如何产生的呢?可以触发BFC的元素有float、position、overflow、display:table-cell/ inline-block/table-caption ;BFC有什么作用呢?比如说实现多栏布局’
IFC(Inline formatting contexts):内联格式上下文 IFC的line box(线框)高度由其包含行内元素中最高的实际高度计算而来(不受到竖直方向的padding/margin影响)IFC中的line box一般左右都贴紧整个IFC,但是会因为float元素而扰乱。float元素会位于IFC与与line box之间,使得line box宽度缩短。 同个ifc下的多个line box高度会不同 IFC中时不可能有块级元素的,当插入块级元素时(如p中插入div)会产生两个匿名块与div分隔开,即产生两个IFC,每个IFC对外表现为块级元素,与div垂直排列。 那么IFC一般有什么用呢? 水平居中:当一个块要在环境中水平居中时,设置其为inline-block则会在外层产生IFC,通过text-align则可以使其水平居中。 垂直居中:创建一个IFC,用其中一个元素撑开父元素的高度,然后设置其vertical-align:middle,其他行内元素则可以在此父元素下垂直居中。
GFC(GrideLayout formatting contexts):网格布局格式化上下文 当为一个元素设置display值为grid的时候,此元素将会获得一个独立的渲染区域,我们可以通过在网格容器(grid container)上定义网格定义行(grid definition rows)和网格定义列(grid definition columns)属性各在网格项目(grid item)上定义网格行(grid row)和网格列(grid columns)为每一个网格项目(grid item)定义位置和空间。那么GFC有什么用呢,和table又有什么区别呢?首先同样是一个二维的表格,但GridLayout会有更加丰富的属性来控制行列,控制对齐以及更为精细的渲染语义和控制。
FFC(Flex formatting contexts):自适应格式上下文 display值为flex或者inline-flex的元素将会生成自适应容器(flex container),可惜这个牛逼的属性只有谷歌和火狐支持,不过在移动端也足够了,至少safari和chrome还是OK的,毕竟这俩在移动端才是王道。Flex Box 由伸缩容器和伸缩项目组成。通过设置元素的 display 属性为 flex 或 inline-flex 可以得到一个伸缩容器。设置为 flex 的容器被渲染为一个块级元素,而设置为 inline-flex 的容器则渲染为一个行内元素。伸缩容器中的每一个子元素都是一个伸缩项目。伸缩项目可以是任意数量的。伸缩容器外和伸缩项目内的一切元素都不受影响。简单地说,Flexbox 定义了伸缩容器内伸缩项目该如何布局。
# 5. 如何用 css 或 js 实现多行文本溢出省略效果,考虑兼容性
- 单行: overflow: hidden; text-overflow:ellipsis; white-space: nowrap;
- 多行: display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; //行数 overflow: hidden;
- 兼容: p{position: relative; line-height: 20px; max-height: 40px;overflow: hidden;} p:: after{content: “…”; position: absolute; bottom: 0; right: 0; padding-left: 40px; background: -webkit-linear-gradient(left, transparent, #fff 55%); background: -o-linear-gradient(right, transparent, #fff55%); background: -moz-linear-gradient(right, transparent, #fff55%); background: linear-gradient(to right, transparent, #fff55%); }
# 6.介绍下BFC及其应用
BFC特性:
- 内部box会在垂直方向,一个接一个地放置。
- Box垂直方向的距离由margin决定,在一个BFC中,两个相邻的块级盒子的垂直外边距会产生折叠。
- 在BFC中,每一个盒子的左外边缘(margin-left)会触碰到容器的左边缘(border-left)(对于从右到左的格式来说,则触碰到右边缘)
- 形成了BFC的区域不会与float box重叠
- 计算BFC高度时,浮动元素也参与计算
生成BFC除了 @webproblem 童鞋所说的还有:行内块元素、网格布局、contain值为layout、content或 strict的元素等。 更多生成BFC的方法: 传送门
BFC作用:
- 利用特性4可实现左图右文之类的效果:
|
|
- 利用特性5可以解决浮动元素造成的父元素高度塌陷问题:
|
|
# 7.页面导入样式时,使用link和@import有什么区别?
相同的地方,都是外部引用CSS方式,区别:
- link是xhtml标签,除了加载css外,还可以定义RSS等其他事务;@import属于CSS范畴,只能加载CSS
- link引用CSS时候,页面载入时同时加载;@import需要在页面完全加载以后加载,而且@import被引用的CSS会等到引用它的CSS文件被加载完才加载
- link是xhtml标签,无兼容问题;@import是在css2.1提出来的,低版本的浏览器不支持
- link支持使用javascript控制去改变样式,而@import不支持
- link方式的样式的权重高于@import的权重
- import在html使用时候需要``标签
# 8.无样式内容闪烁(FOUC)Flash of Unstyle Content
@import导入CSS文件会等到文档加载完后再加载CSS样式表。因此,在页面DOM加载完成到CSS导入完成之间会有一段时间页面上的内容是没有样式的。
解决方法:使用link标签加载CSS样式文件。因为link是顺序加载的,这样页面会等到CSS下载完之后再下载HTML文件,这样先布局好,就不会出现FOUC问题。
# 9.CSS3有哪些新特性
- 新增各种
css
选择器 - 圆角
border-radius
- 多列布局
- 阴影和反射
- 文字特效
text-shadow
- 线性渐变
- 旋转
transform
# 10.CSS3新增伪类有那些?
:after
在元素之前添加内容,也可以用来做清除浮动。:before
在元素之后添加内容。:enabled
已启用的表单元素。:disabled
已禁用的表单元素。:checked
单选框或复选框被选中。
# 11.CSS常用选择器
|
|
# 12.display:inline-block
什么时候不会显示间隙?
- 移除空格
- 使用
margin
负值 - 使用
font-size:0
letter-spacing
word-spacing
# 为什么要初始化CSS样式?
- 因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对
CSS
初始化往往会出现浏览器之间的页面显示差异。 - 当然,初始化样式会对
SEO
有一定的影响,但鱼和熊掌不可兼得,但力求影响最小的情况下初始化
- 因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对
# 14.position
有哪些值?有什么作用?
static
。默认值,不脱离文档流,top
,right
,bottom
,left
等属性不生效。relative
。不脱离文档流,依据自身位置进行偏离,当子元素设置absolute
,将依据它进行偏离。absolute
。脱离文档流,依据top,right,bottom,left
等属性在正常文档流中偏移位置。fixed
。通过浏览器窗口进行定位,出现滚动条的时候,不会随之滚动。
# 15.垂直居中有哪些方法?
- 单行文本的话可以使用
height
和line-height
设置同一高度。 position+margin
:设置父元素:position: relative;
,子元素height: 100px;position:absolute;top: 50%; margin: -50px 0 0 0;
(定高)position+transform
:设置父元素position:relative
,子元素:position: absolute;top: 50%;transform: translate(0, -50%);
(不定高)- 百搭flex布局(ie10+),设置父元素
display:flex;align-items: center;
(不定高)
# 16.水平居中的方法
- 元素为行内元素,设置父元素
text-align:center
- 如果元素宽度固定,可以设置左右
margin
为auto
; - 如果元素为绝对定位,设置父元素
position
为relative
,元素设left:0;right:0;margin:auto;
- 使用
flex-box
布局,指定justify-content
属性为center
display
设置为tabel-ceil
# 17.Flex布局
|
|
# 18.stylus/sass/less
区别
- 均具有“变量”、“混合”、“嵌套”、“继承”、“颜色混合”五大基本特性
Scss
和LESS
语法较为严谨,LESS
要求一定要使用大括号“{}”,Scss
和Stylus
可以通过缩进表示层次与嵌套关系Scss
无全局变量的概念,LESS
和Stylus
有类似于其它语言的作用域概念Sass
是基于Ruby
语言的,而LESS
和Stylus
可以基于NodeJS NPM
下载相应库后进行编译;
# 19.知道css有个content属性吗?有什么作用?有什么应用?
css
的content
属性专门应用在 before/after
伪元素上,用于来插入生成内容。最常见的应用是利用伪类清除浮动。
# 20.重置(resetting)CSS 和 标准化(normalizing)CSS 的区别是什么?你会选择哪种方式,为什么?
- 重置(Resetting): 重置意味着除去所有的浏览器默认样式。对于页面所有的元素,像
margin
、padding
、font-size
这些样式全部置成一样。你将必须重新定义各种元素的样式。 - 标准化(Normalizing): 标准化没有去掉所有的默认样式,而是保留了有用的一部分,同时还纠正了一些常见错误。
当需要实现非常个性化的网页设计时,我会选择重置的方式,因为我要写很多自定义的样式以满足设计需求,这时候就不再需要标准化的默认样式了。
# 参考
# 21.请阐述Float
定位的工作原理。
浮动(float)是 CSS 定位属性。浮动元素从网页的正常流动中移出,但是保持了部分的流动性,会影响其他元素的定位(比如文字会围绕着浮动元素)。这一点与绝对定位不同,绝对定位的元素完全从文档流中脱离。
CSS 的clear
属性通过使用left
、right
、both
,让该元素向下移动(清除浮动)到浮动元素下面。
如果父元素只包含浮动元素,那么该父元素的高度将塌缩为 0。我们可以通过清除(clear)从浮动元素后到父元素关闭前之间的浮动来修复这个问题。
有一种 hack 的方法,是自定义一个.clearfix
类,利用伪元素选择器::after
清除浮动。
另外还有一些方法,比如添加空的``和设置浮动元素父元素的overflow
属性。与这些方法不同的是,clearfix
方法,只需要给父元素添加一个类,定义如下:
|
|
值得一提的是,把父元素属性设置为overflow: auto
或overflow: hidden
,会使其内部的子元素形成块格式化上下文(Block Formatting Context),并且父元素会扩张自己,使其能够包围它的子元素。
# 参考
# 22.请阐述z-index
属性,并说明如何形成层叠上下文(stacking context)。
CSS 中的z-index
属性控制重叠元素的垂直叠加顺序。z-index
只能影响position
值不是static
的元素。
没有定义z-index
的值时,元素按照它们出现在 DOM 中的顺序堆叠(层级越低,出现位置越靠上)。非静态定位的元素(及其子元素)将始终覆盖静态定位(static)的元素,而不管 HTML 层次结构如何。
层叠上下文是包含一组图层的元素。 在一组层叠上下文中,其子元素的z-index
值是相对于该父元素而不是 document root 设置的。每个层叠上下文完全独立于它的兄弟元素。如果元素 B 位于元素 A 之上,则即使元素 A 的子元素 C 具有比元素 B 更高的z-index
值,元素 C 也永远不会在元素 B 之上.
每个层叠上下文是自包含的:当元素的内容发生层叠后,整个该元素将会在父层叠上下文中按顺序进行层叠。少数 CSS 属性会触发一个新的层叠上下文,例如opacity
小于 1,filter
不是none
,transform
不是none
。
# 参考
- https://css-tricks.com/almanac/properties/z/z-index/
- https://philipwalton.com/articles/what-no-one-told-you-about-z-index/
- https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context
# 23.如何解决不同浏览器的样式兼容性问题?
- 在确定问题原因和有问题的浏览器后,使用单独的样式表,仅供出现问题的浏览器加载。这种方法需要使用服务器端渲染。
- 使用已经处理好此类问题的库,比如 Bootstrap。
- 使用
autoprefixer
自动生成 CSS 属性前缀。 - 使用 Reset CSS 或 Normalize.css。
# 24.编写高效的 CSS 应该注意什么?
首先,浏览器从最右边的选择器,即关键选择器(key selector),向左依次匹配。根据关键选择器,浏览器从 DOM 中筛选出元素,然后向上遍历被选元素的父元素,判断是否匹配。选择器匹配语句链越短,浏览器的匹配速度越快。避免使用标签和通用选择器作为关键选择器,因为它们会匹配大量的元素,浏览器必须要进行大量的工作,去判断这些元素的父元素们是否匹配。
# 25.使用 CSS 预处理的优缺点分别是什么?
优点:
- 提高 CSS 可维护性。
- 易于编写嵌套选择器。
- 引入变量,增添主题功能。可以在不同的项目中共享主题文件。
- 通过混合(Mixins)生成重复的 CSS。
- Splitting your code into multiple files. CSS files can be split up too but doing so will require a HTTP request to download each CSS file.
- 将代码分割成多个文件。不进行预处理的 CSS,虽然也可以分割成多个文件,但需要建立多个 HTTP 请求加载这些文件。
缺点:
- 需要预处理工具。
- 重新编译的时间可能会很慢。
# 对于你使用过的 CSS 预处理,说说喜欢和不喜欢的地方?
喜欢:
- 绝大部分优点上题以及提过。
- Less 用 JavaScript 实现,与 NodeJS 高度结合。
Dislikes:
- 我通过
node-sass
使用 Sass,它用 C ++ 编写的 LibSass 绑定。在 Node 版本切换时,我必须经常重新编译。 - Less 中,变量名称以
@
作为前缀,容易与 CSS 关键字混淆,如@media
、@import
和@font-face
。
# 26.如何实现一个使用非标准字体的网页设计?
使用@font-face
并为不同的font-weight
定义font-family
。
# 27.解释浏览器如何确定哪些元素与 CSS 选择器匹配。
这部分与上面关于编写高效的 CSS 有关。浏览器从最右边的选择器(关键选择器)根据关键选择器,浏览器从 DOM 中筛选出元素,然后向上遍历被选元素的父元素,判断是否匹配。选择器匹配语句链越短,浏览器的匹配速度越快。
例如,对于形如p span
的选择器,浏览器首先找到所有元素,并遍历它的父元素直到根元素以找到
元素。对于特定的,只要找到一个
,就知道’`已经匹配并停止继续匹配。
# 28.描述伪元素及其用途。
CSS 伪元素是添加到选择器的关键字,去选择元素的特定部分。它们可以用于装饰(:first-line
,:first-letter
)或将元素添加到标记中(与 content:…组合),而不必修改标记(:before
,:after
)。
:first-line
和:first-letter
可以用来修饰文字。- 上面提到的
.clearfix
方法中,使用clear: both
来添加不占空间的元素。 - 使用
:before
和after
展示提示中的三角箭头。鼓励关注点分离,因为三角被视为样式的一部分,而不是真正的 DOM。如果不使用额外的 HTML 元素,只用 CSS 样式绘制三角形是不太可能的。
# 29.说说你对盒模型的理解,以及如何告知浏览器使用不同的盒模型渲染布局。
CSS 盒模型描述了以文档树中的元素而生成的矩形框,并根据排版模式进行布局。每个盒子都有一个内容区域(例如文本,图像等)以及周围可选的padding
、border
和margin
区域。
CSS 盒模型负责计算:
- 块级元素占用多少空间。
- 边框是否重叠,边距是否合并。
- 盒子的尺寸。
盒模型有以下规则:
- 块级元素的大小由
width
、height
、padding
、border
和margin
决定。 - 如果没有指定
height
,则块级元素的高度等于其包含子元素的内容高度加上padding
(除非有浮动元素,请参阅下文)。 - 如果没有指定
width
,则非浮动块级元素的宽度等于其父元素的宽度减去父元素的padding
。 - 元素的
height
是由内容的height
来计算的。 - 元素的
width
是由内容的width
来计算的。 - 默认情况下,
padding
和border
不是元素width
和height
的组成部分。
# 30.响应式设计与自适应设计有何不同?
响应式设计和自适应设计都以提高不同设备间的用户体验为目标,根据视窗大小、分辨率、使用环境和控制方式等参数进行优化调整。
响应式设计的适应性原则:网站应该凭借一份代码,在各种设备上都有良好的显示和使用效果。响应式网站通过使用媒体查询,自适应栅格和响应式图片,基于多种因素进行变化,创造出优良的用户体验。就像一个球通过膨胀和收缩,来适应不同大小的篮圈。
自适应设计更像是渐进式增强的现代解释。与响应式设计单一地去适配不同,自适应设计通过检测设备和其他特征,从早已定义好的一系列视窗大小和其他特性中,选出最恰当的功能和布局。与使用一个球去穿过各种的篮筐不同,自适应设计允许使用多个球,然后根据不同的篮筐大小,去选择最合适的一个。
# 参考
- https://developer.mozilla.org/en-US/docs/Archive/Apps/Design/UI_layout_basics/Responsive_design_versus_adaptive_design
- http://mediumwell.com/responsive-adaptive-mobile/
- https://css-tricks.com/the-difference-between-responsive-and-adaptive-design/
# 31.你有没有使用过视网膜分辨率的图形?当中使用什么技术?
我倾向于使用更高分辨率的图形(显示尺寸的两倍)来处理视网膜显示。更好的方法是使用媒体查询,像@media only screen and (min-device-pixel-ratio: 2) { … }
,然后改变background-image
。
对于图标类的图形,我会尽可能使用 svg 和图标字体,因为它们在任何分辨率下,都能被渲染得十分清晰。
还有一种方法是,在检查了window.devicePixelRatio
的值后,利用 JavaScript 将``的src
属性修改,用更高分辨率的版本进行替换。
# 32.什么情况下,用translate()
而不用绝对定位?什么时候,情况相反。
translate()
是transform
的一个值。改变transform
或opacity
不会触发浏览器重新布局(reflow)或重绘(repaint),只会触发复合(compositions)。而改变绝对定位会触发重新布局,进而触发重绘和复合。transform
使浏览器为元素创建一个 GPU 图层,但改变绝对定位会使用到 CPU。 因此translate()
更高效,可以缩短平滑动画的绘制时间。
当使用translate()
时,元素仍然占据其原始空间(有点像position:relative
),这与改变绝对定位不同。
# 33.如何用css实现瀑布流布局
利用column-count和break-inside这两个CSS3属性即可,复制如下代码即可察看效果
|
|
# 33.文本超出部分显示省略号
# 单行
|
|
# 多行
|
|
# 34.去除inline-block元素间间距的方法
- 移除空格
- 使用margin负值
- 使用font-size:0
- letter-spacing
- word-spacing