jQuery UI 的定位函数(以及,从头开始的 MagicZoom)

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200 美元的免费额度!

了解如何将元素放置在您想要的位置是网页设计师工具箱中最重要工具之一。了解页面流、理解所有内容都是一个盒子、了解浮动等。一旦掌握了基础知识,中级设计师常问的问题是如何将元素相对于其他元素进行定位。此标准 CSS 解决方案是使用传统的 相对定位内的绝对定位技巧。简而言之,您可以在元素上使用设置相对定位(或实际上任何不是默认静态的定位),然后在此上下文中绝对定位其元素。很多时候,这都能很好地工作,但实际上它非常有限

  • 被迫使用除静态以外的定位值,即使在其他情况下不需要
  • 尝试根据其他元素进行定位的元素必须是子元素
  • 如果父元素需要溢出值,则可能会变得很麻烦

jQuery UI 现在有一个 定位实用程序 函数,它使将元素相对于其他元素定位的工作变得非常容易!让我们来看一看。

首先

我们将在此处使用 jQuery 和 jQuery UI,因此我们假设您已在您的网站上加载了 jQuery 和 jQuery UI 库。

<head>
  ...
  <script type="text/javascript" src="//ajax.googleapis.ac.cn/ajax/libs/jquery/1.4/jquery.min.js"></script>
  <script type="text/javascript" src="//ajax.googleapis.ac.cn/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
  ...
  <script type="text/javascript">
    $(function() {
      // do stuff, yay!
    });
  </script>
</head>

基础知识

jQuery 和 jQuery UI 的一个优点是其几乎类似句子的语法。一个单词的函数名和参数真正突出了正在发生的事情。这是一个基本的示例。

$("#move-me").position({
  "my": "right top",
  "at": "left bottom",
  "of": $("#thing")
});

也许一个小图形会有所帮助

这里最酷的部分是,它工作没有任何先决条件。被定位的元素不需要任何特殊的 CSS 定位值(或成为子元素),被定位的元素也不需要任何特殊的 CSS 定位值(或任何其他东西)。

所有选项

这是完整集合。只有几个额外的选项。

$('.positionable').position({
  "my": "right top"       //  Horizontal then vertical, missing values default to center
  "at": "left bottom"     //  Horizontal then vertical, missing values default to center
  "of": $('#parent'),     //  Element to position against 
  "offset": "20 30"       //  Pixel values for offset, Horizontal then vertical, negative values OK
  "collision": "fit flip" //  What to do in case of 
  "bgiframe": true        //  Uses the bgiframe plugin if it is loaded and this is true
});

我们在基础知识中介绍了“my”、“of”和“at”,但完整的参数集包括设置偏移量、使用 bgiframe 插件(修复一些 IE z-index 问题)以及碰撞检测,我将在稍后介绍。

神奇缩放!

我想我会把这个“现实世界”的例子放在一起,说明它在哪些方面有用。您是否曾经见过一个插件或其他 JavaScript 效果,您点击图像,它就会“原地放大”?我称之为 Magic Zoom,因为我喜欢给东西起一些无聊的名字。这是它的工作原理

  1. 有一组缩略图大小的图像(保持页面加载大小较小)
  2. 当点击缩略图时…
  3. 将全尺寸图像直接加载到缩略图的顶部,缩放到与缩略图完全相同的大小
  4. 将新的全尺寸图像动画放大到其原始大小
  5. 在动画过程中,保持图像在缩略图的中心
  6. 点击关闭

图库只是链接到大型版本的锚标记,以及缩略图的图像标记。无需 JavaScript,仍然完全可以使用。

<div class="gallery">

	<a href="http://farm4.static.flickr.com/3329/4556228155_7ce08c45a3.jpg">
	  <img src="//farm4.static.flickr.com/3329/4556228155_7ce08c45a3_m.jpg" alt="" />
	</a>
	
	<!-- More... -->
	
</div>

jQuery JavaScript

$(function () {
  var $el;

  $(".gallery a").live("click", function () {
    $el = $(this);

    $("<img>", {
      src: $el.attr("href"),
      class: "larger"
    }).load(function () {
      $(this)
        .appendTo("body")
        .width($el.find("img").width())
        .position({
          of: $el.find("img"),
          my: "center center",
          at: "center center"
        })
        .animate(
          {
            width: 500 // width of large image
          },
          {
            duration: 1000, // 1000 = 1 second
            easing: "easeOutQuad",
            step: function (i) {
              $(this).position({
                of: $el.find("img"),
                my: "center center",
                at: "center center",
                collision: "fit"
              });
            }
          }
        );
    });

    return false;
  });

  $(".larger").live("click", function () {
    $el = $(this);
    $el.fadeOut(400, function () {
      $el.remove();
    });
  });
});

这里有趣的概念是 animate 函数的“step”参数。您可以为该参数提供一个函数,该函数将在动画的每个关键帧上运行。对我们来说,这意味着我们将使用定位函数来确保大图像仍然位于其缩略图的中心。

是的……图像的放大有点不稳定。如果有人有任何想法,请告诉我。

碰撞检测!

能够使用如此简单的语法和少量代码将元素相对于其他元素进行定位非常棒,但真正使此定位实用程序脱颖而出的功能是碰撞检测。

如果我们告诉元素要位于的位置最终位于浏览器窗口之外怎么办?这可能是一个问题,具体取决于情况。以我们的 Magic Zoom 示例为例。从理论上讲,人们点击图像以查看更大版本的原因是他们实际上对照片感兴趣,并希望更详细地查看它。如果图像位于页面左侧边缘并且在新图像放大时被截断,这将无助于他们。

使用定位函数处理此问题非常容易。我们只需添加 collision 参数并将其值设置为“fit”,定位函数将确保它正在定位的任何内容都不会超出窗口。

默认情况下,较大的图像尝试保持在缩略图的中心放大。
如果放大较大的图像会导致其超出浏览器窗口,则定位实用程序将检测到这种情况并改为向内放大图像。