资讯专栏INFORMATION COLUMN

前端入门小结

chengtao1633 / 3400人阅读

摘要:实现了搜索这一功能,接下来就是要把这一部分嵌入到一个平台,因此我开始接触编程以及前端。之前我对前端几乎没有什么了解,因此这一周除了体检被检查出来早搏参加入学典礼之外,就是在琢磨,,了,并结合需求开发了网站的一部分。

今年暑假大部分时间是在要学校,前一阶段一直在学习Scala和理解Spark,但是苦于没有实际上手的项目,尽管看了不少论文和书,但不敢说自己理解的有多深刻,所以我打算暂时搁置这一部分的内容。后一阶段是出于导师的需要要解决针对海量数据进行频繁的模糊搜索带来的性能问题,其实一些关系型数据库比如MySQL有自带的Full Index,但是它们并不能很好的支持中文,于是我开始尝试使用Elasticsearch来解决问题。当然如果我使用Elasticsearch就意味着引人了第三方的工具,因此数据同步的问题就凸显出来。关于数据同步,elasticsearch-jdbc可以将MySQL中的数据同步到Elasticsearch,但是使用后我发现elasticsearch-jdbc存在两个严重的问题:一是elasticsearch-jdbc只适合数据库中的数据只增不减、不修改的情况,这显然是不合理的;二是当我同步的数据量很大时,elasticsearch-jdbc并不能很完整的导入数据,因此我只能自己实现数据同步,整个过程走了一些弯路,直到后来利用bulk index来批量建立索引和批量删除,同步的效率提高了20+倍,基本满足了性能要求。

实现了搜索这一功能,接下来就是要把这一部分嵌入到一个平台,因此我开始接触Web编程以及前端。之前我对前端几乎没有什么了解,因此这一周除了体检(被检查出来早搏)、参加入学典礼之外,就是在琢磨cssJavaScriptjQuery了,并结合需求开发了网站的一部分。

效果简介

整个过程中,比较有意思的是实现弹出层的效果,弹出层在我们日常浏览网页的时候十分普遍,它具有更好的交互效果。如下是实现的效果图。

静态页面实现

实现弹出层效果的css代码如下。

#mask {
    background: #000;
    opacity: 0.75;
    filter: alpha(opacity = 75);
    height: 1000px;
    width: 100%;
    position: absolute;
    left: 0;
    top: 0;
    z-index: 1000; /* 层级  */
}

有两点需要注意:

opacity: 0.75;为设置遮罩层的透明度,但是IE不认opacity,所以还需要跟IE做下兼容:filter: alpha(opacity = 75);这里的0.7575都代表透明度为75%

对于一层,它不仅只有X轴和Y轴,还有Z轴,也就是层级,z-index就是用来描述层级,它的数字越大,说明层级越高,所处的位置越上。

接下来就是实现弹出界面,Elasticsearch的模糊搜索功能将用在此处,弹出界面的html以及css代码如下(存在命名不规范的情况)。




    
     
序号清单编码清单名称 项目特征描述单位工程名称 标杆类型图集名称图集代码 选择
      
JS实现动态效果

实际上,上面的html并不是预先就已经存在的(css是预先写好的),而是当我触发相应的事件后动态生成的,也就是在原有的页面后追加遮罩层和弹出层。利用JavaScript来实现动态效果,代码如下:

function queryItems() {
    var oMask = document.createElement("div");
    oMask.id = "mask";
    // 获取页面的高度和宽度
    var sHeight = document.documentElement.scrollHeight;
    var sWidth = document.documentElement.scrollWidth;
    // 获取页面的可视高度和宽度
    // 如果页面是竖向的页面,那么可视宽度和页面宽度是相等的
    var wHeight = document.documentElement.clientHeight;
    oMask.style.height = 768 + "px";
    oMask.style.width = sWidth + "px";
    document.body.appendChild(oMask);
    var queryItems = document.createElement("div");
    queryItems.id = "queryItems";
    queryItems.innerHTML = "
" + "" + "
" + "
" + "
" + "
" + "" + "" + " " + "" + " " + "" + " " + "" + " " + "
" + "
" + "" + "" + "" + "" + "" + "" + "" + "
序号清单编码清单名称项目特征描述单位工程名称标杆类型图集名称图集代码选择
" + "
" + "
" + "
" + " " + " " + "  " + "
" + "
" + "
"; document.body.appendChild(queryItems); var dHeight = queryItems.offsetHeight; var dWidth = queryItems.offsetWidth; queryItems.style.left = (sWidth - dWidth) / 2 + "px"; queryItems.style.top = (wHeight - dHeight) / 2 + "px"; var oClose = document.getElementById("queryItemsClose"); oMask.onclick = oClose.onclick = function() { // 关闭弹出框 document.body.removeChild(oMask); document.body.removeChild(queryItems); } }

需要注意的有如下几点:

在页面中创建元素结点:

    var oMask = document.createElement("div");

遮罩层需要多大?因此需要获取页面的高度和宽度,要注意的是这是网页的高度和宽度,而不是屏幕的高度和宽度。然后就是把获取到的高度和宽度赋给遮罩层(oMask),因为我的实际页面高度小于屏幕高度,为了让遮罩层铺满全屏于是将sHeight的值定义为768px,不要忘了加上单位px

    var sHeight = document.documentElement.scrollHeight;
    var sWidth = document.documentElement.scrollWidth;
    oMask.style.height = 768 + "px";
    oMask.style.width = sWidth + "px";

如果仅仅是这样新创建的结点还只是停留在JS里面,要把结点插入到文档中,需要执行:

    document.body.appendChild(oMask);

可视区域是真用户正看到的区域的大小,其中可视区域的宽度和页面的宽度相同(大部分网页都是竖着浏览的),获取可视区域高度的代码如下:

    var wHeight = document.documentElement.clientHeight;

在插入遮罩层之后,我们采用相同的方法插入弹出层,如何让弹出层出在屏幕的正中央?我们需要获取弹出层的高度和宽度,利用可视区域的高度和宽度,以及弹出层的高度和宽度,最终确定弹出层的定位。

    var dHeight = queryItems.offsetHeight;
    var dWidth = queryItems.offsetWidth;
    queryItems.style.left = (sWidth - dWidth) / 2 + "px";
    queryItems.style.top = (wHeight - dHeight) / 2 + "px";

设置弹出层关闭:可以点击弹出层的右上角,或者是点击遮罩层,设置onclick事件即可:

    var oClose = document.getElementById("queryItemsClose");
    oMask.onclick = oClose.onclick = function() { // 关闭弹出框
        document.body.removeChild(oMask);
        document.body.removeChild(queryItems);
    }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/85997.html

相关文章

  • 前端面试题小结

    摘要:如何解决不同终端的适配问题弹性盒子,非常不错的选择的运行流程生命周期生命周期优化解释中虚拟存在的好处为什么可以解决跨域问题地址栏输入流程总结初级阶段是会用。 前几天也是有人问我的一些问题,我觉得还是挺有了解价值的,也是一些平时开发可能比较会忽略的问题。别的不多说,直接开门见山: 1.post和get的区别? 我们都知道GET和POST是HTTP请求的两种基本方法。我相信如果有人问到你这...

    fuchenxuan 评论0 收藏0
  • 前端面试题小结

    摘要:如何解决不同终端的适配问题弹性盒子,非常不错的选择的运行流程生命周期生命周期优化解释中虚拟存在的好处为什么可以解决跨域问题地址栏输入流程总结初级阶段是会用。 前几天也是有人问我的一些问题,我觉得还是挺有了解价值的,也是一些平时开发可能比较会忽略的问题。别的不多说,直接开门见山: 1.post和get的区别? 我们都知道GET和POST是HTTP请求的两种基本方法。我相信如果有人问到你这...

    silenceboy 评论0 收藏0
  • 前端面试题小结

    摘要:如何解决不同终端的适配问题弹性盒子,非常不错的选择的运行流程生命周期生命周期优化解释中虚拟存在的好处为什么可以解决跨域问题地址栏输入流程总结初级阶段是会用。 前几天也是有人问我的一些问题,我觉得还是挺有了解价值的,也是一些平时开发可能比较会忽略的问题。别的不多说,直接开门见山: 1.post和get的区别? 我们都知道GET和POST是HTTP请求的两种基本方法。我相信如果有人问到你这...

    wangtdgoodluck 评论0 收藏0
  • 前端相关大杂烩

    摘要:希望帮助更多的前端爱好者学习。前端开发者指南作者科迪林黎,由前端大师倾情赞助。翻译最佳实践译者张捷沪江前端开发工程师当你问起有关与时,老司机们首先就会告诉你其实是个没有网络请求功能的库。 前端基础面试题(JS部分) 前端基础面试题(JS部分) 学习 React.js 比你想象的要简单 原文地址:Learning React.js is easier than you think 原文作...

    fuyi501 评论0 收藏0
  • 2017-08-28 前端日报

    摘要:前端日报精选译高阶函数利用和来编写更易维护的代码,从入门到放弃响应式编程入门行的电梯调度模拟器个人分享前端学习资源分享中文周刊技术周刊期知乎专栏中的内置方法知乎专栏中的柯里化前端大宝剑小结常见知识依赖收集掘金项目主域重 2017-08-28 前端日报 精选 【译】高阶函数:利用Filter、Map和Reduce来编写更易维护的代码Webpack 3,从入门到放弃响应式编程入门:50 行...

    xumenger 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<