时间:2021-07-01 10:21:17 帮助过:5人阅读
游戏里常有这样的设定,开局的时候,整张地图都是雾蒙蒙的,什么也看不见。先选个地方造兵采矿,建立基地,再派兵去周围的地方探索,继续造兵采矿,占领的地方越来越多,整张地图也越来越清晰。编程也是这样,一开始的时候,什么都看不清,什么都不懂,学了几年也写不出个软件。传统的学习模式是,学习,理解,运用,而学编程的时候,可以灵活一点。把编程知识想象成一个3D网络,每个知识点都是网络中的一个节点,每个节点上有一盏灯,你学会了,灯就亮了,可以看到周围的节点,接着走,点灯,再走,再点灯,这样,灯亮的越来越多,看的越来越清楚,对于自己要走的方向也越来越有信心。基本的思想是,先用后学,缩短反馈,反复迭代。
因为js一般不只是js,他一般还要配合调用别的东西,比如你的这一部分代码,它大部分的工作是操作dom,那你就要去学习dom操作的基本知识。而且dom里面findbyclass addEvent 都是相对深入一些的知识,换句话说,你看的这个代码要的基础知识稍多了一些。
编程经验很重要吧,一个优秀的程序员,要有很多的项目来锤炼。var imf = function () {
var lf = 0;
var instances = [];
//定义一个通过class获得元素的方法,并传入三个参数
function getElementsByClass (object, tag, className) {
var o = object.getElementsByTagName(tag);
//定义一个数组变量,通过标签名获取元素
//通过for循环来返回通过class获取的元素
for ( var i = 0, n = o.length, ret = []; i < n; i++)
//变量n等于数组o的个数,字符类型是数值
//新增了一个数组ret用处暂不明确,继续往下读
//遍历数组o里面的每一个对象
if (o[i].className == className) ret.push(o[i]);
//如果数组o里面元素的类名存在与传入的className参数名相同的话,将
//这个类名的元素添加到ret数组中(push是从数组末尾添加)
if (ret.length == 1) ret = ret[0];
//如果数组ret的个数有1个存在,那么直接返回它
return ret;
//for循环至此结束,继续下一个函数的读取
}
//定义名为addEvent函数,并传入3个参数
function addEvent (o, e, f) {
if (window.addEventListener) o.addEventListener(e, f, false);
//通过if判断解决兼容性问题,如果浏览器支持.addEventListener()
//方法,给数组o添加监听事件
else if (window.attachEvent) r = o.attachEvent('on' + e, f);
//因为IE低版本浏览器的监听事件不符合w3c规范,只能用.attachEvent
//方法来兼容
}
//继续定义一个名字很奇怪的函数传入2个参数
function createReflexion (cont, img) {
var flx = false;
//变量flx的布尔值初始化为false,一般后面用来判断这个变量的存在是真
//还是假
if (document.createElement("canvas").getContext) {
//这也是一个兼容性判断,如果浏览器支持h5 canvas .getContext属性
//和方法的话,就继续下去
flx = document.createElement("canvas");
//读到这里,我明白了为什么提前将变量flx = false 了;如果为true的话
//就没法判断浏览器是否支持canvas了
//这一步是动态创建canvas节点,名为flx
flx.width = img.width;
//定义canvas的宽度等于img的宽度
flx.height = img.height;
//定义canvas的高度等于img的高度
var context = flx.getContext("2d");
//获取canvas的上下文环境
context.translate(0, img.height);
//将canvas绘图表面向下平移img高度的像素,目的暂不明确
context.scale(1, -1);
//将canvas绘图表面进行缩放操作,x轴放大1倍,y轴缩小1倍,暂不明白作者
//意图,-1应该是反向。
//又是向下平移,又是纵向翻转,应该是做一种上下对称的东西
context.drawImage(img, 0, 0, img.width, img.height);
//.drawImage()方法,将图片绘制到canvas中,宽高都是图片的宽高
context.globalCompositeOperation = "destination-out";
//这个属性比较冷门,我是查资料才知道是:在源图像外显示目标图像。只有源
//图像外的目标图像部分会被显示,源图像是透明的。个人猜想作者利用这个
//属性不是简单的把img画到上去,而是想利用源图像外的部分来做文章。
var gradient = context.createLinearGradient(0, 0, 0, img.height * 2);
//绘制起点为原点的60°角的线性渐变
gradient.addColorStop(1, "rgba(255, 255, 255, 0)");
//定义结束的颜色,不透明度为0
gradient.addColorStop(0, "rgba(255, 255, 255, 1)");
//定义开始的颜色,不透明度为1
context.fillStyle = gradient;
//上面都是基于状态的绘制,这一步是执行绘制
context.fillRect(0, 0, img.width, img.height * 2);
//绘制一个矩形,左上角坐标(0,0),右下角坐标(img宽度,img高度X2)
} else {
//如果浏览器不支持canvas,则用css滤镜来实现此效果
/* ---- DXImageTransform ---- */
flx = document.createElement('img');
flx.src = img.src;
flx.style.filter = 'flipv progid:DXImageTransform.Microsoft.Alpha(' +
'opacity=50, style=1, finishOpacity=0, startx=0, starty=0, finishx=0, finishy=' +
(img.height * .25) + ')';
}
//上面那一大串,讲的是创建一个img标签替代canvas,定义图像src,定义滤镜
/* ---- insert Reflexion ---- */
flx.style.position = 'absolute';
flx.style.left = '-1000px';
cont.appendChild(flx);
return flx;
}
//设置flx的css位置属性
//用.appendChild()方法将动态创建的flx作为子元素,添加到cont的节点中
//结束了
//码完注释,我猜想这是一段实现图片倒影的函数,倒影显示在图像的下方。
举一个不太恰当的例子,不懂事儿的小孩子都可以把砖块搭建起来个模型,但是,混凝土不是谁都能玩儿的。HTML,CSS是个框架性的东西,入门会很快,看看例子,类比,都可以做个模型出来。JS是一门儿编程语言,使用场景很多,使用规则很多,并不能和HTML,CSS做比较着学的。
其实我想说,两个月了看不懂说明基础知识不够再加上练习的不够,因为我自己也是零基础学js的,在此之前学了html和css,现在学js也差不多2个月了,头一个月真的很煎熬,感觉视频里说的完全听不懂。但是多听几次多练习几次,就好一点,所以一定要自己多写代码。看不懂就再看一次再写一次,就像刚开始学html的时候,基础知识起码看了10次以上,js比起它们要难一点, 所以我打算要看20次以上。这就是我的学习方法,只作参考。
html 和 css经过浏览器解析后 一步就可以看到结果