本文仅记录本人学习知识,文章出现的题目都是转载网络的。互相学习,一起成长!
1. css常见结构布局
- 全背景下等宽内容居中
- 绝对底部
- 水平垂直居中
- 圣杯布局 (两边等宽,中间自适应的三栏布局)
- 双飞翼布局 (两边等宽,中间自适应的三栏布局)
- 类订单布局 (为左侧高度不固定,右侧自适应高度并且居中)
- Flex 布局
2.用递归算法实现,数组长度为5且元素的随机数在2-32间不重复的值。
var arr = new Array(5);
function insertRandom(n) {
if (n < 0) return
let tmp = Math.floor(Math.random() * 31 + 2)
if (arr.indexOf(tmp) !== -1) return insertRandom(n)
arr[n] = tmp
return insertRandom(n - 1)
}
insertRandom(arr.length - 1)
3.background-clip:设置元素的背景(背景图片或颜色)是否延伸到边框下面
- 语法:
- background-clip: border-box;背景延伸至边框外沿(但是在边框下层)
- background-clip: padding-box;背景延伸至内边距(padding)外沿。不会绘制到边框处。
- background-clip: content-box;背景被裁剪至内容区(content box)外沿。
- background-clip: text;背景被裁剪成文字的前景色。(有兼容性,谷歌不支持,火狐支持)
- 例子:半透明边框
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<style>
main {
width: 100%;
padding: 60px 80px 80px;
background: #b4a078;
}
div {
padding: 12px;
margin: 20px auto;
background: white;
border: 10px solid hsla(0, 0%, 100%, .5);
background-clip: padding-box;
}
label {color: #f4f0ea;}
</style>
<body>
<main>
<div>A paragraph of filler text. La la la de dah de dah de dah de la.</div>
</main>
</body>
</html>
- 输出:
4.实现多重边框
- 语法:
- 图一多重阴影边框用到box-shadow还接受第四个参数作为阴影扩张半径,当我们只设置扩张半径时,零偏移,零模糊,产生的效果其实相当于一条实线“边框”。
- 图二描边用到outline和对应的描边偏移outline-offset来实现
- 例子
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<style>
main{
width: 100%;
padding: 0;
display: flex;
flex-wrap: wrap;
justify-content: space-around;
align-items: center;
}
div:nth-of-type(1) {
width: 60px; height: 60px;
border-radius: 50%;
background: #fafafa;
margin: 105px 29px;
box-shadow: 0 0 0 10px #E8E2D6, 0 0 0 20px #E1D9C9,
0 0 0 30px #D9CFBB, 0 0 0 40px #D2C6AE,
0 0 0 50px #CABCA0, 0 0 0 60px #C3B393,
0 0 0 70px #BBA985, 0 0 0 80px #B4A078;
}
div:nth-of-type(2){
width: 200px; height: 120px;
background: #efebe9;
border: 5px solid #B4A078;
outline: #B4A078 dashed 1px;
outline-offset: -10px;
margin-bottom: 20px;
}
</style>
<body>
<main>
<div></div>
<div></div>
</main>
</body>
</html>
- 输出:
5.实现边框内圆角
-
语法:
- box-shadow是会紧贴border-radius圆角边的,但是,描边outline并不会与圆角边border-radius贴合,我们可以将两者组合,通过box-shadow去填补描边outline所产生的间隙来达到我们想要的效果。张半径,当我们只设置扩张半径时,零偏移,零模糊,产生的效果其实相当于一条实线“边框”。
-
例子
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<style>
main {width: 100%;}
div {
width: 209px;
margin: 29px auto;
padding: 8px 16px;
border-radius: 8px;
background: #f4f0ea;
outline: 6px solid #b4a078;
box-shadow: 0 0 0 5px #b4a078;
}
</style>
<body>
<main>
<div>例子</div>
</main>
</body>
</html>
- 输出:
6.实现图片背景定位
- 语法:
- background-position:一种CSS数据类型,2D坐标空间,用来设置相对盒子的坐标。
- calc:表达式使用标准运算符优先规则表示其包含的数学计算的结果,意味着从左到右计算表达式;除法或乘法将在加减运算符之前运算,括号内的表达式将首先进行计算。
.el
{
margin-left: calc(10% + 10px); //将元素的左边距指定为其父级宽度的 “10%” 加上额外的 “10px”;
margin-left: calc(10% - 10px); //将元素的左边距指定为其父级宽度的 “10%” 减去额外的 “10px”:
}
```
- 例子
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<style>
main {
width: 100%;
padding: 80px 0px;
display: flex;
flex-wrap: wrap;
justify-content: space-around;
}
div {
width: 229px;
height: 139px;
margin: auto;
color: #f4f0ea;
padding: 16px 29px 28px 20px;
background: #b4a078 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJwAAAAqCAMAAABx9cIXAAAArlBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8tivQqAAAAOXRSTlMAcBBQoPHQMJDgH/uwCwLs2iUU+MhgGuZ2BgRq1sx8VT+lnFk7K/WYAbyHgDXBuKqUi0llTbNFrYJ+UzMgAAAFQUlEQVRYw7VY53qiQBSlKS2IICq22Ets0ViSef8X27kwMo2yZL89f5Q77XD7oHDQZjf1oN5mmlKGljlV3+PRPVCqYSOENOXf0YsnLiKYxL2CWUP9u4EI+ovVfyDnOUd91OVEoeUiFu4lVGTsujbiEM1+Tc7Teo6zNo+zL73bVeMfy/j+iMb9DgKc2Jm6j0T4U1m5H0jC1uOmrE0OfTxjxYsGZOYZ5UMkt3snMvuxsBaPl3Z+djy3Yz+VN05z6zKfdIgLcB7QQFVwyMwIleCD7rhHgHb8WueobQS48tySgzuLVYvY5f6Wrgt/Ra7Nixv99uT0Zlz26vLLZHYcJYOjIev3o+QUlbVpYvlPTk9mlOhu8BtysJ1+n63MtdPTBkoBTLDPWEwMzhjC4kgTSATPNzF4LYRhUcGXXgWP7AdurVShNcHTmnJsak2QD1n1urq8/ADsjkpthOAQbOxq2k6e1YVXcHgZtePtRbVBrCxhDhmFk6hgfnEaxNyCeQ74Zc3cnDMEx5wqeZjCyw3p3uddbr6C4P7i/ARcmHowDc4l87zCz48qcncauBIgrd1T2/exUQvq1ZIcQwEpZyZb0Q2FcxdV5D7FjYS3+1YAT/xvXuS0Y+FcZQtpSHaekyi4VpAbNHCkCjJuySaJ8gtkenmc+lhXtMZY1sE7K4ixIK4gNxMWyV78JBnT3hW2DKJaPUhODufZEE8mK9lDtFWQi0sTwZFQD6GIKoVovrLCTktxgtDWGHxBE0P+DzLT6yI5ORF0hsU5cJMmhSdrOBmX184a+gt0MzuvRHJyhE+UYkzS4RtrFBkjGK5JDjJBIJMTo/6NE0h+3Mc/P3hpWDwLjHavSQ7YhBXksOtelHKD4R8LG79klvk6cqD+BdZZLmxQuPDIYaQotGxTCDGFOyQDrxSHhFI0UuqhgyqgJuT23CK5rHuV5Jxkr1rwUCW5Ss1ZqVm35eTWbDAHagmyqNIsHj4kK04yS5pDQynGAqEN/rnipcPiWSu2qOvl6uBQERBjKPvFOKfpNRYzvty+zP4DOZxu7PKr3Yk0Hk+ltMoF9ck5h8PhXSTXAyGxklWawSBvXYhTxcXkvrHxWyw5vSJsaJ76EMl5DdpfduFvqb3A04c48M/FRc6HprY2uXADXSpPjvj3hK4QG7WbYRhx1oIHxPodTQhRPGsRvjqbfX1y4AztlkTOcakHj7FJNPE6RtSpbV7tRiyn2dbp1bkvoIbXJuf5ZE9KjrZ+D8o/zinkjSCldMhatnZLvgDB0h5+F7vFkYvecnAGcvwhvpdD7ogw1pkW/VDycLgqaz7NILDzLafeu6tEcT+KUjNaW22yTE4lJ3q9mOd4nWZD5YCRT6Zj9rnbPvFdG4JmE9Ymt6TLKDnmpVOlBG5OcjyCEOYE7E0s8oRrZYRS7BWenN3MwZg9pwVPVn4S3sHDlnYertjnxuKp6w74v8DOaSCADeJ6AbGk2pErxJQODiYIwxrwtzJb/ESjgqAZyC0V+F0NclRxW6l8saMGWdVHGO3lkFJbyt/AdgZIOlfGvcw5UVxNclRxMjk6HBCT9RGgf5muNa+3Xm59lMKdsYntO5U9RquepwXPQ4QIjLrkhu1slWYmAIHGh7LxWtdEMnzgG7LsrkhGB4rQUiDn2znoU3KBgRGQbwkZNCZLQfnJ7Lh3EQ/36p0gVXNX6aeNBETrG8nYv2yZBh2JnAxn20AUm0WARTa+Z0z5rUZjjpqOuc/xrEddchTnSnIAT99GPtSLaDv1iqcd38/2Bptz/KkGeeOmUYKcpvCeDYqH/gH0uaoGeLQhjwAAAABJRU5ErkJggi8qICB8eEd2MDB8YzcwNDdjMGQ3NzA2ZTI2ZDhlZTlhMDVjOTFkZDA3MzggKi8=') no-repeat bottom right / 78px 21px;
}
div:nth-of-type(1) {
background-position: right 29px bottom 28px;
}
div:nth-of-type(2) {
background-origin: content-box;
margin: 29px 0;
}
div:nth-of-type(3) {
background-position: calc(100% - 29px) calc(100% - 28px);
}
</style>
<body>
<main>
<div class="block1">background-position方案</div>
<div class="block2">background-origin方案</div>
<div class="block3">calc方案</div>
</main>
</body>
</html>
- 输出:
7. 页面导入样式时,使用link和@import有什么区别?
- link是HTML标签,@import是css提供的。
- link引入的样式页面加载时同时加载,@import引入的样式需等页面加载完成后再加载。
- link没有兼容性问题,@import不兼容ie5以下。
- link可以通过js操作DOM动态引入样式表改变样式,而@import不可以。
8. html的元素有哪些(包含H5)?
块级元素:
名称 | 作用 | 名称 | 作用 |
---|---|---|---|
head | div | ||
meat | 申明页面的诸多属性 | ul | |
title | 窗口标题 | li | |
style | 样式 | ol | |
body | 文本内容 | p | |
header | 头部块 | dl | |
section | 内容块 | dt | |
footer | 底部块 | dd | |
article | 文章标签 | form | |
hr | 下划线 | table | |
h1-h6 | 描述标题 | theader | |
aside | tbody | ||
nav | tr | ||
menu | th | ||
bir |
行内元素:
名称 |
---|
label |
a |
span |
td |
input |
button |
strong |
b |
i |
9. CSS3有哪些新增的特性?
-
边框(borders):
- border-radius 圆角
- box-shadow 盒阴影
- border-image 边框图像
-
背景:
- background-size 背景图片的尺寸
- background_origin 背景图片的定位区域
- background-clip 背景图片的绘制区域
-
渐变:
- linear-gradient 线性渐变
- radial-gradient 径向渐变
-
文本效果:
- word-break
- word-wrap
- text-overflow
- text-shadow
- text-wrap
- text-outline
- text-justify
-
转换
-
2D转换属性
- transform
- transform-origin
-
2D转换方法
- translate(x,y)
- translateX(n)
- translateY(n)
- rotate(angle)
- scale(n)
- scaleX(n)
- scaleY(n)
- rotate(angle)
- matrix(n,n,n,n,n,n)
-
3D转换:
-
3D转换属性:
- transform
- transform-origin
- transform-style
-
3D转换方法
- translate3d(x,y,z)
- translateX(x)
- translateY(y)
- translateZ(z)
- scale3d(x,y,z)
- scaleX(x)
- scaleY(y)
- scaleZ(z)
- rotate3d(x,y,z,angle)
- rotateX(x)
- rotateY(y)
- rotateZ(z)
- perspective(n)
-
过渡
- transition
-
动画
- @Keyframes规则
- animation
-
弹性盒子(flexbox)
-
多媒体查询@media
10. 写一个方法去掉字符串中的空格
实现思路:用正则表达式中的replace方法匹配,’\s’是指空白符(包括空格,换行符,回车符,换页符,制表符等);
如果正则表达式不太明白的掘友,可以查看我之前写过有关正则表达式的个人总结篇
var trim = function(str){
str.replace(/\s*/g,""); //去除字符串内所有的空格
str.replace(/^\s*|\s*$/g,""); //去除字符串内两头的空格
str.replace(/^\s*/,""); //去除字符串内左侧的空格
str.replace(/(\s*$)/g,""); //去除字符串内右侧的空格
}
11. 在页面上隐藏元素的方法有哪些?
- 占位:
- visibility: hidden;
- margin-left: -100%;
- opacity: 0;
- transform: scale(0);
- 不占位:
- display: none;
- width: 0; height: 0; overflow: hidden;
- 仅对块内文本元素:
- text-indent: -9999px;
- font-size: 0;
12. 去除字符串中最后一个指定的字符?
function delLast(str, target) {
return str.split('').reverse().join('').replace(target, '').split('').reverse().join('');
}
const str = delLast('asdfghhj', 'h')
console.log(str) // asdfghj
13. CSS选择器有哪些?哪些属性可以继承?
-
CSS选择器
-
可以继承的常用属性
- font-size
- font-weight
- font-style
- font-family
- color
- text-indent
- text-align
- text-shadow
- line-height
- word-spacing
- letter-spacing
- text-transform
14. 写一个方法把下划线命名转成大驼峰命名?
function transfor (str){
var reg=/-[a-z]/g;
return str.replace(reg,function(vc){
return vc.slice(1).toUpperCase();
})
}
transfor("get-element-by-id"); //getElementById
15. 简述超链接target属性的取值和作用
_self: 在当前窗口打开页面
_blank: 在新窗口打开页面
_top: 在整个框架打开页面不是很理解(在iframe或者frameset里用的比较多)
16. 写一个把字符串大小写切换的方法
-
语法:
字符转ascii码:用charCodeAt()
ascii码转字符:用fromCharCode(number)
数组转字符串: Array.join("-")
字符串转数组: String.split(",")
function tansfrom(str){
//先把字符串转为数组
var charStr=str.split("");
//遍历数组
for(let i=0;i<charStr.length;i++){
if(charStr[i].charCodeAt()>=65&&charStr[i].charCodeAt()<=90){
charStr[i]=String.fromCharCode(charStr[i].charCodeAt()+32);
}else if(charStr[i].charCodeAt()>=97&&charStr[i].charCodeAt()<=122){
charStr[i]=String.fromCharCode(charStr[i].charCodeAt()-32);
}
}
return charStr.join("");
}
tansfrom("abA");
17. 认识BFC规范
BFC 全称为 块格式化上下文。是Web页面的可视化CSS渲染出的一部分。它是块级盒布局出现的区域,也是浮动层元素进行交互的区域。
-
一个块格式化上下文由以下之一创建:
- 根元素或其它包含它的元素
- 浮动元素 (元素的 float 不是 none)
- 绝对定位元素 (元素具有 position 为 absolute 或 fixed)
- 内联块 (元素具有 display: inline-block)
- 表格单元格 (元素具有 display: table-cell,HTML表格单元格默认属性)
- 表格标题 (元素具有 display: table-caption, HTML表格标题默认属性)
- 具有overflow 且值不是 visible 的块元素,
- display: flow-root
- column-span: all 应当总是会创建一个新的格式化上下文,即便具有 column-span: all 的元素并不被包裹在一个多列容器中。
-
特性:
- 内部的盒子会在垂直方向上一个接一个的放置
- 对于同一个BFC的俩个相邻的盒子的margin会发生重叠,与方向无关。
- 每个元素的左外边距与包含块的左边界相接触(从左到右),即使浮动元素也是如此
- BFC的区域不会与float的元素区域重叠
- 计算BFC的高度时,浮动子元素也参与计算
- BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然
18. 统计某一字符或字符串在另一个字符串中出现的次数
- 方法一:
function strCount(str, target) {
let count = 0
if (!target) return count
while(str.match(target)) {
str = str.replace(target, '')
count++
}
return count
}
console.log(strCount('abcdef abcdef a', 'abc'));
- 方法二:
function substrCount(str, target) {
let count = 0;
while (str.includes(target)) {
const index = str.indexOf(target);
count++;
str = str.substring(index + target.length);
}
return count;
}
- 方法三:(推荐!)
var str="abcdacd";
var target="a";
var childInNums = str.split(target).length - 1;
19. 浏览器内多个标签页之间的通信方式有哪些?
-
stroage
localStorage和sessionStorage localStorage保存数据会一直保存没有过期时间,不会随浏览器发送给服务器。大小5M或更大 sessionStorage仅当前页面有效一旦关闭就会被释放。也不会随浏览器发送给服务器。大小5M或更大 localStorage和sessionStorage都继承于Storage,提供了统一的api来访问和设置数据。api列表为: clear 清空存储中的所有本地存储数据 getItem 接受一个参数key,获取对应key的本地存储 key 接受一个整数索引,返回对应本地存储中索引的键 removeItem 接受一个参数key,删除对应本地存储的 keysetItem 接受两个参数,key和value,如果不存在则添加,存在则更新。
localStorage.setItem('order', 'a109'); console.log(localStorage.key(0)); // order console.log(localStorage.getItem('order')) // a109 localStorage.removeItem('order'); localStorage.clear();// 对象访问方式同样有效 localStorage.order = 'b110'; localStorage.order; // b110
-
postmessage
postMessage()方法允许来自不同源的脚本采用异步方式进行有限的通信,可以实现跨文本档、多窗口、 跨域消息传递。html5引入的message的API,主要的功能: 1.页面和其打开的新窗口的数据传递 2.多窗口之间消息传递 3.页面与嵌套的iframe消息传递 4.上面三个问题的跨域数据传递 postMessage(data,origin)方法接受两个参数 1.data:要传递的数据,html5规范中提到该参数可以是JavaScript的任意基本类型或可复制的对象, 然而并不是所有浏览器都做到了这点儿,部分浏览器只能处理字符串参数,所以我们在传递参数的 时候需要使用JSON.stringify()方法对对象参数序列化,在低版本IE中引用json2.js可以实现类似效果。 2.origin:字符串参数,指明目标窗口的源,协议+主机+端口号[+URL],URL会被忽略,所以可以不写, 这个参数是为了安全考虑,postMessage()方法只会将message传递给指定窗口, 当然如果愿意也可以建参数设置为"*",这样可以传递给任意窗口,如果要指定和当前窗口同源的话设置为"/"。
index.html
<div style="width:200px; float:left; margin-right:200px;border:solid 1px #333;">
<div id="color">Frame Color</div>
</div>
<div>
<iframe id="child" src="https://www.test2.com/test2.html"></iframe>
</div>
window.onload=function(){//传输数据
window.frames[0].postMessage('getcolor','http://lslib.com');
}
test2.html
window.addEventListener('message',function(e){ //接收消息
if(e.source!=window.parent) return;
var color=container.style.backgroundColor;
window.parent.postMessage(color,'*');
},false);
20. 渐进增强和优雅降级
-
渐进增强
一开始就针对低版本浏览器进行构建页面,完成基本的功能,然后再针对高级浏览器进行效果、 交互、追加功能达到更好的体验。
-
优雅降级
一开始就构建站点的完整功能,然后再针对低版本浏览器进行兼容。 比如一开始使用 CSS3 的特性构建了一个应用,然后逐步针对各大浏览器进行 hack 使其可以在低版本浏览器上正常浏览。
若低版本用户居多,则优先采用渐进增强的开发流程;
若高版本用户居多,则为了提高大多数用户的使用体验,那当然优先采用优雅降级的开发流程。
21. 写一个判断数据类型的方法
-
分析
typeof 只能判断基本类型 string,number,boolean,undefined,object null 会被判断成 object 比较全面的是使用 Object.prototype.toString 方法,只需要对返回值进行字符串分割即可
const typeCheck = (obj) => {
const typeStr = Object.prototype.toString.call(obj); //返回格式:[object xxxxx]
return typeStr.toLowerCase().slice(8, typeStr.length - 1);
};
console.log(typeCheck("str")); //string
console.log(typeCheck(1)); //number
console.log(typeCheck(() => null)); //function
console.log(typeCheck({a: 1})); //object
console.log(typeCheck([1, 2, 3]));//array
console.log(typeCheck(new Set([1,2,3]))); //set