http://www.cnblogs.com/linxiong945/p/4075146.html

 今天学习到jquery的hide()部分时,突然有一个想法,jquery中的隐藏/显示部分的实现是给目标元素附加一个"display: none"属性,那么如果在类似于下面的布局中运用,会发生什么情况?


  先把布局的代码贴上来

 1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
5 <script src="jquery.js"></script>
6 <style type="text/css">
7 * {
8 margin: 0;
9 padding: 0;
10 }
11 .box {
12 width: 300px;
13 height: 150px;
14 text-Align: center;
15 border: 2px solid;
16 margin: 100px auto 0 auto;
17 }
18 .box .content {
19 width: 100%;
20 height: 100px;
21 line-height: 100px;
22 background: #666;
23 }
24 .box .click {
25 background: #ccc;
26 width: 300px;
27 padding: 15px 0;
28 }
29 </style>
30 <title>jquery</title>
31 </head>
32 <body>
33 <div class="box">
34 <div class="content">显示原来的内容</div>
35 <div class="click">
36 <input id="change" type="button" value="改变文字内容" />
37 <input id="hide" type="button" value="隐藏/显示" />
38 </div>
39 </div>
40 </body>
41 </html>

  然后给两个按钮绑定上点击事件,第一个改变文字内容,第二个隐藏/显示上面的内容部分。

 1 <script type="text/javascript">
2 $(function(){
3   $('#change').click(function(){
4   $('.content').html("显示改变了的内容!");
5 });
6 $('#hide').click(function(){
7 $('.content').fadeToggle();
8 });
9 });
10 </script>

  代码里的"$(function(){})"部分是"$('document').ready(function(){})"的简写,这个稍后再论。

  现在点击事件绑定上了,分别点击两个按钮。

  点击改变文字内容按钮:

  

  看起来没有问题!

  再点击显示/隐藏按钮:

  

  按钮条怎么跑上面去了?

  通过浏览器调试查看

  

  可以看到jquery是通过给元素附加了"display: none"而达到效果的。

  上网查了一下,"display:none"的作用是吧某个元素隐藏起来,并且不为被隐藏的对象保留其物理空间,即该对象在页面上彻底消失。这样就造成了下面的按钮块向上浮动了。如何解决这个问题呢?

  我首先想到的是把按钮块给固定在box框的底部,这样不论上面元素块是否存在,都不会影响到下面的按钮块的位置。

  要达到这样的效果,首先得把按钮块从文档流中弹出,使文档流中的元素无法影响到这个元素的位置,浮动"float"和绝对定位"absolute"可以达到目的。

  不过当用浮动实现时,发现点击显示/隐藏按钮,由于内容块忽而显示忽而消失,导致按钮块内的按钮元素也随之移动,显然内容块是否存在对浮动元素的位置是有影响的,这样显然是失败的。

  当使用绝对定位时,通过计算其坐标,倒是达到了效果,不过如果父元素块的布局稍微发生改变,按钮块绝对定位的位置却没有变化(绝对定位基于body),这样显然破坏了该结构的布局,这样的布局是脆弱的,不是我们想要达到的效果。

  显然通过布局来解决这个问题是不现实的。那就从其他方面入手。

  元素的隐藏有两个方法:display:none和visible:hidden。

  两者都可以将元素给隐藏起来,不过有所区别:

  display:none

    不为被隐藏的对象保留其物理空间,即该对象在页面上彻底消失,通俗来说就是看不见也摸不到。

  visible:hidden

    使对象在网页上不可见,但该对象在网页上所占的空间没有改变,通俗来说就是看不见但摸得到。

  这样就找到方法了!将隐藏的实现由"display:none"更改为"visible:hidden"就行了。

  于是js代码更改为:

 1 $(function(){
2 $("#change").toggle(function(){
3 $(".content").html("显示改变的内容");
4 },function(){
5 $(".content").html("显示原来的内容");
6 });
7 $("#hide").toggle(function(){
8 $(".content").css("visibility","hidden");
9 },function(){
10 $(".content").css("visibility","visible");
11 });
12 });

  完美解决了问题!


  总结:

    就像脑筋急转弯,有时候换个思路想一想,其实问题很简单。

jq之display:none与visible:hidden的更多相关文章

  1. 【javascript】jq之display:none与visible:hidden

    今天学习到jquery的hide()部分时,突然有一个想法,jquery中的隐藏/显示部分的实现是给目标元素附加一个"display: none"属性,那么如果在类似于下面的布局中 ...

  2. display:none与visible:hidden的区别 slideDown与

    display:none与visible:hidden的区别 display:none和visible:hidden都能把网页上某个元素隐藏起来,但两者有区别: display:none ---不为被 ...

  3. display:none与visible:hidden的区别

    display:none和visible:hidden都能把网页上某个元素隐藏起来,但两者有区别: display:none ---不为被隐藏的对象保留其物理空间,即该对象在页面上彻底消失,通俗来说就 ...

  4. Readonly和disabled的区别 display:none和visible:hidden的区别

    怎样使input中的内容为只读,也就是说不让用户更改里面的内容. <input type="text" name="input1" value=" ...

  5. display:none与visible:hidden区别

    if(list.style.display=='none'){                 list.style.display='block';             }else{       ...

  6. display:none和visible:hidden两者的区别

    display:none和visible:hidden都能把网页上某个元素隐藏起来,但两者有区别:display:none ---不为被隐藏的对象保留其物理空间,即该对象在页面上彻底消失,通俗来说就是 ...

  7. CSS中:display:none与visible:hidden的区别

    display:none视为不存在且不加载,即,不为被隐藏的对象保留其物理空间,即该对象在页面上彻底消失. visibility:hidden隐藏,但在浏览时保留位置,即,使对象在网页上不可见,但该对 ...

  8. display:none和visibility:hidden区别

    <!-- display:none和visible:hidden都能把网页上某个元素隐藏起来,但两者有区别: --> <!-- display:none 不为被隐藏的对象保留其物理空 ...

  9. visible:hidden和dispaly:none的区别

    display:none和visible:hidden都能把网页上某个元素隐藏起来,但两者有区别: display:none ---不为被隐藏的对象保留其物理空间,即该对象在页面上彻底消失,通俗来说就 ...

随机推荐

  1. 使用 suspend 和 resume 暂停和恢复线程

    suspend 和 resume 的使用 在 Thread 类中有这样两个方法:suspend 和 resume,这两个方法是成对出现的. suspend() 方法的作用是将一个线程挂起(暂停), r ...

  2. Android自定义权限与使用

    1. 如何自定义权限 Android允许我们使用permission标签,在Manifest文件中定义属于自己的权限,一个例子如下, <?xml version="1.0" ...

  3. OpenCL Workshop 1 —— 数字音频滤波

    Introduction 这两年深度学习大火,Cuda跟着吃红利,OpenCL发展也很快.虽然OpenCL不是事实上的标准,但是作为开放标准,适应性是很强的,除了显卡之外,CPU/FPGA上都可以执行 ...

  4. easyUI之slider滑动条框

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  5. 006-数据结构-树形结构-二叉树、二叉查找树、平衡二叉查找树-AVL树

    一.概述 树其实就是不包含回路的连通无向图.树其实是范畴更广的图的特例. 树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合. 1.1.树的特性: 每个结点有零个或多个子 ...

  6. vue-cli2.x版本安装vue-cli建项目

    全局安装vue-cli 命令行输入: vue-cli版本在3以下 npm install --global vue-cli 安装vue-cli后,可以查看一下是否安装成功vue --version, ...

  7. Oracle动态执行脚本创建序号

    -----------------------动态创建序列的脚本--------------------------- declare type num_list ) ); -- 老师表.学生表 xz ...

  8. STS如何将一个文件夹设置缺省的创建路径(build path)

    STS中的build path是一种缺省的路径,相当于windows的环境变量中的path,利用它可以将jsp等文件放入其中,程序只需要文件名就可以找到它. (1)在Package Explorer中 ...

  9. 两表拼接 pd.concat

    a = pd.DataFrame([[1,2,3], [4,5,6], [7,8,9]],columns=['a','b','c']) b = pd.DataFrame([[11,23,45], [2 ...

  10. PHP学习(7)——面向对象(上)

    1.理解面向对象的概念 面向对象软件的一个重要优点是支持和鼓励封装的能力.封装也叫数据隐藏. 在面向对象的软件中,对象是一个被保存数据和操作这些数据的操作方法的唯一.可标识的集合. 对象可以按类进行分 ...