MaxSide: jQuery 插件(以及如何使用)

Avatar of Chris Coyier
Chris Coyier

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

抽象 是任何语言中一个重要的概念。 您可以将 CSS 视为将设计与网站内容分离的一种方式。 这使得两者的代码都更容易阅读、理解和维护。 Javascript 是一种将网站功能抽象化的方法,而 jQuery 则是进一步的抽象,使常见任务变得非常容易。 为 jQuery 编写插件是另一种更深层的抽象,它使您的 jQuery 更易于编写和理解。

为了说明这个想法,让我们构建一个 jQuery 插件。 既然我们要做,不妨做些有用的东西! 我们将其命名为 MaxSide。 这里的想法是获取任何页面元素并调整其大小,使其最长边的长度成为您确定的值。 例如,如果您的图像为 300x180px,您可以在其上调用 MaxSide 并设置值为 100,结果图像将变为 100x60px(它保持其比例)。

让我们开始吧。

 

不使用插件来实现

让我们在页面上放置三个图像,一个 200x200px,一个 200x50px,一个 50x200px。

<body>
	<img src="images/200x200.jpg" alt="" />
	<img src="images/200x50.jpg" alt="" />
	<img src="images/50x200.jpg" alt="" />
</body>

我们希望对这些图像运行一些 jQuery,以便它们的每个最长边都变为 100。200x200px 变为 100x100px,200x50px 变为 100x25px,50x200px 变为 25x100px。

让我们在页面上包含 jQuery(在 <head> 部分)并编写使此代码生效的代码

<script type="text/javascript" src="../jquery-1.2.6.min.js"></script>

<script type="text/javascript">

	// don't run until all images are loaded
	$(window).bind("load", function() {
	
			// run on every image on the page
			$("img").each(function(){
				
				// set a variable for this, quicker
				var $this = $(this);
				
				// maximum length is hard-coded here
				var $maximum = 100;
				
				// jQuery 1.2.6 has "dimensions" built-in
				var $thewidth = $(this).width();
				var $theheight = $(this).height();

				if ($thewidth >= $theheight) {
					if ($thewidth >= $maximum) {
						$(this).attr({
							width: $maximum
						});
					}
				}

				if ($theheight >= $thewidth) {
					if ($theheight >= $maximum) {
						$(this).attr({
							height: $maximum
						});
					}
				}                   
			});
		});
</script>

通俗地说,这段代码的意思是:“查看页面上的每个图像。 如果宽度大于高度,则将其宽度设置为 100。 如果高度大于宽度,则将其高度设置为 100。”

效果很好,请查看 不使用插件的示例

 

使用插件来实现

不使用插件的方式存在一些问题。 首先,它会使我们的页面非常混乱。 我们应该将所有这些代码从 HTML 文件中移除,因为那里是我们的内容所在,并且我们正在尝试在这里进行抽象。 其次,“MaxSide” 在这里是硬编码的。 如果我们想在页面上使用相同的代码段,但使用不同的 MaxSide 值,该怎么办? 我们将不得不重复非常相似的代码。 这绝对不是一个好主意。

jQuery 使我们能够轻松地以插件的形式编写自己的函数,以抽象化此类代码。 请查看我们标题中使用插件的新代码

<script type="text/javascript" src="jquery-1.2.6.min.js"></script>
<script type="text/javascript" src="jquery.maxside.js"></script>
<script type="text/javascript">
	$(window).bind("load", function() {
		$("img").maxSide({ maxSide: "100" });
	});
</script>

是不是简单多了? 不仅更简单,而且现在我们可以在不同的页面元素上调用 maxSide 函数,并且可以使用不同的值。

jQuery.fn.maxSide = function(settings) {
		// if no paramaters supplied...
		settings = jQuery.extend({
			maxSide: 100
		}, settings);		
		return this.each(function(){
				var maximum = settings.maxSide;
				var thing = jQuery(this);
				var thewidth = thing.width();
	            var theheight = thing.height();
	
				if (thewidth >= theheight) {
	                if (thewidth >= maximum) {
	                    thing.attr({
	                        width: maximum
	                    });
	                }
	            }

	            if (theheight >= thewidth) {
	                if (theheight >= maximum) {
	                    thing.attr({
	                        height: maximum
	                    });
	                }
	            }
		});	
};

请注意,这里的代码实际上并没有太大区别。 不过,有一些重要的需要注意的地方。

  • 此插件旨在对与您调用它匹配的每个页面元素执行其操作。 因此使用了“each” 函数。 如果您希望编写仅影响单个页面元素的插件,它会更容易。 省略“each” 函数并编写普通的 jQuery,但在最后添加一行“return this;”。
  • 函数开头的“settings” 部分处理函数未传递参数的情况(它默认为 100px)。 如果需要,您可以仅使用 .maxSide(); 调用此函数。
  • 如果将此函数用于图像,则应仅在窗口加载事件之后调用它。 许多 jQuery 函数是在 DOM 准备就绪时调用的,这样速度要快得多,但如果图像尚未完全加载(很有可能),则宽度和高度计算将失败。
  • 插件中的变量不需要“$”。

查看演示 下载示例