浅析阿里巴巴前端招聘考题(2)
作者:zbm2001z 来源:蓝色理想 发布时间:2008-01-19 09:52:00
标签:阿里巴巴,招聘,css,javascript,布局
考题还没完,继续下一题:
2.用javascript优化布局。
由于我们的用户群喜欢放大看页面;于是我们给上一题的布局做一次优化。
当鼠标略过某个区块的时候,该区块会放大25%,并且其他的区块仍然固定不动。
提示:
也许,我们其他的布局也会用到这个放大的效果哦。
可以使用任何开源代码,包括曾经你自己写的。
关键字:javascript、封装、复用
由于该题要求缩放元素不能对其它元素的位置产生影响,第一感觉就是绝对定位布局,闲话少说,先来布局:
<style type="text/css">
div{
position:absolute;
background:#ccc;
}
h2{margin:0;}
#firstly{
top:10px;
left:10px;
width:200px;
height:200px;
}
#secondly{
top:220px;
left:10px;
width:200px;
height:200px;
}
#thirdly{
top:10px;
left:220px;
width:400px;
height:410px;
}
</style>
<div id="firstly"></div>
<div id="secondly"></div>
<div id="thirdly"></div>
接着,由于要求封装和复用,编写缩放函数:
<script type="text/javascript">
function zoom(id,x,y){ // 设置缩放函数参数:容器id、横向缩放倍数、纵向缩放倍数(等比例缩放时也可以设定一个参数)
var obj=document.getElementById(id); // 获取元素对象
var dW=obj.clientWidth; // 获取元素可视区域宽度
var dH=obj.clientHeight; // 获取元素可视区域高度
obj.onmouseover=function(){ // 鼠标移入
this.style.width=dW*x+"px"; // 横向缩放
this.style.height=dH*y+"px"; // 纵向缩放
this.style.backgroundColor="#f00"; // 设置调试背景
this.style.zIndex=1; // 设置z轴优先
}
obj.onmouseout=function(){ // 鼠标移出,设回默认值
this.style.width="";
this.style.height="";
this.style.backgroundColor="";
this.style.zIndex="";
}
}
zoom("firstly",1.25,1.25);
zoom("secondly",1.25,1.25);
zoom("thirdly",1.25,1.25);
</script>
测试一下——基本没问题。
依旧是完美主义者,这里可能存在一些小问题,比如:
首先,页面布局中,如果容器设置了padding值(特别是该值相对较大时),这个缩放就是有偏差的了,如:
zoom("firstly",1,1);
zoom("secondly",1,1);
zoom("thirdly",1,1);
以上参数设置理论上应该是容器尺寸不变,但由于clientWidth和clientHeight包括了padding宽度,自然会产生缩放偏差。
还有,在设置z轴索引优先时,某些情况下也会有些问题,比如:这些容器在页面设计布局中如果已设定了z轴索引,就必须在脚本中手动调整当前缩放容器的z轴索引,然而,更好的模块封装总是希望更智能些。
关于这个问题,这里就不多做说明了。基本思路就是检索选定范围内的所有容器的z轴索引,设定当前缩放容器高于其中的最高z轴索引。
解决容器设置padding值时,缩放偏差的问题:
<script type="text/javascript">
function getDefaultStyle(obj,attribute){ // 返回最终样式函数,兼容IE和DOM,设置参数:元素对象、样式特性
return obj.currentStyle?obj.currentStyle[attribute]:document.defaultView.getComputedStyle(obj,false)[attribute];
}
function zoom(id,x,y){ // 设置缩放函数参数:容器id、横向缩放倍数、纵向缩放倍数(等比例缩放时也可以设定一个参数)
var obj=document.getElementById(id); // 获取元素对象
var dP0=getDefaultStyle(obj,"paddingTop");
var dP1=getDefaultStyle(obj,"paddingRight");
var dP2=getDefaultStyle(obj,"paddingBottom");
var dP3=getDefaultStyle(obj,"paddingLeft"); // 获取元素各方向padding值
var dP0=parseInt(dP0),dP1=parseInt(dP1),dP2=parseInt(dP2),dP3=parseInt(dP3); // 获取元素4个方向padding数值
var dW=obj.clientWidth-dP1-dP3; // 获取元素宽度
var dH=obj.clientHeight-dP0-dP2; // 获取元素高度
obj.onmouseover=function(){ // 鼠标移入
this.style.width=dW*x+"px"; // 横向缩放
this.style.height=dH*y+"px"; // 纵向缩放
this.style.padding=dP0*y+"px "+dP1*x+"px "+dP2*y+"px "+dP3*x+"px "; // 纵、横向padding缩放
this.style.backgroundColor="#f00"; // 设置调试背景
this.style.zIndex=1; // 设置z轴优先
}
obj.onmouseout=function(){ // 鼠标移出,设回默认值
this.style.width="";
this.style.height="";
this.style.padding="";
this.style.backgroundColor="";
this.style.zIndex="";
}
}
zoom("firstly",1.25,1.25);
zoom("secondly",1.25,1.25);
zoom("thirdly",1,1);
</script>


猜你喜欢
- 在用户执行粘贴操作的时候,js能够获得剪切板的内容,本文讨论一下这个问题。目前只有Chrome支持获取剪切板中的图片数据。还好需要这个功能的
- 问题介绍电脑在使用过程中死机,重启后发现mysql没有启动成功,查看错误日志发现是innodb出现问题导致mysql启动失败。错误日志$ m
- 本文实例讲述了JS实现淡入淡出图片效果的方法。分享给大家供大家参考,具体如下:效果:鼠标移入时,图片由半透明逐渐变成清晰,移出时,由清晰变为
- 1. 引言在Python中我们经常使用pip来安装第三方Python软件包,其实我们每个人都可以免费地将自己写的Python包发布到PyPI
- /************************************************************ * Code
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&
- 在 * 站中,用户每次请求一个页面,服务器都会执行以下操作:查询数据库,渲染模板,执行业务逻辑,最后生成用户可查看的页面。这会消耗大量的资源
- 想要根据django中的模型和配置生成SQL语句,需要先进行一定的设置:首先需要在你的app文件夹中进入setting.py文件,里面有一个
- 写一个爬虫首先就是学会设置请求头header,这样才可以伪装成浏览器。下面小编我就来给大家简单分析一下python3怎样构建一个爬虫的请求头
- 作者: wyh草样出处:https://www.cnblogs.com/wyh0923/p/14084898.html什么是文件文件是系统存
- 如何用表单在线建立目录?很简单,两个文件就搞定了:creatfolder.htm' 表单文件<form n
- 注意:如果您尚未阅读过原来那篇老文章《悟透JavaScript》,请先行阅读该文,以了解上下文关系。在上面的示例中,我们定义了两个语法甘露,
- 网上的教程大多数是教大家如何加载自定义模型和函数,如下图这个SelfAttention层是在训练过程自己定义的一个class,但如果要加载这
- 本文实例讲述了Python Web编程之WSGI协议。分享给大家供大家参考,具体如下:WSGI简介Web框架和Wen服务器之间需要进行通信,
- 正常时间显示<SCRIPT language=javascript><!--function Ye
- 简介如何简单的使用python来实现将一部视频转换为字符画视频的效果。 其实,大家都知道视频就是一帧一帧的图片构成的。  
- 本文实例讲述了JS Object.preventExtensions(),Object.seal()与Object.freeze()用法。分
- 在零售、经济和金融等行业,数据总是由于货币和销售而不断变化,生成的所有数据都高度依赖于时间。如果这些数据没有时间戳或标记,实际上很难管理所有
- 比较喜欢python的装饰器, 试了下一种用法,通过装饰器来传递sql,并执行返回结果这个应用应该比较少为了方便起见,直接使用了ironpy
- 本文实例讲述了PHP的HTTP客户端Guzzle简单使用方法。分享给大家供大家参考,具体如下:首先来一段官方文档对Guzzle的介绍:然后c