jQuery学习笔记(控件位置定位、尺寸大小的获取等)
想做一个幽灵按钮出来,效果大概如下图:

当点击按钮的时候,会有四根线条从四个方向飞入,经历从“无-有-无”的闪入过程。
那么我的设计想法是,先在HTML中定义一个按钮,然后在jQuery中设计按钮点击事件,当点击事件发生后,添加四个控件,即四根线,并且为他们设计animation。
先看一下HTML中的布局:
<div id="magic-test">
<div class="am-btn am-btn-success magic-button" id="magicbtn">魔法按钮</div>
</div>
这里使用到了amazeui的css样式,而".magic-button"只是调整一下按钮的位置。
那么在jQuery中,比如要设计右边那条横线,应该这样写:
$(function(){
var rline = '<div class="magic-line1" id="rline"></div>';
var $magicbtn = $('#magicbtn');
var x = $magicbtn.position();
var topvalue = x.top; // 按钮在包含其容器中的顶部坐标
var botvalue = topvalue + $magicbtn.outerHeight(true);
var leftvalue = x.left; // 按钮在包含其容器中的左边界坐标
var rightvalue = leftvalue + $magicbtn.outerWidth(true);
$('#magicbtn').on('click', function(){
$('#rline').css({
position: 'absolute',
left: rightvalue + 200 + 'px',
top: topvalue + 'px',
width: 0
});
$('#magic-test').append(rline);
})
})
a) 这里先解释一下关于控件位置定位的一些函数。
1. 首先看到.position(),这个函数返回的值是当前控件在包含其的容器中的相对位置,在这里就是说,$magicbtn在$magic-test中的相对位置,返回值有两个属性:top和left。
(更加expert的说法是:使用position()方法时事实上是把该元素当绝对定位来处理,获取的是该元素相当于最近的一个拥有绝对或者相对定位的父元素的偏移位置。)
对比一下.offset().top(),我查了一下,这个函数返回的是在整个页面(视窗)中的偏移量.
2. .outerWidth和.outerHeight,这个是整个控件的宽度和高度,包括其外边距。
3. css中的position:absolute,所设定的位置是相对于其父元素(定义为绝对或者相对定位)的位置,比如"top: topvalue + 'px'",就是其顶部相对于$magic-test顶部的位置,也就是与$magicbtn同高
position:relative,就是相对元素static定位时的位置进行偏移(相对自己默认位置偏移),如果指定static时top是50象素,那么指定relative并指定top是10象素时,元素实际top就是60象素了。
b) 但是这段代码的效果让我瞠目结舌,首先点击按钮后,横线出现在了按钮的下一行位置,再点一次,终于出现在了按钮的右侧。。。
出现在下一行是什么情况?很简单,就是#rline的css属性没有赋值成功,这样它的默认定位就会在按钮的下一行。
这如何理解呢?那我的理解只能是,在click事件发生后,.css()和.append()同时执行了,这有点迷。。
处理方法很简单:把css的赋值函数放到on()的外面,即在文档加载完成后,rline的css属性就已经赋值完成了,这样,点击按钮就会出现右边的线条。
这样,异步的问题算是解决了,但是效果不能这么做啊!要知道,我们要的效果是:每次点击按钮,线条都经历“无-有-无”的事件,也就是css样式的赋值还是得放在click事件中。
那怎么办呢?我想了一下,只能是在点击事件之前,先声明这四根线的存在,也就是先把这四根线append到$magic-test中,而且还不能同时给css样式,得在on()里面给,最终代码如下:
$(function(){
var rline = '<div class="magic-line1" id="rline"></div>';
var tline = '<div class="magic-line2" id="tline"></div>';
var lline = '<div class="magic-line1" id="lline"></div>';
var bline = '<div class="magic-line2" id="bline"></div>';
var $magicbtn = $('#magicbtn');
var x = $magicbtn.position();
var topvalue = x.top;
var botvalue = topvalue + $magicbtn.outerHeight(true);
var leftvalue = x.left;
var rightvalue = leftvalue + $magicbtn.outerWidth(true);
$('#magic-test').append(rline);
$('#rline').hide();
$('#magic-test').append(tline);
$('#tline').hide();
$('#magic-test').append(lline);
$('#lline').hide();
$('#magic-test').append(bline);
$('#bline').hide();
$('#magicbtn').on('click', function(){
$('#rline').css({
position: 'absolute',
left: rightvalue + 200 + 'px',
top: topvalue + 'px',
width: 0
});
$('#rline').show();
$('#rline').animate({
width:$magicbtn.outerWidth(true)+'px', //outer是包括外边框的整个控件的大小
left: leftvalue
},500);
$('#tline').css({
position: 'absolute',
left: leftvalue,
top: topvalue - 120 + 'px',
height: 0
});
$('#tline').show();
$('#tline').animate({
top : topvalue,
height: $magicbtn.outerHeight(true)+'px'
},500)
$('#lline').css({
position: 'absolute',
left: leftvalue - 120 + 'px',
top: botvalue -1 + 'px', //减一是考虑到了线宽
width: 0
});
$('#lline').show();
$('#lline').animate({
left: leftvalue,
width: $magicbtn.outerWidth(true)+'px' // 按钮的宽度
}, 500)
$('#bline').css({
position: 'absolute',
left: rightvalue -1 +'px',
top: botvalue + 'px'
});
$('#bline').show();
$('#bline').animate({
top: topvalue,
height: $magicbtn.outerHeight(true)+'px'
})
})
})
这段代码的思想是:先在文档生成的时候,把四根线条赋为$magic-test的子元素,暂时先将其隐藏起来。在click事件产生后,立马将这四根线条定位到按钮的四周,长度先设为0,状态为show。
之后再设置动画事件,使得线长由0变到按钮的长度/宽度,并且与按钮重合,产生“消失”的效果。
这样,每次点击按钮时,都会重复,“线宽0” -> "变长" -> "与按钮重合"的操作。
其实,更加聪明一点的写法时,从一开始就把线条作为$magic-test的子元素写在HTML代码中,并且在css样式中设置“未点击”时的状态,以及点击时的状态(:active),这样就不用再js中那么繁琐地实现动画效果了。
jQuery学习笔记(控件位置定位、尺寸大小的获取等)的更多相关文章
- IOS中调整UI控件位置和尺寸
1.frame(修改位置和尺寸):以父控件左上角为坐标原点,在其父控件中的位置和尺寸. //frame属性中的坐标点不能直接修改 CGRect tempFrame = self.v.frame; // ...
- WPF学习笔记 控件篇 属性整理【1】FrameworkElement
最近在做WPF方面的内容,由于好多属性不太了解,经常想当然的设置,经常出现自己未意料的问题,所以感觉得梳理下. ps:先补下常用控件的类结构,免得乱了 .NET Framework 4.5 Using ...
- jQuery学习笔记 - 基础知识扫盲入门篇
jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...
- jQuery 学习笔记
jQuery 学习笔记 一.jQuery概述 宗旨: Write Less, Do More. 基础知识: 1.符号$代替document.getElementById( ...
- 基于jQuery 常用WEB控件收集
Horizontal accordion: jQuery 基于jQuery开发,非常简单的水平方向折叠控件. Horizontal accordion: jQuery jQuery-Horizonta ...
- Expression Blend学习四控件
原文:Expression Blend学习四控件 Expression Blend制作自定义按钮 1.从Blend工具箱中添加一个Button,按住shift,将尺寸调整为125*125; 2.右键点 ...
- 模仿win10样式,基于jquery的时间控件
工作需要,写了一个基于jquery的时间控件,仿win10系统时间控件格式. 目前基本功能都有了,但时间格式只实现少数,但由于结构设计已经充分优化,填充起来非常容易. 这个控件相对网上其他的时间控件, ...
- IOS第八天(6:UITableViewController新浪微博, 模型和 控件位置封装一起statusFrame)
*****HMViewController #import "HMViewController.h" #import "HMStatus.h" #import ...
- Delphi 7学习开发控件
我们知道使用Delphi快速开发,很大的一方面就是其强大的VCL控件,另外丰富的第三方控件也使得Delphi程序员更加快速的开发出所需要的程序.在此不特别介绍一些概念,只记录自己学习开发控件的步骤.假 ...
随机推荐
- nginx入门篇----nginx服务器基础配置
1.nginx.conf文件结构... #全局块 events{ ... } http #http块{ ...
- 分析案例:应用服务无响应,任务管理器中发现大量w3wp僵尸进程----等待异构系统WebService返回值
问题描述: 某二次开发的项目反馈,不定期出现应用服务器无响应的情况,登录服务器发现任务管理器中有大量的w3wp僵尸进程. 分析过程: 针对同一进程每隔15秒抓取dump,连续抓取3个,对比 ...
- cWeb开发框架,基于asp.net的cWeb应用开发平台介绍(一)
cWeb开发框架是基于asp.net的B/S应用开发平台,采用三层架构理论,应用简单.代码简洁.运行快速. cWeb是bubufx提供,是分享资源,无任何版权限制,bubufx继续传承互联网精神,可随 ...
- jquery 让滚动条处于div底部
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- VirtualBox后台运行虚拟机(无图形界面启动虚拟机)
有时候可能会用虚拟机搭建集群,这是通常希望不现实图形界面,试了半天,似乎只有Virtual Box支持无图形界面运行虚拟机,方法如下: 在Virtual Box的安装目录中找到VBoxManage,M ...
- Mysql 客户端查询结果如何保存到本地而不是服务端?
应用场景:知道某台DB服务器的IP和账户,登录上去查询了10W条记录,需要把这些记录拉到本地做分析 方法1,远程连接到DB服务器执行OUTFILE命令,文件存储在DB机器上,只有mysql账户的情况下 ...
- 在Eclipse中使用JUnit4进行单元测试(初级篇)
首先,我们来一个傻瓜式速成教程,不要问为什么,Follow Me,先来体验一下单元测试的快感! 首先新建一个项目叫JUnit_Test,我们编写一个Calculator类,这是一个能够简单实现加减乘除 ...
- [ActionScript 3.0] xml生成方式之二
var data:XML = <data/>; var item:XML = <item/>; var content:String = "这里是内容"; ...
- RabbitMQ(四)
RabbitMQ 配置 一.RabbitMQ 配置修改方式 1.修改环境变量 2.修改配置文件(只介绍这个) 3.修改运行时参数和政策 locate rabbitmq vi /var/log/rabb ...
- zz Must read
http://www.opengpu.org/forum.php?mod=viewthread&tid=965&extra=page%3D1 游戏引擎剖析(Game Engine An ...