遇到一份面试题,感觉还不错,分享给大家,互相学习。
1、请解释一下为什么会出现浮动和什么时候需要清除浮动?清除浮动的方式
当为了让多个div在同一行进行显示,我们会给他们设置浮动属性。
但是当父容器内的所有的子元素全都浮动之后,将会出现父盒子塌陷的问题。此时我们需要清除浮动。
清除浮动的方如下:
方式一:使用overflow属性来清除浮动
.父容器{
overflow:hidden;
}
先找到浮动盒子的父元素,再在父元素中添加一个属性:overflow:hidden,就是清除这个父元素中的子元素浮动对页面的影响.
注意:一般情况下也不会使用这种方式,因为overflow:hidden有一个特点,离开了这个元素所在的区域以后会被隐藏(overflow:hidden会将超出的部分隐藏起来).
方式二:使用额外标签法
.新增容器{
clear:both;
}
在浮动的盒子之下再放一个标签,在这个标签中使用clear:both,来清除浮动对页面的影响.
a.内部标签:会将这个浮动盒子的父盒子高度重新撑开.
b.外部标签:会将这个浮动盒子的影响清除,但是不会撑开父盒子.
注意:一般情况下不会使用这一种方式来清除浮动。因为这种清除浮动的方式会增加页面的标签,造成结构的混乱.
方法三:使用伪元素来清除浮动(after意思:后来,以后)
.父容器:after{
content:"";//设置内容为空
height:0;//高度为0
line-height:0;//行高为0
display:block;//将文本转为块级元素
visibility:hidden;//将元素隐藏
clear:both//清除浮动
}
.clearfix{
zoom:1;为了兼容IE
}
方法四:使用双伪元素清除浮动
.clearfix:before,.clearfix:after {
content: "";
display: block;
clear: both;
}
.clearfix {
zoom: 1;
}
2、::before 和:before中双冒号和单冒号有什么区别?解释一下作用。
单冒号(:) 用于CSS3伪类;
双冒号(::) 用于CSS3伪元素。
伪元素由双冒号和伪元素名称组成。双冒号是在当前规范中引入的,用于区分伪类和伪元素。但是伪类兼容现存样式,浏览器需要同时支持旧的伪类,比如:first-line、:first-letter、:before、:after等。
那么对于CSS2之前已有的伪元素,比如:before,单冒号和双冒号的写法::before作用是一样的
3、css选择器有哪些?优先级如何?
常用选择器:
1、标签选择器 li{}
2、类选择器(class选择器).className{}
3、id选择器 #div{}
4、通用选择器*{} 优先级最低
5、并集选择器 li,.first{}
6、交集选择器li.first{}
7、后代选择器 div span{}
8、子代选择器 写法:选择器1>选择器2>...>选择器n,用>分隔
优先级比较:
1、CSS生效的第一原则是近者优先,即哪个选择器作用于最里层标签,则这个选择器生效;
2、当选择器作用于同一层时,可以根据优先级权重进行累加计算。id选择器100>class选择器10>标签选择器1
3、当选择器作用于同一层且优先级权重相等时,则写在后面的选择器生效。
4、!可以提高选择器的优先级。
4、请写出一个安全的网页字体序列
p { font-family:"Times New Roman",Georgia,Serif; }
5、js获取到页面中所有的checkbox?(不使用第三方框架)
var inputs = document.getElementsByTagName("input");
var checkboxs = [];
for(var i=0; i<inputs.length; i++){
if(inputs[i].type=="checkbox" && inputs[i].checked){
checkboxs.push(inputs[i])
console.log(checkboxs);
}
}
6、分别使用原生JS和jQuery定义一个函数,功能为去除数组中的重复项。
var arr = [1,2,2,3,3,3,4,5,6];
function func (arr){
console.log(arr);
var newArr = new Array;
newArr.push(arr[0]);
for (var i=0;i<=arr.length;i++) {
if (newArr.indexOf(arr[i])==-1) {
newArr.push(arr[i]);
}
}
document.write(newArr);
}
func(arr);
7、下面这个ul,如何点击每一列的时候alert其索引值?(不使用第三方库)
<ul id='test'>
<li>这是第一条</li>
<li>这是第二条</li>
<li>这是第三条</li>
</ul>
1、【使用闭包解决上述问题】
解决原理:函数具有自己的作用域,在for循环转一次创建一个自执行函数,
在每个自执行函数中,都有自己独立的i,而不会被释放掉。
所以for循环转完以后,创建的5个自执行函数的作用域中,分别存储了5个
不同的i变量,也就解决了问题。
var lis = document.getElementsByClassName("li");
for(var i=0; i<lis.length; i++){
!function(i){ lis[i].onclick = function(){ alert(i);
} }(i); }
2、【使用let解决】
解决原理:let具有自己的块级作用域,所以for循环转一次会创建一个块级作用域;
var lis = document.getElementsByClassName("li");
for(let i=0; i<lis.length; i++){
lis[i].onclick = function(){ alert(i);
} }
3、【使用this解决原理】
出错的原因在于全局变量i在多次循环之后被污染。那么在点击事件中,就可以不使用i变量,而是使用this代替lis[i],这样不会出现错误
var lis = document.getElementsByClassName("li");
for(var i=0; i<lis.length; i++){
lis[i].onclick = function(){ alert(this.innerText);
}
}
8、文字与图片垂直居中对齐方法(考虑兼容性)
1.align="absmiddle"
2.vertical-align:middle;
9、请根据num倒序排序
var arr = [
{name:'A',num:4},
{name:'G',num:3},
{name:'V',num:5},
{name:'A',num:2},
{name:'X',num:9},
{name:'R',num:6},
{name:'N',num:undefined},
]
var newArr = arr.sort(function (a,b) {
return b.num-a.num;
});
console.log(newArr);
sort()函数主要运用了简单插入排序算法。
10、js中常用设计模式有哪些?
1、原始模式:
原理:声明对象,后续给对象加属性和方法
优点:可以直观的看出对象Car有属性 color,door,方法showcolor;
缺点:如果有多个类型,需要创建多个实例;
2、工厂模式:
原理:将原始方式封装到函数中,并返回这个对象
优点:同一类型同一属性可以重复调用;
缺点:同一类型不同属性值的不能调用;
3、构造函数方式:
原理:在构造函数内使用 this 关键字,创建属性和方法。再使用 new 运算符创建实例,通过传参生成不同的实例。
优点:该方式解决了以上模式所遇到的问题
缺点:构造函数会重复生成函数,为每个对象都创建独立的函数版本
4、混合的构造函数/原型方式
原理:利用构造函数方式创建函数的不同的部分,利用原型方式来定义相同的方法和属性
优点:此种 方式即符合语义又可以扩展新的属性和方法
11、有哪些页面性能优化的方法?
1、尽量减少 http 请求次数
2、减少 dns 查找次数
3、避免跳转
4、可缓存的ajax
5、预加载
12、如何实现以下函数?
sum(2, 5); // 7
sum(2)(5); // 7
①、 sum(2, 5); // 7
function sum (a,b) {
var sumz = 0;
sumz = a+b;
return sumz;
}
console.log(sum(2,5));
②、 function sum (a) {
function sum1 (b) {
return a+b;
}
return sum1;
}
console.log(sum(2)(5));
13、原生js实现jq中的$()选择器
function $ (str) {
return document.querySelector(str);
}
function $all (str) {
return document.querySelectorAll(str);//返回伪数组类型
}