foundation.equalizer.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. ;(function ($, window, document, undefined) {
  2. 'use strict';
  3. Foundation.libs.equalizer = {
  4. name : 'equalizer',
  5. version : '5.5.3',
  6. settings : {
  7. use_tallest : true,
  8. before_height_change : $.noop,
  9. after_height_change : $.noop,
  10. equalize_on_stack : false,
  11. act_on_hidden_el: false
  12. },
  13. init : function (scope, method, options) {
  14. Foundation.inherit(this, 'image_loaded');
  15. this.bindings(method, options);
  16. this.reflow();
  17. },
  18. events : function () {
  19. this.S(window).off('.equalizer').on('resize.fndtn.equalizer', function (e) {
  20. this.reflow();
  21. }.bind(this));
  22. },
  23. equalize : function (equalizer) {
  24. var isStacked = false,
  25. group = equalizer.data('equalizer'),
  26. settings = equalizer.data(this.attr_name(true)+'-init') || this.settings,
  27. vals,
  28. firstTopOffset;
  29. if (settings.act_on_hidden_el) {
  30. vals = group ? equalizer.find('['+this.attr_name()+'-watch="'+group+'"]') : equalizer.find('['+this.attr_name()+'-watch]');
  31. }
  32. else {
  33. vals = group ? equalizer.find('['+this.attr_name()+'-watch="'+group+'"]:visible') : equalizer.find('['+this.attr_name()+'-watch]:visible');
  34. }
  35. if (vals.length === 0) {
  36. return;
  37. }
  38. settings.before_height_change();
  39. equalizer.trigger('before-height-change.fndth.equalizer');
  40. vals.height('inherit');
  41. if (settings.equalize_on_stack === false) {
  42. firstTopOffset = vals.first().offset().top;
  43. vals.each(function () {
  44. if ($(this).offset().top !== firstTopOffset) {
  45. isStacked = true;
  46. return false;
  47. }
  48. });
  49. if (isStacked) {
  50. return;
  51. }
  52. }
  53. var heights = vals.map(function () { return $(this).outerHeight(false) }).get();
  54. if (settings.use_tallest) {
  55. var max = Math.max.apply(null, heights);
  56. vals.css('height', max);
  57. } else {
  58. var min = Math.min.apply(null, heights);
  59. vals.css('height', min);
  60. }
  61. settings.after_height_change();
  62. equalizer.trigger('after-height-change.fndtn.equalizer');
  63. },
  64. reflow : function () {
  65. var self = this;
  66. this.S('[' + this.attr_name() + ']', this.scope).each(function () {
  67. var $eq_target = $(this),
  68. media_query = $eq_target.data('equalizer-mq'),
  69. ignore_media_query = true;
  70. if (media_query) {
  71. media_query = 'is_' + media_query.replace(/-/g, '_');
  72. if (Foundation.utils.hasOwnProperty(media_query)) {
  73. ignore_media_query = false;
  74. }
  75. }
  76. self.image_loaded(self.S('img', this), function () {
  77. if (ignore_media_query || Foundation.utils[media_query]()) {
  78. self.equalize($eq_target)
  79. } else {
  80. var vals = $eq_target.find('[' + self.attr_name() + '-watch]:visible');
  81. vals.css('height', 'auto');
  82. }
  83. });
  84. });
  85. }
  86. };
  87. })(jQuery, window, window.document);