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

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

那么我的设计想法是,先在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. “System.Data.SqlClient.SqlConnection”的类型初始值设定项引发异常---解决方案

    "System.Data.SqlClient.SqlConnection"的类型初始值设定项引发异常 问题出在了 .net 的C:\WINDOWS\Microsoft.NET\Fr ...

  2. 迭代器模式(Iterator Pattern)

    迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 迭代器模式(Iterator)就是分离了聚合对象的遍历行为,抽象出一个迭代器来负责这样既可以 ...

  3. 路由 - ASP.NET MVC 4 系列

           软件开发人员常常对一些细小的细节问题倍加关注,由其在考虑源代码的质量和结构时更是如此.因此,当遇到大部分使用 ASP.NET 技术构建的站点,使用如下的 URL 地址时,可能会有些奇怪: ...

  4. 简介 – ASP.NET MVC 4 系列

           正所谓好记性不如烂笔头,尤其是技术类书籍在阅读后,时间久了一定会忘记.而重新翻阅整本书也较为低效,遂以博客记录阅读摘要以供日后查阅.本系列文章均摘要自 Wrox 红皮书[ASP.NET ...

  5. golang开发环境(2016.9.16)

    一.windows下安装 1.下载go1.7.3.windows-amd64.msi,建议默认安装到‘C:\Go\’ 2.环境变量 变量 值 说明 Path C:\Go\bin 安装程序默认会设置,如 ...

  6. Java-instanceof关键字

    一.instanceof 在编写代码过程中,如果不知道一个对象属于哪一个类,这时instanceof关键字起到决定性作用,他会以boolean(true\false)反馈结果 class A{ pub ...

  7. haoop 断电后导致block文件损坏

    hbase将dfs作为存储,公司测试环境断电后,hadoop集群会因此而损坏一些block文件,这个时候,客户端在读取文件时会报一些错: DataXceiver error processing RE ...

  8. [转]libevent简介和使用

    libevent是一个基于事件触发的网络库,memcached底层也是使用libevent库. 总体来说,libevent有下面一些特点和优势:* 事件驱动,高性能:* 轻量级,专注于网络: * 跨平 ...

  9. iis 7.5 0x80004005 静态文件 html、js、css 500错误

    环境:iis 7.5 win7 64位 vs2012 问题:本地环境F5直接运行,没有任何问题,发布到IIS,静态文件不能访问,出现500错误,网上找了一堆解决办法,排除路径不正确,iis全部功能勾了 ...

  10. 08void

    void void修饰函数返回值和参数 如果函数没有返回值,那么应给将其声明为void 如果函数没有参数,应该声明其参数为void 不存在void类型的变量 void指针的意义 C语言规定只有相同类型 ...