wscats / blog Goto Github PK
View Code? Open in Web Editor NEWWaving wild hands in the wind, writing brilliant poems, no matter how tired
Waving wild hands in the wind, writing brilliant poems, no matter how tired
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
#container,
html,
body {
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<div id="container">
<canvas id="canvas"></canvas>
</div>
<script>
const canvas = document.querySelector("#canvas");
const ctx = canvas.getContext('2d');
const width = container.offsetWidth;
const height = container.offsetHeight;
canvas.width = width;
canvas.height = height;
// canvas.style.border = "1px solid #000";
canvas.setAttribute('width', String(Math.round(width)));
canvas.setAttribute('height', String(Math.round(height)));
// 绘制表格:
const rectH = 20;
const rectW = 20;
// 随机颜色
const getRandomColor = function () {
return '#' + Math.floor(Math.random() * 16777215).toString(16);
}
// 绘制填充图形
const fillRect = (ctx, i) => {
for (let j = 0; j < canvas.width / rectW; j++) {
ctx.fillStyle = getRandomColor();
ctx.fillRect(j * rectW, i * rectH, 20, 20);
}
}
// 绘制网格
const grid = () => {
for (let i = 0; i < canvas.height / rectH; i++) {
//1.绘制横线:
fillRect(ctx, i);
// ctx.moveTo(0, i * rectH);
// ctx.lineTo(canvas.width, i * rectH);
//2.绘制竖线:
// ctx.moveTo(i * rectW, 0);
// ctx.lineTo(i * rectW, canvas.height);
}
}
grid();
ctx.lineWidth = 0.1;
ctx.stroke();
canvas.onclick = (e) => {
console.log(e)
console.log(e.offsetX)
console.log(e.offsetY)
}
</script>
</body>
</html>
国服底一切屠宰
传说中能把咖啡和面包转化为软件的一只生物:tropical_drink: :heavy_plus_sign: :hamburger: :point_right: :monkey:
谁还记得 是谁先说 永远的爱我
以前的一句话 是我们以后的伤口
过了太久 没人记得 当初那些温柔
我和你手牵手 说要一起走到最后
我们都忘了 这条路走了多久
时间会让一切变淡,伤口久了会变成伤疤
心中是清楚的 有一天 有一天都会停的
让时间说真话虽然我也害怕
在天黑了以后 我们都不知道会不会有遗憾
谁还记得 是谁先说 永远的爱我
以前的一句话 是我们以后的伤口
过了太久 没人记得 当初那些温柔
我和你手牵手 说要一起走到最后
我们都累了 却没办法往回走
习惯一个人的好,慢慢的,你就只会记住他的坏
两颗心都迷惑 怎么说 怎么说都没有救
亲爱的为什么 也许你也不懂
两个相爱的人 等着对方先说找分开的理由
谁还记得 爱情开始变化的时候
我和你的眼中 看见了不同的天空
走的太远 终于走到分岔路的路口
是不是你和我 要有两个相反的梦
或许心里早猜到结果,但你还会毫不犹豫的往前走
你爱过,拥有过,你可以战胜一切去爱,但你战胜不了有一天她不爱
谁还记得 是谁先说 永远的爱我
以前的一句话 是我们以后的伤口
过了太久 没人记得 当初那些温柔
我和你手牵手 说要一起走到最后
我和你手牵手 说要一起走到最后
很久很久之后,或许你还会记得,记得我的温柔,但还会不会有以后呢
第一个示例页面
<ul>
<li>
<button>o</button>
<p>~<span>k</span></p>
</li>
</ul>
<footer></footer>
//找父节点
var ul = $("li").parent();
console.log(ul);
//在子节点找
var span = $("li").find("span");
console.log(span);
var p = $("li").find("p");
console.log(p);
//逐级向上级元素匹配
var ul = $("li").closest("ul");
console.log(ul);
//克隆节点
var li = $("li").clone();
li.appendTo($("ul")); //或者li.appendTo($('ul'));
//修改节点的内容
$("footer").html("底部");
//append: 在元素内最后面追加内容(后置)
$("li").append(
'<img src="https://avatars3.githubusercontent.com/u/24501172?s=200&v=4" />'
);
//prepend: 向元素内部增加内容(前置)
$("li").prepend(
'<img src="https://avatars1.githubusercontent.com/u/25050699?s=200&v=4" />'
);
//动画
$("#img").css({
position: "absolute",
right: 5,
top: 10,
width: 50
});
$("#img").animate(
{
left: 50,
top: 60,
opacity: "hide"
},
2000
);
第二个示例页面
<ul>
<li class="a">1</li>
<li class="b">2</li>
<li class="c">3</li>
<li class="d">4</li>
</ul>
$("li").click(function() {
//获取同级下的其他子元素 找到每个li的所有同辈元素(不包含自身) 找多个
console.log($(this).siblings());
console.log($(this).siblings(".a"));
//取得一个包含匹配的元素集合中每一个元素紧邻的后面同辈元素的元素集合 找一个 多个:nextAll()
console.log($(this).next());
//点击.a找到后面一位.b 但找不到.c 找一个
console.log($(this).next(".c"));
//取得一个包含匹配的元素集合中每一个元素紧邻的前一个同辈元素的元素集合 找一个 多个:prevAll()
console.log($(this).prev());
});
$("#header")
.addClass("abc def ghi")
.removeClass("def")
.attr({
skill: "ps",
name: "laoyao"
})
.attr("oh", "my god");
console.log(
$("li")
.eq(0)
.attr("class")
); //eq获取的是jQ的节点,可以使用jQ的方法和属性
console.log($("li")[0].className); //数组的方式获取的是原生节点,只能接原生的方法和属性
$.ajax({
url: "test.html",
cache: false,
success: function(html) {
$("#result")
.append(html)
.find("button")
.on("click", function() {
console.log(1);
});
}
});
//选取所有的p元素,查找并选取span子元素,然后再回过来选取p元素
//HTML 代码:
<p>
<span>Hello</span>,how are you?
</p>;
//jQuery 代码:
$("p")
.find("span")
.end();
可以使用jQuery.fn.extend
方法扩展组件
jQuery.fn.extend({
xnav: function(option) {
return this.each(function() {
//html
$.ajax({
type: "get",
url: "nav/nav.html",
success: function(data) {
$(this).html(data);
$(this)
.find(".dropdown-toggle")
.click(
function() {
$(this)
.find(".dropdown-menu")
.toggle(1000, "linear");
}.bind(this)
);
}.bind(this)
});
//css
$.ajax({
type: "get",
url: "nav/nav.css",
success: function(data) {
$("head style").append(data);
}.bind(this)
});
});
}
});
然后根据需要在页面使用或者复用该组件
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title></title>
<link rel="stylesheet" href="./css/bootstrap.css" />
<style>
* {
margin: 0;
padding: 0;
}
</style>
</head>
<body>
<xnav></xnav>
<xnav></xnav>
<script src="../js/jquery-3.3.1.js"></script>
<!--插件->组件-->
<script src="nav/nav.js"></script>
<script>
$("xnav").xnav();
</script>
</body>
</html>
后面还将会继续支持链式操作
$("xnav")
.xnav()
.addClass("wscats");
面试题方向:
HTML&CSS: 对Web标准的理解、浏览器内核差异、兼容性、hack、CSS基本功:布局(清除浮动,定位)、盒子模型、选择器优先级及使用、HTML5、CSS3、移动端适应。
JavaScript: 数据类型、面向对象、继承、闭包、插件、作用域、跨域、原型链、模块化、自定义事件、内存泄漏、事件机制、异步装载回调、模板引擎、Nodejs、JSON、ajax等。
其他: HTTP、安全、正则、优化、重构、响应式、移动端、团队协作、可维护、SEO、UED、架构、职业生涯
1.首先做个简单的自我介绍
2.介绍下你上家公司的业务
3.介绍你上个项目
4.为什么从上家公司离职?
5.Doctype作用? 严格模式与混杂模式-如何触发这两种模式,区分它们有何意义?
(1)、<!DOCTYPE> 声明位于文档中的最前面,处于 标签之前。告知浏览器的解析器,
用什么文档类型 规范来解析这个文档。
(2)、严格模式的排版和 JS 运作模式是 以该浏览器支持的最高标准运行。
(3)、在混杂模式中,页面以宽松的向后兼容的方式显示。模拟老式浏览器的行为以防止站点无法工作。
(4)、DOCTYPE不存在或格式不正确会导致文档以混杂模式呈现。
6.行内元素有哪些?块级元素有哪些?
(1)CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,
比如div默认display属性值为“block”,成为“块级”元素;
span默认display属性值为“inline”,是“行内”元素。
(2)行内元素有:a b span img input select strong(强调的语气)
块级元素有:div ul ol li dl dt dd h1 h2 h3 h4…p
7.CSS的盒子模型?
(1)两种, IE 盒子模型、标准 W3C 盒子模型;IE 的content部分包含了 border 和 pading;
(2)盒模型: 内容(content)、填充(padding)、边界(margin)、 边框(border).
IE8以下浏览器的盒模型中定义的元素的宽高不包括内边距和边框。
8.link 和@import 的区别是?
(1)、link属于XHTML标签,而@import完全是CSS提供的一种方式;
(2)、页面被加载的时候,link-会同时被加载,而@import引用的CSS会等到页面被加载完再加载;
(3)、import只有在IE5以上的才能识别,而link是XHTML标签,无兼容问题;
(4)、link方式的样式的权重 高于@import的权重.
9.CSS 选择符有哪些?哪些属性可以继承?优先级算法如何计算? em和px有什么关系?
* ID 和 Class;
* Class 可继承、 font-size font-family color, 列表 UL LI DL DD DT 可继承;
* 不可继承 :border padding margin width height ;
* 优先级就近原则,样式定义最近者为准;
* 载入样式以最后载入的定位为准;
优先级为:
!important > id > class > tag
important 比 内联优先级高
如果父元素定义字体大小12px,子元素定义1em,大小就是12px。
10.如何居中div,如何居中一个浮动元素?
给div设置一个宽度,然后添加margin:0 auto属性
div{
width:200px;
margin:0 auto;
}
设置容器的浮动方式为相对定位 确定容器的宽高 宽500 高 300 的层 设置层的外边距
.Div {
Width:500px ; height:300px;
Margin: -150px 0 0 -250px;
position: absolute;
left:50%;
top:50%;
}
11.浏览器的内核分别是什么?经常遇到的浏览器的兼容性有哪些?原因,解决方法是什么,hack 的技巧 ?
样式加前缀,用插件,或者css hack ,或者换其他替换方法等等。
* IE浏览器的内核Trident、 Mozilla的Gecko、google的WebKit、Opera内核Presto;
* png24为的图片在iE6浏览器上出现背景,解决方案是做成PNG8.
* 浏览器默认的margin和padding不同。解决方案是加一个全局的*{margin:0;padding:0;}来统一。
* IE6双边距bug:块属性标签float后,又有横行的margin情况下,在ie6显示margin比设置的大。
解决方案是在float的标签样式控制中加入 display:inline;将其转化为行内属性。
* 浮动ie产生的双倍距离 #box{ float:left; width:10px; margin:0 0 0 100px;
//这种情况之下IE会产生20px的距离,这时需要设置display:inline; //使浮动忽略}
* 渐进识别的方式,从总体中逐渐排除局部。
* 首先,巧妙的使用“\9”这一标记,将IE游览器从所有情况中分离出来。
接着,再次使用“+”将IE8和IE7、IE6分离开来,这样IE8已经独立识别。
css
.bb{
background-color:#f1ee18;/*所有识别*/
.background-color:#00deff\9; /*IE6、7、8识别*/
+background-color:#a200ff;/*IE6、7识别*/
_background-color:#1e0bd1;/*IE6识别*/
}
* IE下,可以使用获取常规属性的方法来获取自定义属性,
也可以使用getAttribute()获取自定义属性;
Firefox下,只能使用getAttribute()获取自定义属性.
解决方法:统一通过getAttribute()获取自定义属性.
* IE下,even对象有x,y属性,但是没有pageX,pageY属性;
Firefox下,event对象有pageX,pageY属性,但是没有x,y属性.
* (条件注释)缺点是在IE浏览器下可能会增加额外的HTTP请求数。
12.html5\CSS3有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?
HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,功能的优化和改进。
绘画 canvas 元素
用于媒介回放的 video 和 audio 元素
本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失;
sessionStorage 的数据在浏览器关闭后自动删除
语意化更好的内容元素,比如 article、footer、header、nav、section
表单控件,calendar、date、time、email、url、search
CSS3实现圆角,阴影,对文字加特效,增加了更多的CSS选择器 多背景 rgba
新的技术webworker websockt
移除的元素
纯表现的元素:basefont,big,center,font, s,strike,tt,u;
对可用性产生负面影响的元素:frame,frameset,noframes;
是IE8/IE7/IE6支持通过document.createElement方法产生的标签,
可以利用这一特性让这些浏览器支持HTML5新标签,
浏览器支持新标签后,还需要添加标签默认的样式:
当然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架
13.如何实现响应式布局?
em rem % Bootstrap flex 媒体查询 流布局等等。
14.localStorage,sessionStorage和cookie的区别:
cookie在浏览器和服务器间来回传递。 sessionStorage和localStorage不会
sessionStorage和localStorage的存储空间更大;
sessionStorage和localStorage有更多丰富易用的接口;
sessionStorage和localStorage各自独立的存储空间;
localStorage用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的。
sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。因此sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储。
storage和cookie的区别是为了更大容量存储设计的。Cookie的大小是受限的,并且每次你请求一个新的页面的时候Cookie都会被发送过去,这样无形中浪费了带宽,另外cookie还需要指定作用域,不可以跨域调用。
但是Cookie也是不可以或缺的:Cookie的作用是与服务器进行交互,作为HTTP规范的一部分而存在 ,而Web Storage仅仅是为了在本地“存储”数据而生。
除此之外,Web Storage拥有setItem,getItem,removeItem,clear等方法,不像cookie需要前端开发者自己封装setCookie,getCookie。
15.display:none和visibility:hidden的区别。
display:none 隐藏对应的元素,在文档布局中不再给它分配空间,它各边的元素会合拢,
就当他从来不存在。
visibility:hidden 隐藏对应的元素,但是在文档布局中仍保留原来的空间。
16.position的absolute与fixed共同点与不同点
A:共同点:
1.改变行内元素的呈现方式,display被置为block;
2.让元素脱离普通流,不占据空间;3.默认会覆盖到非定位元素上
B不同点:
absolute的"根元素"是可以设置的,而fixed的"根元素"固定为浏览器窗口。当你滚动网页,fixed元素与浏览器窗口之间的距离是不变的。
17.对BFC规范的理解?
18.你对语义化的理解?语义化的优点或语义化有什么好处?
1,去掉或者丢失样式的时候能够让页面呈现出清晰的结构
2,有利于SEO:和搜索引擎建立良好沟通,有助于爬虫抓取更多的有效信息:爬虫依赖于标签来确定上下文和各个关键字的权重;
3,方便其他设备解析(如屏幕阅读器、盲人阅读器、移动设备)以意义的方式来渲染网页;
4,便于团队开发和维护,语义化更具可读性,是下一步吧网页的重要动向,遵循W3C标准的团队都遵循这个标准,可以减少差异化。
19.解释下浮动和它的工作原理?清除浮动的技巧
浮动元素脱离文档流,不占据空间。浮动元素碰到包含它的边框或者浮动元素的边框停留。
1.使用空标签清除浮动。
这种方法是在所有浮动标签后面添加一个空标签 定义css clear:both. 弊端就是增加了无意义标签。
2.使用overflow。
给包含浮动元素的父标签添加css属性 overflow:auto; zoom:1; zoom:1用于兼容IE6。
3.使用after伪对象清除浮动。
该方法只适用于非IE浏览器。使用中需注意以下几点。一、该方法中必须为需要清除浮动元素的伪对象中设置 height:0,否则该元素会比实际高出若干像素;
20.水平居中和垂直居中的方法:
内联元素居中方案
水平居中设置:
1.行内元素
设置 text-align:center;
2.Flex布局
设置display:flex;justify-content:center;(灵活运用,支持Chroime,Firefox,IE9+)
垂直居中设置:
1.父元素高度确定的单行文本(内联元素)
设置 height = line-height;
2.父元素高度确定的多行文本(内联元素)
a:插入 table (插入方法和水平居中一样),然后设置 vertical-align:middle;
b:先设置 display:table-cell 再设置 vertical-align:middle;
块级元素居中方案
水平居中设置:
1.定宽块状元素
设置 左右 margin 值为 auto;
2.不定宽块状元素
a:在元素外加入 table 标签(完整的,包括 table、tbody、tr、td),该元素写在 td 内,然后设置 margin 的值为 auto;
b:给该元素设置 displa:inine 方法;
c:父元素设置 position:relative 和 left:50%,子元素设置 position:relative 和 left:50%;
垂直居中设置:
使用position:absolute(fixed),设置left、top、margin-left、margin-top的属性;
利用position:fixed(absolute)属性,margin:auto这个必须不要忘记了;
利用display:table-cell属性使内容垂直居中;
使用css3的新属性transform:translate(x,y)属性;
使用:before元素;
21.DOM操作——怎样添加、移除、移动、复制、创建和查找节点。
(1)创建新节点
createDocumentFragment() //创建一个DOM片段
createElement() //创建一个具体的元素
createTextNode() //创建一个文本节点
(2)添加、移除、替换、插入
appendChild()
removeChild()
replaceChild()
insertBefore() //在已有的子节点前插入一个新的子节点
(3)查找
getElementsByTagName() //通过标签名称
getElementsByName() //通过元素的Name属性的值(IE容错能力较强,会得到一个数组,其中包括id等于name值的)
getElementById() //通过元素Id,唯一性
22.如何实现浏览器内多个标签页之间的通信?
调用localstorge、cookies等本地存储方式
23.减少页面加载时间,如何处理页面性能优化?
(1) 减少http请求次数:CSS Sprites, JS、CSS源码压缩、图片大小控制合适;网页Gzip,CDN托管,data缓存 ,图片服务器。
(2) 前端模板 JS+数据,减少由于HTML标签导致的带宽浪费,前端用变量保存AJAX请求结果,每次操作本地变量,不用请求,减少请求次数
(3) 用innerHTML代替DOM操作,减少DOM操作次数,优化javascript性能。
(4) 当需要设置的样式很多时设置className而不是直接操作style。
(5) 少用全局变量、缓存DOM节点查找的结果。减少IO读取操作。
(6) 避免使用CSS Expression(css表达式)又称Dynamic properties(动态属性)。
(7) 图片预加载,将样式表放在顶部,将脚本放在底部 加上时间戳。
24.null和undefined的区别?
null是一个表示"无"的对象,转为数值时为0;undefined是一个表示"无"的原始值,转为数值时为NaN。
当声明的变量还未被初始化时,变量的默认值为undefined。 null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。
undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。典型用法是:
(1)变量被声明了,但没有赋值时,就等于undefined。
(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。
(4)函数没有返回值时,默认返回undefined。
null表示"没有对象",即该处不应该有值。典型用法是:
(1) 作为函数的参数,表示该函数的参数不是对象。
(2) 作为对象原型链的终点。
25.new操作符具体干了什么呢?
1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
2、属性和方法被加入到 this 引用的对象中。
3、新创建的对象由 this 所引用,并且最后隐式的返回 this 。
var obj = {};
obj.__proto__ = Base.prototype;
Base.call(obj);
26.http状态码有那些?分别代表是什么意思?
100-199 用于指定客户端应相应的某些动作。
200-299 用于表示请求成功。
300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。
400-499 用于指出客户端的错误。400 1、语义有误,当前请求无法被服务器理解。401 当前请求需要用户验证 403 服务器已经理解请求,但是拒绝执行它。
500-599 用于支持服务器错误。 503 – 服务不可用
27.数组方法pop() push() unshift() shift()
Push()尾部添加 pop()尾部删除
Unshift()头部添加 shift()头部删除
28.Ajax的原理?
通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面。
ajax过程:
(1)创建XMLHttpRequest对象,也就是创建一个异步调用对象.
(2)创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息.
(3)设置响应HTTP请求状态变化的函数.
(4)发送HTTP请求.
(5)获取异步调用返回的数据.
(6)使用JavaScript和DOM实现局部刷新.
经过总结使用Ajax可以分为四步,分别如下:
29.GET和POST的区别,何时使用POST?
一个在url后面 一个放在虚拟载体里面有大小限制
安全问题应用不同 一个是论坛等只需要请求的,一个是类似修改密码的;
GET:一般用于信息获取,使用URL传递参数,对所发送信息的数量也有限制,一般在2000个字符
POST:一般用于修改服务器上的资源,对所发送的信息没有限制。
GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值,
也就是说Get是通过地址栏来传值,而Post是通过提交表单来传值。
然而,在以下情况中,请使用 POST 请求:
无法使用缓存文件(更新服务器上的文件或数据库)
向服务器发送大量数据(POST 没有数据量限制)
发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠
30.call()和apply()的区别:
apply()函数有两个参数:第一个参数是上下文,第二个参数是参数组成的数组。如果上下文是null,则使用全局对象代替。例如:
function.apply(this,[1,2,3])
call()的第一个参数是上下文,后续是实例传入的参数序列,例如:
function.call(this,1,2,3);
31.如何解决跨域问题?
jsonp、 document.domain+iframe、window.name、window.postMessage、服务器上设置代理页面
jsonp的原理是动态插入script标签
32.git和svn的区别?
33.angularjs 有哪些功能?
双向数据绑定,模块化,路由,过滤器,指令,依赖注入,动画等。
34.angularjs 和Vue react的区别?
35.你遇到过比较难的技术问题是?你是如何解决的?
36.常使用的库有哪些?常用的前端开发工具?开发过什么应用或组件?
37.你对加班怎么看?
38.你介意出差吗?
39.你对我们公司还有什么想了解的?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.