这篇文章主要围绕前端Css常见面试和前端css常见面试问题展开,旨在为您提供一份详细的参考资料。我们将全面介绍前端Css常见面试的优缺点,解答前端css常见面试问题的相关问题,同时也会为您带来02:R
这篇文章主要围绕前端Css常见面试和前端css常见面试问题展开,旨在为您提供一份详细的参考资料。我们将全面介绍前端Css常见面试的优缺点,解答前端css常见面试问题的相关问题,同时也会为您带来02:Redis常见面试题、css-flex常见面试题、CSS常见面试题、iOS常见面试题的实用方法。
本文目录一览:前端Css常见面试(前端css常见面试问题)
对于前端来说,涉及的知识面广,内容繁多,但是万变不离其宗,主要也就是围绕着html(5),css(less,scss,sass,styus,css3),js(es5,es6),以及常见的几大热门框架vue,react等,话不多说,直接开始进入主题。
1.请说出几个html5新特性
答:html5增加的新特性具体为:
新增的语义/结构化标签,如增加了footer,article,main,nav等;
新增的input的type类型和属性,如:email,tel,number等;
HTML5专有的API 地理位置 本地存储 缓存等
新的图形标签 svg canvas 二者区别
新的多媒体标签 video audio source
废弃的一些元素标签,如:font
自定义元素标签
DOCTYPE 和字符编码charset声明
2.z-index的使用
答:z-index是用于设置标签的层级关系,使用z-index的时候需要同时设置标签的position属性(如relative或者absolute或者fixed都可),标签的默认z-index为0,可以设置负数,值越大,越在顶部
3.position的属性以及使用方式
答:position是css的定位属性,其主要包括以下几个不同的属性值,具体如下:
absolute
生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位。
元素的位置通过 “left”,“top”,“right” 以及 “bottom” 属性进行规定。
fixed
生成绝对定位的元素,相对于浏览器窗口进行定位。
元素的位置通过 “left”,“right” 以及 “bottom” 属性进行规定。
relative
生成相对定位的元素,相对于其正常位置进行定位。
因此,”left:20” 会向元素的 left 位置添加 20 像素。
static
默认值。没有定位,元素出现在正常的流中(忽略 top,bottom,left,right 或者 z-index 声明)。
inherit
规定应该从父元素继承 position 属性的值。
4.float的使用
答:属性定义元素在哪个方向浮动。以往这个属性总应用于图像,使文本围绕在图像周围,不过在 CSS 中,任何元素都可以浮动。浮动元素会生成一个块级框,而不论它本身是何种元素。具体如下:
float造成的效果
使元素本身变成了类似于inline-block的元素
使包裹它的元素忽略它的高度,即父元素没有了高度
如:给子元素Box设置了height:100px;此时的父元素height也是100px。
float的影响
float使元素脱离了文档流按照指定的方向发生了移动,直到它的外边缘碰到包含框或者另一个浮动的边框为止。
浮动只会影响他后面的元素,如果上面的元素不浮动,他也不会上去的
如果父元素太窄,无法容纳所有的浮动元素,无法容纳的浮动元素会换行显示。
以换行的那个元素为基准,如果有浮动元素的高度大于换行的那个元素,那么当换行元素换行时会被高的那个元素"卡住"
5.清除浮动影响的方式
答:float会造成文档流的破坏,因此,需要消除float所造成的影响一般有如下几种方案解决:
针对子元素:给浮动的子元素后面再加一个元素,加上一个clear:both属性即可正常显示,缺点是随意添加了一个空元素,不符合代码规范
针对父元素:给父元素后面添加一个相邻的空元素,设置clear属性,但只是让后面的元素正常显示,并没有撑开父元素的高度
针对父元素:给父元素设置高度,可以正常显示,但扩展性不好,因为一般都是由里面的内容来撑开高度
针对父元素:给父元素设置display: inline-block,可以正常显示,但父元素的margin:auto失效了,而且会发现上下两个部分会出现间隙
针对父元素:给父元素设置overflow: hidden,可以正常显示了,但需要配合宽度,否则会默认占满一行。
6.css动画属性(如使用css制动一个旋转三角形)
答:制作一个三角形可以直接使用border的属性,具体为可以设置盒子的高宽度为0px,然后设置对应宽度的不同border的颜色属性,三角形对应的底边设置为具体的三角形颜色,其对应变不设置或者设置为宽度为0 另外两个斜边设置为transparent
旋转动画会涉及到css的两个属性,分别为:
1)transition:动画属性,可以写四个值 分别为对应动画的属性名称或者直接设置all、动画完成的时间(单位为s或者ms)、动画的变化曲线、动画开始的时间
2)transform:旋转属性 主要有rotate(弧度旋转分别还有rotate3d,rotateX,rotateY,rotateZ),translate(同理有四个),scale(同理有四个)
7.正规盒子模型和非正规盒子模型
答:盒子模型主要是计算标签的宽度或高度不一致,标准的盒子模型的包括:margin,border,padding以及内容的宽度,即:盒子的实际宽度=内容的左右margin+左右border+左右padding+内容的实际宽度;而在css3中引入了Box-sizing属性,可以改变标准盒子模型的计算方式,具体为:设置Box-sizing:border-Box的时候,盒子的实际宽度=内容的左右margin+内容的实际宽度,当然可以直接设置Box-sizing:content-Box的时候即可恢复正常的标准盒子模型
8.flex弹性布局
答:1.设置盒子的display属性为flex,或者line-flex,其对应还有六个css属性,分别为:
1)flex-direction:设置子元素的排列方式(row,column,row-reverse,column-reverse)
2)flex-warp:设置子元素的是否换行(Nowarp,warp,warp-reverse)
3)flex-flow:flex-direction和flex-warp的缩写,默认为row Nowarp
4)justify-content:设置子元素的水平排列方式(flex-start,flex-end,center,span-around,span-between)
5)align-items:设置子元素的垂直方式(flex-start,flex-end,center,stretch,baseline)
6)align-content:设置多个轴线的排列方式(flex-start,flex-end,center,spand-around,spand-between,stretch)
2. 对应的子元素项目也拥有自身的六个css属性,分别为:
1)order:设置元素的排列权重 值越大越在后
2)flex-grow:设置元素的放大比例
3)flex-shrink:设置元素的缩小比例
4)flex-basis:设置多余空间项目主轴所占比例空间
5)flex:flex-grow和flex-shrink和flex-basis的缩写方式 默认为0 1 auto
6)align-self:设置子元素自己的垂直排列方式,默认为盒子的align-items的值
⚠️:设置flex布局后,子元素的float,clear,vertical-align都无效
9.grid网格布局
答:1. 设置盒子的网格布局需要设置display为grid或者line-grid,其对应包括以下属性:
1)grid-template-columns:定义每一列的宽度
2)grid-template-rows:定义每一行的高度
3)grid-row-gap:定义行之间的间隙
4)grid-column-gap:定义列之间的间隙
5)grid-gap:定义行和列之间的间隙缩写
6)grid-teamplate-areas:定义一个区域由多个单元格组成
7)grid-auto-flow:定义容器排列顺序
8)justify-items:定义子元素的内容水平排列顺序
9)align-items:定义子元素的内容垂直排列顺序
10)place-items:定义子元素的内容水平和垂直顺序的缩写方式
11)justify-content:定义容器(网格)的水平排列顺序
12)align-content:定义容器(网格)的垂直排列顺序
13)place-content:定义容器的水平和垂直排列顺序的缩写方式
2. 子元素的属性包括:
1)grid-column-start:列开始的位置
2)grid-column-end:列结束的位置
3)grid-row-start:行开始的位置
4)grid-row-end:行结束的位置
5)grid-column:列开始和结束位置
6)grid-row:行开始和结束的位置
7)grid-area:定义元素放置在哪个区域
8)justify-self:定义元素自己的水平排列方式
9)align-self:定义元素自己的垂直排列方式
10)place-self:定义元素自己的水平和垂直排列方式,当设置为网格布局后,子元素的float,inline-block,table-cell,column-*属性全部失效
10.常见居中方案
答:1. 行内元素水平居中:直接使用text-align:center
2. 行内元素垂直居中:vertical-align:middle并设置父级元素的行高为父级元素的高度
3. 固定宽度的元素 水平居中使用:magin:0 auto
4. flex弹性布局:设置justify-content:center水平居中,align-items:垂直居中
5. 通过padding属性进行垂直居中
6. 设置父级元素为:display:table-cell,vertical-align:middle
7. 通过伪元素设置垂直居中:设置父级元素一个伪元素 并设置其为inline-block,同时设置vertical-align:middle
8. 高度确定的时候:绝对定位+margin来垂直居中
9. 高度不确定的时候:绝对定位+transform,具体为:设置需要垂直居中的元素为:position:absolute,top:50%,transform:translateY(-50%)
10. 通过flex-duration:column来垂直居中:display:flex,flex-duration:column,justify-content:center
水平垂直居中方法:
1. 父级元素高度已知,子元素高宽固定(高度可不固定):text-align:center,line-height:父级高度
2.绝对定位+margin实现垂直水平居中,需要知道子元素高宽度
3. 绝对定位+transform实现垂直水平居中,可以不知道子元素高宽度:position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)
4. 使用display为table,子元素为display:table-cell;vertical-align:center;text-align:center子子元素设置为vertical-align:center
5. 使用父元素的伪元素进行垂直居中(父元素需要知道高度),设置伪元素的高度为100%,并设置vertical-align:middle,display:inline-block;子元素设置vertical-align:center;display:inline-block(子元素水平居中可以采用text-align:center或者margin:0 auto)
6. 子元素设置为margin:auto;position:absolute;top:0;left:0;right:0;bottom:0;
11.伪元素的使用
常见伪类——:hover,:link,:active,:target,:not(),:focus。
常见伪元素——::first-letter,::first-line,::before,::after,::selection
::before和::after下特有的content,用于在css渲染中向元素逻辑上的头部或尾部添加内容。
这些添加不会出现在DOM中,不会改变文档内容,不可复制,仅仅是在css渲染层加入。
所以不要用:before或:after展示有实际意义的内容,尽量使用它们显示修饰性内容,例如图标
12.css选择器
答:通配符选择器,标签选择器,类选择器,id选择器,属性选择器,空格选择器 大于选择器 加号选择器
13.div设置padding为100%的表现形式
答:不管是标准模式还是Box-sizing模式下,padding都为元素的总宽度是部分,所以此时div的表现为对应div的颜色
14.em、rem、px的用法
em是相对长度单位。相对于当前对象内文本的字体尺寸。如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸。
rem相对的只是HTML根元素的font-size的大小来进行计算
px像素(Pixel)。相对长度单位。像素px是相对于显示器屏幕分辨率而言的。
豌豆资源搜索网站https://55wd.com 电脑刺绣绣花厂 ttp://www.szhdn.com
15.margin的用法及注意事项
答:margin在使用的时候因为会出现相邻两个标签之间的margin进行合并,即设置上下两个标签的margin-top和margin-bottom的时候,会进行自动的合并,以最大的那个属性值为两者之间的实际间隔
16.列举几个常见的css3的属性及用途
答:常见的有:border-radius:设置标签的圆角;Box-shadow:设置阴影,Box-sizing:改变盒子模型等
17.less和sass的用比较
不同之处
Less环境较Sass简单
Sass的安装需要安装Ruby环境,Less基于JavaScript,是需要引入Less.js来处理代码输出css到浏览器,也可以在开发环节使用Less,然后编译成css文件,直接放在项目中。
Less使用较Sass简单
Less并没有裁剪CSS原有的特性,而是在现有CSS语法的基础上,为CSS加入程序式语言的特性。
Sass功能较Less强大
1、sass有变量和作用域
2、sass有函数的概念
3、进程控制:条件、循环遍历、继承、引用
4、数据结构:数组、map
Less和Sass处理机制不一样
前者是通过客户端处理的,后者是通过服务端处理,相比较之下前者解析会比后者慢一点。
关于变量在Less和Sass中的唯一区别就是Less用@,Sass用$
相同之处
Less和Sass在语法上有些共性,比如下面这些:
1、混入(Mixins)——class中的class;
2、参数混入——可以传递参数的class,就像函数一样;
3、嵌套规则——Class中嵌套class,从而减少重复的代码;
4、运算——CSS中用上数学;
5、颜色功能——可以编辑颜色;
6、名字空间(namespace)——分组样式,从而可以被调用;
7、作用域——局部修改样式;
8、JavaScript 赋值——在CSS中使用JavaScript表达式赋值。
当然,在涉及到css的时候还会询问有关css预处理语言,如less,scss等,可自行查看相应的资料,在此不做过多的讲解
总结
以上是小编为你收集整理的前端Css常见面试全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
02:Redis常见面试题
1.1 redis基础面试题
1、什么是Redis?简述它的优缺点?
1. Redis本质上是一个Key-Value类型的内存数据库,很像memcached。
2. 整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。
3. 因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。
4. Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1G
不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能。
5. 比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高性能的tag系统等等。
6. Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的memcached来用。
7. Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,
因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
2、Redis相比memcached有哪些优势?
1. memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型
2. redis的速度比memcached快很多
3. redis可以持久化其数据
3、redis五种数据类型,每种数据类型应用在哪?
1. Str(缓存)
2. List(消息队列)
3. hashes(用户id+对应属性名称作为唯一的标识来取得对应属性的值)
4. Set(set类似list,特殊之处是set可以自动排重:找两个人微博的共同好友)
5. Sorted Set
sorted set的使用场景与set类似,区别是set不是自动有序的
而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。
比如:twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。
4、Redis有哪几种数据淘汰策略?
noeviction:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外)
allkeys-lru: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
allkeys-random: 回收随机的键使得新添加的数据有空间存放。
volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
volatile-ttl: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。
5、一个字符串类型的值能存储最大容量是多少?
512M
6、为什么Redis需要把所有数据放到内存中?
Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。
所以redis具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘I/O速度为严重影响redis的性能。
如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值。
7、Redis集群方案应该怎么做?都有哪些方案?
1)codis。
codis目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在 节点数量改变情况下,旧节点数据可恢复到新hash节点。
2)redis cluster3.0自带的集群
特点在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持节点设置从节点。
3)在业务代码层实现
起几个毫无关联的redis实例,在代码层,对key 进行hash计算,然后去对应的redis实例操作数据。
这种方式对hash层代码要求比较高,考虑部分包括,节点失效后的替代算法方案,数据震荡后的自动脚本恢复,实例的监控,等等。
8、Redis集群方案什么情况下会导致整个集群不可用?
有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用。
9、MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?
redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。
10、说说Redis哈希槽的概念?
Redis集群没有使用一致性hash,而是引入了哈希槽的概念,Redis集群有16384个哈希槽。
每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。
11、Redis集群的主从复制模型是怎样的?
为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品.
12、Redis集群会有写操作丢失吗?为什么?
Redis并不能保证数据的强一致性,这意味这在实际中集群在特定的条件下可能会丢失写操作。
1.2 Redis有哪些适合的场景
1、会话缓存(Session Cache)
最常用的一种使用Redis的情景是会话缓存(session cache)。
用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。
2、全页缓存(FPC)
除基本的会话token之外,Redis还提供很简便的FPC平台。
回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。
3、队列
Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。
Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。
4、排行榜/计数器
Redis在内存中对数字进行递增或递减的操作实现的非常好。
集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。
所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_scores”,我们只需要像下面一样执行即可:
当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行:
ZRANGE user_scores 0 10 WITHSCORES
Agora Games就是一个很好的例子,用Ruby实现的,它的排行榜就是使用Redis来存储数据的,你可以在这里看到。
5、发布/订阅
发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统!
css-flex常见面试题
废话不多说!
flex-内容宽度等分
//css
.box {
display: flex;
}
.box div {
flex: 1;
border: 1px solid red;
}
//html
<div>
<div>1</div>
<div>2</div>
<div>3</div>
</div>
左右布局,一侧定宽,一侧自适应撑满
//css
html,
body {
height: 100%
}
.main {
display: flex;
height: 100%;
}
.left,
.right {
height: 100%;
border: 1px solid red;
box-sizing: border-box;
}
.left {
width: 300px;
}
.right {
width: 100%;
}
//html
<div>
<div>固定宽度300px</div>
<div>自适应宽度</div>
</div>
未知高宽上下左右居中
//css
html,
body {
height: 100%
}
.main {
display: flex;
height: 100%;
justify-content: center;
align-items: center
}
.box {
width: 300px;
border: 1px solid red;
}
//html
<div>
<div>未知高度上下左右居中</div>
</div>
这个效果就不展示了,可以做到未知宽高,和已知宽未知高的居中效果。
CSS常见面试题
CSS引入
一、行内式,二、内部样式表,三、外部样式表
link @import
a. link属于HTML标签,而@import是CSS提供的,且只能加载 CSS
b. 页面被加载时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载
c. import只在IE5以上才能识别,而link是HTML标签,无兼容问题
立即学习“前端免费学习笔记(深入)”;
d. link方式的样式的权重 高于@import的权重
e. 当使用 Javascript 控制 DOM 去改变样式的时候,只能使用 link 方式,因为 @import 眼里只有 CSS ,不是 DOM 可以控制
CSS基础选择器:
1.标签选择器 element
2.类选择器(多类名选择器).
3.id选择器四 #
4.通配符选择器 *
专题推荐:2020年CSS面试题汇总(最新)
CSS复合选择器:
后代选择器 E>F
子元素选择器
交集选择器
并集选择器 ,
链接伪类选择器 lvha
单冒号(:)用于CSS3伪类,双冒号(::)用于CSS3伪元素
<ul> <p>111</p> <span>222</span> <li>1</li> <li>2</li> <li>3</li> </ul>
li:nth-of-type(2):表示ul下的第二个li元素
li:nth-child(2):表示既是li元素又是在ul下的第二个元素(找不到)。
建议一般使用nth-of-type,不容易出问题。
css三大特性:CSS层叠性、CSS继承性、CSS优先级
谈谈你对CSS布局的理解
盒子模型
清楚浮动的方式:
一、额外标签法,
<p></p>
二、父级添加overflow属性方法
三、使用after伪元素清除浮动
.clearfix:after { content: ""; display: block; height: 0; clear: both; visibility: hidden; } .clearfix {*zoom: 1;} /* IE6、7 专有 */。
四、使用双伪元素清除浮动
定位模式与边偏移:
元素的显示与隐藏:
display:none;
overflow:hidden
鼠标样式cursor
default小白 默认,pointer小手,move移动,text文本,not-allowed禁止
vertical-align 垂直对齐
溢出的文字省略号显示
1.white-space:nowrap强制文本在一行上显示
2.overflow: hidden超出部分隐藏
3.text-overflow:ellipsis当对象内文本溢出时显示省略标记
常见的布局方式:
固定布局、
流式(%)布局、
弹性(flex)布局、
rem布局
浮动布局、清除浮动
定位布局、
margin和padding
块级元素垂直居中
如何让一个p 上下左右居中
1.
left:50%; top:50%
transform: translate(-50%,-50%)
2.
left:0; top: 0; bottom: 0; right: 0; margin: auto
3.px
CSS三大特性:层叠 继承 优先级
可以继承的属性
文本相关:font-family,font-size, font-style,font-variant,font-weight, font,letter-spacing,line-height,color
列表相关:list-style-image,list-style-position,list-style-type, list-style
CSS3新特性
实现圆角(border-radius),阴影(box-shadow),对文字加特效(text-shadow),线性渐变(gradient),变形(transform)
增加了更多的CSS选择器 多背景 rgba,在CSS3中唯一引入的伪元素是::selection,媒体查询,多栏布局
CSS引入
一、行内式,二、内部样式表,三、外部样式表
link @import
a. link属于HTML标签,而@import是CSS提供的,且只能加载 CSS
b. 页面被加载时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载
c. import只在IE5以上才能识别,而link是HTML标签,无兼容问题
立即学习“前端免费学习笔记(深入)”;
d. link方式的样式的权重 高于@import的权重
e. 当使用 Javascript 控制 DOM 去改变样式的时候,只能使用 link 方式,因为 @import 眼里只有 CSS ,不是 DOM 可以控制
CSS基础选择器:
1.标签选择器 element
2.类选择器(多类名选择器).
3.id选择器四 #
4.通配符选择器 *
CSS复合选择器:
后代选择器 E>F
子元素选择器
交集选择器
并集选择器 ,
链接伪类选择器 lvha
单冒号(:)用于CSS3伪类,双冒号(::)用于CSS3伪元素
<ul> <p>111</p> <span>222</span> <li>1</li> <li>2</li> <li>3</li> </ul>
li:nth-of-type(2):表示ul下的第二个li元素
li:nth-child(2):表示既是li元素又是在ul下的第二个元素(找不到)。
建议一般使用nth-of-type,不容易出问题。
css三大特性:CSS层叠性、CSS继承性、CSS优先级
谈谈你对CSS布局的理解
盒子模型
清楚浮动的方式:
一、额外标签法,
<p></p>
二、父级添加overflow属性方法
三、使用after伪元素清除浮动
.clearfix:after { content: ""; display: block; height: 0; clear: both; visibility: hidden; } .clearfix {*zoom: 1;} /* IE6、7 专有 */。
四、使用双伪元素清除浮动
定位模式与边偏移:
元素的显示与隐藏:
display:none;
overflow:hidden
鼠标样式cursor
default小白 默认,pointer小手,move移动,text文本,not-allowed禁止
vertical-align 垂直对齐
溢出的文字省略号显示
1.white-space:nowrap强制文本在一行上显示
2.overflow: hidden超出部分隐藏
3.text-overflow:ellipsis当对象内文本溢出时显示省略标记
常见的布局方式:
固定布局、
流式(%)布局、
弹性(flex)布局、
rem布局
浮动布局、清除浮动
定位布局、
margin和padding
块级元素垂直居中
如何让一个p 上下左右居中
1.
left:50%; top:50%
transform: translate(-50%,-50%)
2.
left:0; top: 0; bottom: 0; right: 0; margin: auto
3.px
CSS三大特性:层叠 继承 优先级
可以继承的属性
文本相关:font-family,font-size, font-style,font-variant,font-weight, font,letter-spacing,line-height,color
列表相关:list-style-image,list-style-position,list-style-type, list-style
CSS3新特性
实现圆角(border-radius),阴影(box-shadow),对文字加特效(text-shadow),线性渐变(gradient),变形(transform)
增加了更多的CSS选择器 多背景 rgba,在CSS3中唯一引入的伪元素是::selection,媒体查询,多栏布局
相关教程推荐:CSS视频教程
以上就是CSS常见面试题的详细内容,更多请关注php中文网其它相关文章!
iOS常见面试题
category 和 extension 的区别
分类有名字,类扩展没有分类名字,是一种特殊的分类
分类只能扩展方法(属性仅仅是声明,并没真正实现),类扩展可以扩展属性、成员变量和方法
define 和 const常量有什么区别?
define在预处理阶段进行替换,const常量在编译阶段使用
宏不做类型检查,仅仅进行替换,const常量有数据类型,会执行类型检查
define不能调试,const常量可以调试
define定义的常量在替换后运行过程中
会不断地占用内存
,而const定义的常量存储在数据段只有一份copy
,效率更高define可以定义一些简单的函数,const不可以
block和weak修饰符的区别?
__block不管是ARC还是MRC模式下
都
可以使用,可以
修饰对象,也可以
修饰基本数据类型__weak
只能
在ARC模式下使用,只能
修饰对象(NSString),不能
修饰基本数据类型block修饰的对象可以在block中被重新赋值,weak修饰的对象不可以
static关键字的作用
函数(方法)体内 static 变量的作用范围为该函数体,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;
在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明 它的模块内;
在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的static 成员变量
堆和栈的区别
从管理方式来讲
对于栈来讲,是由编译器自动管理,无需我们手工控制;
对于堆来说,释放工作由程序员控制,容易产生内存泄露(memory leak)
从申请大小大小方面讲
栈空间比较小
堆控件比较大
从数据存储方面来讲
栈空间中一般存储基本类型,对象的地址
堆空间一般存放对象本身,block的copy等
风格纠错题
修改后的代码
typedef NS_ENUM(NSInteger, CYLSex)
{
CYLSexMan,
CYLSexWoman
};@interface CYLUser : NSObject<NSCopying>@property (nonatomic, copy, readonly) NSString *name;@property (nonatomic, assign, readonly) NSUInteger age;@property (nonatomic, assign, readwrite) CYLSex sex;
- (instancetype)initWithName:(NSString *)name age:(NSUInteger)age sex:(CYLSex)sex;
- (instancetype)initWithName:(NSString *)name age:(NSUInteger)age;
+ (instancetype)userWithName:(NSString *)name age:(NSUInteger)age sex:(CYLSex)sex;@end
详细解说,这里就不列举了
Objective-C使用什么机制管理对象内存?
MRC 手动引用计数
ARC 自动引用计数,现在通常ARC
通过 retainCount 的机制来决定对象是否需要释放。 每次 runloop 的时候,都会检查对象的 retainCount,如果retainCount 为 0,说明该对象没有地方需要继续使用了,可以释放掉了
ARC通过什么方式帮助开发者管理内存?
通过编译器在编译的时候,插入类似内存管理的代码
ARC是为了解决什么问题诞生的?
首先解释ARC: automatic reference counting自动引用计数
了解MRC的缺点
在MRC时代当我们要释放一个堆内存时,首先要确定指向这个堆空间的指针都被release了
释放指针指向的堆空间,首先要确定哪些指针指向同一个堆,这些指针只能释放一次(MRC下即谁创建,谁释放,避免重复释放)
模块化操作时,对象可能被多个模块创建和使用,不能确定最后由谁去释放
多线程操作时,不确定哪个线程最后使用完毕
综上所述,MRC有诸多缺点,很容易造成内存泄露和坏内存的问题,这时苹果为尽量解决这个问题,从而诞生了ARC
ARC下还会存在内存泄露吗?
循环引用会导致内存泄露
Objective-C对象与CoreFoundation对象进行桥接的时候如果管理不当也会造成内存泄露
CoreFoundation中的对象不受ARC管理,需要开发者手动释放
什么情况使用weak
关键字,相比assign
有什么不同?
首先明白什么情况使用
weak
关键字?在ARC中,在有可能出现循环引用的时候,往往要通过让其中一端使用weak来解决,比如:delegate代理属性,代理属性也可使用assign
自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用weak,自定义IBOutlet控件属性一般也使用weak;当然,也可以使用strong,但是建议使用weak
weak 和 assign的不同点
weak策略在属性所指的对象遭到摧毁时,系统会将weak修饰的属性对象的指针指向nil,在OC给nil发消息是不会有什么问题的;如果使用assign策略在属性所指的对象遭到摧毁时,属性对象指针还指向原来的对象,由于对象已经被销毁,这时候就产生了
野指针
,如果这时候在给此对象发送消息,很容造成程序奔溃assigin 可以用于修饰非OC对象,而weak必须用于OC对象
@property 的本质是什么?
@property其实就是在编译阶段由编译器自动帮我们生成ivar成员变量,getter方法,setter方法
ivar、getter、setter是如何生成并添加到这个类中的?
使用“自动合成”( autosynthesis)
这个过程由编译器在编译阶段执行自动合成,所以编辑器里看不到这些“合成方法”(synthesized method)的源代码
除了生成getter、setter方法之外,编译器还要自动向类中添加成员变量(在属性名前面加下划线,以此作为实例变量的名字)
为了搞清属性是怎么实现的,反编译相关的代码,他大致生成了五个东西
// 该属性的“偏移量” (offset),这个偏移量是“硬编码” (hardcode),表示该变量距离存放对象的内存区域的起始地址有多远 OBJC_IVAR_$类名$属性名称 // 方法对应的实现函数 setter与getter // 成员变量列表 ivar_list // 方法列表 method_list // 属性列表 prop_list
每次增加一个属性,系统都会在ivar_list中添加一个成员变量的描述
在method_list中增加setter与getter方法的描述
在prop_list中增加一个属性的描述
计算该属性在对象中的偏移量
然后给出setter与getter方法对应的实现,在setter方法中从偏移量的位置开始赋值,在getter方法中从偏移量开始取值,为了能够读取正确字节数,系统对象偏移量的指针类型进行了类型强转
@protocol 和 category 中如何使用 @property
在protocol中使用property
只会生成
setter和getter方法声明
,我们使用属性的目的,是希望遵守我协议的对象能实现该属性category 使用 @property也是
只会生成
setter和getter方法声明
,如果我们真的需要给category增加属性的实现,需要借助于运行时的两个函数
objc_setAssociatedObject
objc_getAssociatedObject
@property后面可以有哪些修饰符?
原子性---nonatomic特质
如果不写默认情况为atomic(系统会自动加上同步锁,影响性能)
在iOS开发中尽量指定为nonatomic,这样有助于提高程序的性能
读/写权限---readwrite(读写)、readooly (只读)
内存管理语义---assign、strong、 weak、unsafe_unretained、copy
方法名---getter=、setter=
@property (nonatomic, getter=isOn) BOOL on;// setter=<name>这种不常用,也**不推荐**使用。故不在这里给出写法
不常用的:nonnull,null_resettable,nullable
使用atomic一定是线程安全的吗?
不是,atomic的本意是指属性的存取方法是线程安全的,并不保证整个对象是线程安全的。
举例:声明一个NSMutableArray的原子属性stuff,此时self.stuff 和self.stuff = othersulf都是线程安全的。但是,使用[self.stuff objectAtIndex:index]就
不是
线程安全的,需要用互斥锁来保证线程安全性
@synthesize 和 @dynamic分别有什么作用
@property有两个对应的词,一个是@synthesize,一个是@dynamic。如果@synthesize和@dynamic都没写,那么
默认
的就是@syntheszie var = _var;@synthesize的语义是如果你没有手动实现setter方法和getter方法,那么编译器会
自动
为你加上这两个方法@dynamic告诉编译器:属性的setter与getter方法由
用户自己实现
,不自动生成(当然对于readonly的属性只需提供getter即可)假如一个属性被声明为@dynamic var,然后你
没有
提供@setter方法和@getter方法,编译的时候没问题
,但是当程序运行到instance.var = someVar,由于缺setter方法会导致程序崩溃;或者当运行到 someVar = instance.var时,由于缺getter方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定
ARC下,不显式指定任何属性关键字时,默认的关键字都有哪些?
基本数据:atomic,readwrite,assign
普通的OC对象:atomic,readwrite,strong
@synthesize合成实例变量的规则是什么?假如property名为foo,存在一个名为_foo的实例变量,那么还会自动合成新变量么?
先回答第二个问题:不会
@synthesize合成成员变量的规则,有以下几点:
如果
指定
了成员变量的名称,会生成一个指定
的名称的成员变量如果这个成员已经存在了就不再生成了
如果指定
@synthesize foo;
就会生成一个名称为foo的成员变量,也就是说:会自动生成一个属性同名的成员变量@interface XMGPerson : NSObject@property (nonatomic, assign) int age;@end@implementation XMGPerson// 不加这语句默认生成的成员变量名为_age// 如果加上这一句就会生成一个跟属性名同名的成员变量@synthesize age;@end
如果是 @synthesize foo = _foo; 就不会生成成员变量了
在有了自动合成属性实例变量之后,@synthesize还有哪些使用场景?
首先的搞清楚什么情况下
不会
autosynthesis(自动合成)同时重写了setter和getter时
重写了只读属性的getter时
使用了@dynamic时
在 @protocol 中定义的所有属性
在 category 中定义的所有属性
重载的属性,当你在子类中重载了父类中的属性,
必须
使用@synthesize来手动合成ivar应用场景
手动创建ivar
使用@synthesize foo = _foo;,关联@property与ivar
当你同时重写了setter和getter时,系统就不会生成ivar)。这时候有两种选择
可以用来修改成员变量名,一般
不建议
这么做,建议使用系统自动生成的成员变量
怎么用 copy 关键字?
NSString、NSArray、NSDictionary等等经常使用copy关键字,是因为他们有对应的
可变类型
:NSMutableString、NSMutableArray、NSMutableDictionary,为确保对象中的属性值不会无意间变动,应该在设置新属性值时拷贝一份,保护其封装性block也经常使用copy关键字
block 使用 copy 是从 MRC 遗留下来的“传统”,在 MRC 中,方法内部的 block 是在栈区的,使用 copy 可以把它放到堆区.
在ARC中
写不写都行
:对于 block 使用 copy 还是 strong 效果是一样的,但是建议写上copy,因为这样显示告知调用者“编译器会自动对 block 进行了 copy 操作”
用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
因为父类指针可以指向子类对象,使用copy的目的是为了让本对象的属性不受外界影响,使用copy无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本.
如果我们使用是strong,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性.
复制详解
浅复制(shallow copy)
:在浅复制操作时,对于被复制对象的每一层都是指针复制
。深复制(one-level-deep
copy):在深复制操作时,对于被复制对象,至少有一层
是深复制。完全复制(real-deep
copy):在完全复制操作时,对于被复制对象的每一层都是对象复制
。非集合
类对象的copy与mutableCopy[不可变对象 copy] // 浅复制[不可变对象 mutableCopy] //深复制[可变对象 copy] //深复制[可变对象 mutableCopy] //深复制
集合
类对象的copy与mutableCopy[不可变对象 copy] // 浅复制[不可变对象 mutableCopy] //单层深复制[可变对象 copy] //单层深复制[可变对象 mutableCopy] //单层深复制
这里需要注意的是
集合对象的内容复制仅限于对象本身,对象元素仍然是指针复制
这个写法会出什么问题: @property (copy) NSMutableArray *array;
因为copy策略拷贝出来的是一个不可变对象,然而却把它当成可变对象使用,很容易造成程序奔溃
这里还有一个问题,该属性使用了同步锁,会在创建时生成一些额外的代码用于帮助编写多线程程序,这会带来
性能问题
,通过声明nonatomic可以节省这些虽然很小但是不必要额外开销,在iOS开发中应该使用nonatomic替代atomic
如何让自定义类可以用 copy 修饰符?如何重写带 copy 关键字的 setter?
若想令自己所写的对象具有拷贝功能,则需实现NSCopying协议。如果自定义的对象
分为可变版本与不可变版本
,那么就要同时实现
NSCopyiog与NSMutableCopying协议,不过一般没什么必要,实现NSCopying协议就够了
// 实现不可变版本拷贝- (id)copyWithZone:(NSZone *)zone;// 实现可变版本拷贝- (id)mutableCopyWithZone:(NSZone *)zone;// 重写带 copy 关键字的 setter- (void)setName:(NSString *)name
{
_name = [name copy];
}
+(void)load; +(void)initialize;有什么用处?
+(void)load;
当类对象被引入项目时, runtime 会向每一个类对象发送 load 消息
load 方法会在每一个类甚至分类被引入时
仅调用一次
,调用的顺序:父类优先于子类, 子类优先于分类由于 load 方法会在类被import 时调用一次,而这时往往是改变类的行为的最佳时机,在这里可以使用例如method swizlling 来修改原有的方法
load 方法
不会
被类自动继承+(void)initialize;
也是在第一次使用这个类的时候会调用这个方法,也就是说 initialize也是
懒加载
总结:
在Objective-C中,runtime会自动调用每个类的这两个方法
+load会在类初始加载时调用
+initialize会在第一次调用类的类方法或实例方法之前被调用
这两个方法是
可选
的,且只有在实现了
它们时才会被调用
两者的共同点:两个方法都
只会被调用一次
Foundation对象与Core Foundation对象有什么区别
Foundation框架是使用OC实现的,Core Foundation是使用C实现的
Foundation对象 和 Core Foundation对象间的转换:俗称桥接
Foundation对象 转成 Core Foundation对象
Core Foundation对象 转成 Foundation对象
如果使用__bridge_retained桥接,它会将对象的
所有权转移
给strC, 也就是说,即便strOC被释放了, strC也可以使用
注意:在ARC条件下,如果是使用__bridge_retained桥接,那么strC
必须自己手动释放
,因为桥接的时候已经将对象的所有权转移给了strC,而C语言的东西不是不归ARC管理的如果使用
__bridge
桥接,它仅仅
是将strOC的地址
给了strC, 并没有
转移对象的所有权,也就是说, 如果使用__bridge桥接, 那么如果strOC释放了,strC也不能用了注意:在ARC条件下,如果是使用__bridge桥接,那么strC
可以不用主动释放
, 因为ARC会自动管理strOC和strC使用
__bridge
桥接NSString *strOC1 = [NSString stringWithFormat:@"abcdefg"]; CFStringRef strC1 = (__bridge CFStringRef)strOC1;NSLog(@"%@ %@", strOC1, strC1);
使用
__bridge_retained
桥接NSString *strOC2 = [NSString stringWithFormat:@"abcdefg"];// CFStringRef strC2 = (__bridge_retained CFStringRef)strOC2;CFStringRef strC2 = CFBridgingRetain(strOC2);// 这一句, 就等同于上一句CFRelease(strC2);
如果使用__bridge_transfer桥接,它会将对象的
所有权转移
给strOC, 也就是说,即便strC被释放了, strOC也可以使用
如果使用__bridge_transfer桥接, 他会自动释放strC, 也就是以后我们
不用手动释放strC
如果使用__bridge桥接,它
仅仅
是将strC的地址
给了strOC, 并没有
转移对象的所有权也就是说如果使用__bridge桥接,那么如果strC释放了,strOC也不能用了
使用__bridge桥接
CFStringRef strC3 = CFStringCreateWithCString(CFAllocatorGetDefault(), "12345678", kCFStringEncodingASCII);NSString *strOC3 = (__bridge NSString *)strC3; CFRelease(strC3);
使用__bridge_transfer桥接
CFStringRef strC4 = CFStringCreateWithCString(CFAllocatorGetDefault(), "12345678", kCFStringEncodingASCII);// NSString *strOC = (__bridge_transfer NSString *)strC;NSString *strOC4 = CFBridgingRelease(strC4); // 这一句, 就等同于上一句
ARC环境桥接关键字:
// 可用于Foundation对象 和 Core Foundation对象间的转换__bridge// 用于Foundation对象 转成 Core Foundation对象__bridge_retained// Core Foundation对象 转成 Foundation对象__bridge_transfer
MRC环境:
直接强转
-(void)bridgeInMRC { // 将Foundation对象转换为Core Foundation对象,直接强制类型转换即可 NSString *strOC1 = [NSString stringWithFormat:@"xxxxxx"]; CFStringRef strC1 = (CFStringRef)strOC1; NSLog(@"%@ %@", strOC1, strC1); [strOC1 release]; CFRelease(strC1); // 将Core Foundation对象转换为Foundation对象,直接强制类型转换即可 CFStringRef strC2 = CFStringCreateWithCString(CFAllocatorGetDefault(), "12345678", kCFStringEncodingASCII); NSString *strOC2 = (NSString *)strC2; NSLog(@"%@ %@", strOC2, strC2); [strOC2 release]; CFRelease(strC2); }
addObserver:forKeyPath:options:context:各个参数的作用分别是什么,observer中需要实现哪个方法才能获得KVO回调?
/**
1. self.person:要监听的对象
2. 参数说明
1> 观察者,负责处理监听事件的对象
2> 要监听的属性
3> 观察的选项(观察新、旧值,也可以都观察)
4> 上下文,用于传递数据,可以利用上下文区分不同的监听
*/[self.person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:@"Person Name"];/**
* 当监控的某个属性的值改变了就会调用
*
* @param keyPath 监听的属性名
* @param object 属性所属的对象
* @param change 属性的修改情况(属性原来的值、属性最新的值)
* @param context 传递的上下文数据,与监听的时候传递的一致,可以利用上下文区分不同的监听
*/- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{ NSLog(@"%@对象的%@属性改变了:%@", object, keyPath, change);
}
KVO内部实现原理
KVO是基于runtime机制实现的
当某个类的属性对象
第一次被观察
时,系统就会在运行期动态
地创建该类的一个派生类
,在这个派生类中重写基类中任何被观察属性的setter 方法。派生类在被重写的setter方法内实现真正的通知机制
如果原类为Person,那么生成的派生类名为
NSKVONotifying_Person
每个类对象中都有一个isa指针指向当前类,当一个类对象的第一次被观察,那么系统会偷偷将isa指针指向动态生成的派生类,从而在给被监控属性赋值时执行的是派生类的setter方法
键值观察通知依赖于NSObject 的两个方法: willChangeValueForKey: 和 didChangevlueForKey:;在一个被观察属性发生改变之前, willChangeValueForKey: 一定会被调用,这就 会记录旧的值。而当改变发生后,didChangeValueForKey: 会被调用,继而 observeValueForKey:ofObject:change:context: 也会被调用。
补充:KVO的这套实现机制中苹果还偷偷重写了class方法,让我们误认为还是使用的当前类,从而达到隐藏生成的派生类
如何手动触发一个value的KVO
自动触发的场景:在注册KVO之前设置一个初始值,注册之后,设置一个不一样的值,就可以触发了
想知道如何手动触发,必须知道自动触发 KVO 的原理,见上面的描述
手动触发演示
@property (nonatomic, strong) NSDate *now;
- (void)viewDidLoad
{
[super viewDidLoad]; // “手动触发self.now的KVO”,必写。
[self willChangeValueForKey:@"now"]; // “手动触发self.now的KVO”,必写。
[self didChangeValueForKey:@"now"];
}
若一个类有实例变量NSString *_foo,调用setValue:forKey:时,是以foo还是_foo作为key?
都可以
KVC的keyPath中的集合运算符如何使用?
必须
用在集合对象
上或普通对象的集合属性
上简单集合运算符有@avg, @count , @max , @min ,@sum
格式 @"@sum.age" 或 @"集合属性.@max.age"???
KVC和KVO的keyPath一定是属性么?
可以是成员变量
如何关闭默认的KVO的默认实现,并进入自定义的KVO实现?
如何自己动手实现 KVO
apple用什么方式实现对一个对象的KVO?
此题就是问KVO的实现原理
今天关于前端Css常见面试和前端css常见面试问题的讲解已经结束,谢谢您的阅读,如果想了解更多关于02:Redis常见面试题、css-flex常见面试题、CSS常见面试题、iOS常见面试题的相关知识,请在本站搜索。
本文标签: