想做一个幽灵按钮出来,效果大概如下图:

当点击按钮的时候,会有四根线条从四个方向飞入,经历从“无-有-无”的闪入过程。

那么我的设计想法是,先在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学习笔记(控件位置定位、尺寸大小的获取等)的更多相关文章

  1. IOS中调整UI控件位置和尺寸

    1.frame(修改位置和尺寸):以父控件左上角为坐标原点,在其父控件中的位置和尺寸. //frame属性中的坐标点不能直接修改 CGRect tempFrame = self.v.frame; // ...

  2. WPF学习笔记 控件篇 属性整理【1】FrameworkElement

    最近在做WPF方面的内容,由于好多属性不太了解,经常想当然的设置,经常出现自己未意料的问题,所以感觉得梳理下. ps:先补下常用控件的类结构,免得乱了 .NET Framework 4.5 Using ...

  3. jQuery学习笔记 - 基础知识扫盲入门篇

    jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...

  4. jQuery 学习笔记

    jQuery 学习笔记   一.jQuery概述    宗旨: Write Less, Do More.    基础知识:        1.符号$代替document.getElementById( ...

  5. 基于jQuery 常用WEB控件收集

    Horizontal accordion: jQuery 基于jQuery开发,非常简单的水平方向折叠控件. Horizontal accordion: jQuery jQuery-Horizonta ...

  6. Expression Blend学习四控件

    原文:Expression Blend学习四控件 Expression Blend制作自定义按钮 1.从Blend工具箱中添加一个Button,按住shift,将尺寸调整为125*125; 2.右键点 ...

  7. 模仿win10样式,基于jquery的时间控件

    工作需要,写了一个基于jquery的时间控件,仿win10系统时间控件格式. 目前基本功能都有了,但时间格式只实现少数,但由于结构设计已经充分优化,填充起来非常容易. 这个控件相对网上其他的时间控件, ...

  8. IOS第八天(6:UITableViewController新浪微博, 模型和 控件位置封装一起statusFrame)

    *****HMViewController #import "HMViewController.h" #import "HMStatus.h" #import ...

  9. Delphi 7学习开发控件

    我们知道使用Delphi快速开发,很大的一方面就是其强大的VCL控件,另外丰富的第三方控件也使得Delphi程序员更加快速的开发出所需要的程序.在此不特别介绍一些概念,只记录自己学习开发控件的步骤.假 ...

随机推荐

  1. MYSQL file types redo log

    https://blogs.oracle.com/mysqlinnodb/entry/data_organization_in_innodb https://blogs.oracle.com/mysq ...

  2. 从头开始db-oracle

    rpm -ivh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-7.noarch.rpmrpm -ivh http: ...

  3. 阿里云centos yum源更换,两个文件是从阿里云服务器拷贝出来的,可安装openvpn

    第一步:备份你的原镜像文件,以免出错后可以恢复. mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.back ...

  4. 【转】windows server 2012清除并重建SID

    windows server 2012清除并重建SID 2012-09-17 17:51:51 标签:SID windows server 2012 原创作品,允许转载,转载时请务必以超链接形式标明文 ...

  5. TensorFlow官方文档中文版

    github地址: https://github.com/jikexueyuanwiki/tensorflow-zh

  6. NSUserDefault的使用

    NSUserDefaults 在我们编写代码中是最常用的一个永久保存数据的方法,也是最简单的. 使用NSUserDefault需要注意: 1.数据的本地化保存不是实时的,如果需要实时保存,调用sync ...

  7. Spark之SQL解析(源码阅读十)

    如何能更好的运用与监控sparkSQL?或许我们改更深层次的了解它深层次的原理是什么.之前总结的已经写了传统数据库与Spark的sql解析之间的差别.那么我们下来直切主题~ 如今的Spark已经支持多 ...

  8. OAF_开发系列04_实现OAF查询4种不同的实现方式的比较和实现(案例)

    2014-06-02 Created By BaoXinjian

  9. MyEclipse运行前自动保存

    MyEclipse中又一坑人设置.运行编译好的代码,如果不手动保存的话,MyEclipse是不会自动保存的.所以,在运行前如果对代码做了修改,运行的依然是上一次的结果. 修改这个反人类设置步骤如下: ...

  10. [Linux编程] module_param()函数学习笔记

    在读TCP cubic源码中,遇到了module_param(),网上查到的资料如下: 在用户态下编程可以通过main()来传递命令行参数,而编写一个内核模块则可通过module_param()来传递 ...