From fa35a260aef368603582d399632e4d3cb3a09588 Mon Sep 17 00:00:00 2001 From: Rafal Maksymczuk Date: Mon, 12 Jan 2015 01:41:30 +0100 Subject: [PATCH] use binary searching algorithm if max font value set --- dist/jquery.boxfit.js | 45 ++++++++++++++++++++++++++++----------- dist/jquery.boxfit.min.js | 2 +- src/jquery.boxfit.js | 45 ++++++++++++++++++++++++++++----------- 3 files changed, 67 insertions(+), 25 deletions(-) diff --git a/dist/jquery.boxfit.js b/dist/jquery.boxfit.js index 096c1dc..8138226 100644 --- a/dist/jquery.boxfit.js +++ b/dist/jquery.boxfit.js @@ -23,7 +23,7 @@ 'use strict'; var boxfit = function ($nodes, options) { return $nodes.each(function () { - var current_step, inner_span, next_font_size, original_height, original_text, original_width, settings, span; + var current_step, inner_span, minimum_font, maximum_font, next_font_size, original_height, original_text, original_width, settings, span; settings = { // manually set a width/height if you haven't set one explicitly via CSS width: null, @@ -90,21 +90,42 @@ // fixing issue where custom line-heights would break wrapped text inner_span.css('line-height', settings.line_height); - // keep growing the target so long as we haven't exceeded the width or height - inner_span.css('font-size', settings.minimum_font_size); - while ($(this).width() <= original_width && $(this).height() <= original_height) { - if (current_step++ > settings.step_limit) { - break; + if (settings.maximum_font_size) { + // use binary searching algorithm if we have max font size set + minimum_font = settings.minimum_font_size; + maximum_font = settings.maximum_font_size; + + next_font_size = parseInt((minimum_font + maximum_font) / 2, 10); + inner_span.css('font-size', (next_font_size)); + + while (minimum_font <= maximum_font) { + if($(this).width() <= original_width && $(this).height() <= original_height){ + minimum_font = next_font_size + 1; + } else { + maximum_font = next_font_size - 1; + } + + next_font_size = parseInt((minimum_font + maximum_font) / 2, 10); + inner_span.css('font-size', (next_font_size)); } - next_font_size = parseInt(inner_span.css('font-size'), 10); - if (settings.maximum_font_size && next_font_size > settings.maximum_font_size) { - break; + } else { + // keep growing the target so long as we haven't exceeded the width or height + inner_span.css('font-size', settings.minimum_font_size); + while ($(this).width() <= original_width && $(this).height() <= original_height) { + if (current_step++ > settings.step_limit) { + break; + } + next_font_size = parseInt(inner_span.css('font-size'), 10); + if (settings.maximum_font_size && next_font_size > settings.maximum_font_size) { + break; + } + inner_span.css('font-size', next_font_size + settings.step_size); } - inner_span.css('font-size', next_font_size + settings.step_size); + + // go back one step + inner_span.css('font-size', parseInt(inner_span.css('font-size'), 10) - settings.step_size); } - // go back one step - inner_span.css('font-size', parseInt(inner_span.css('font-size'), 10) - settings.step_size); return $(this); } }); diff --git a/dist/jquery.boxfit.min.js b/dist/jquery.boxfit.min.js index 14c9681..6e40239 100644 --- a/dist/jquery.boxfit.min.js +++ b/dist/jquery.boxfit.min.js @@ -1 +1 @@ -!function(a,b){"use strict";"function"==typeof define&&define.amd?define(["jquery"],function(c){return b(a,c)}):"object"==typeof exports?module.exports=b(a,require("jquery")):b(a,jQuery)}(this,function(a,b){"use strict";var c=function(c,d){return c.each(function(){var c,e,f,g,h,i,j,k;if(j={width:null,height:null,step_size:1,step_limit:200,align_middle:!0,align_center:!0,multiline:!1,minimum_font_size:5,maximum_font_size:null,line_height:"100%"},b.extend(j,d),j.width?(i=j.width,b(this).width(i+"px")):i=b(this).width(),j.height?(g=j.height,b(this).height(g+"px")):g=b(this).height(),i&&g){for(j.multiline||b(this).css("white-space","nowrap"),h=b(this).html(),0===b("
"+h+"
").find("span.boxfitted").length?(k=b(b("").addClass("boxfitted").html(h)),b(this).html(k)):k=b(b(this).find("span.boxfitted")[0]),c=0,e=k,b(this).css("display","table"),e.css("display","table-cell"),j.align_middle&&e.css("vertical-align","middle"),j.align_center&&(b(this).css("text-align","center"),e.css("text-align","center")),e.css("line-height",j.line_height),e.css("font-size",j.minimum_font_size);b(this).width()<=i&&b(this).height()<=g&&!(c++>j.step_limit)&&(f=parseInt(e.css("font-size"),10),!(j.maximum_font_size&&f>j.maximum_font_size));)e.css("font-size",f+j.step_size);return e.css("font-size",parseInt(e.css("font-size"),10)-j.step_size),b(this)}return null!==a.console?console.info("Set static height/width on target DIV before using boxfit! Detected width: "+i+" height: "+g):void 0})};return b.fn.boxfit=function(a){return c(this,a)},c}); \ No newline at end of file +!function(a,b){"use strict";"function"==typeof define&&define.amd?define(["jquery"],function(c){return b(a,c)}):"object"==typeof exports?module.exports=b(a,require("jquery")):b(a,jQuery)}(this,function(a,b){"use strict";var c=function(c,d){return c.each(function(){var c,e,f,g,h,i,j,k,l,m;if(l={width:null,height:null,step_size:1,step_limit:200,align_middle:!0,align_center:!0,multiline:!1,minimum_font_size:5,maximum_font_size:null,line_height:"100%"},b.extend(l,d),l.width?(k=l.width,b(this).width(k+"px")):k=b(this).width(),l.height?(i=l.height,b(this).height(i+"px")):i=b(this).height(),k&&i){if(l.multiline||b(this).css("white-space","nowrap"),j=b(this).html(),0===b("
"+j+"
").find("span.boxfitted").length?(m=b(b("").addClass("boxfitted").html(j)),b(this).html(m)):m=b(b(this).find("span.boxfitted")[0]),c=0,e=m,b(this).css("display","table"),e.css("display","table-cell"),l.align_middle&&e.css("vertical-align","middle"),l.align_center&&(b(this).css("text-align","center"),e.css("text-align","center")),e.css("line-height",l.line_height),l.maximum_font_size)for(f=l.minimum_font_size,g=l.maximum_font_size,h=parseInt((f+g)/2,10),e.css("font-size",h);g>=f;)b(this).width()<=k&&b(this).height()<=i?f=h+1:g=h-1,h=parseInt((f+g)/2,10),e.css("font-size",h);else{for(e.css("font-size",l.minimum_font_size);b(this).width()<=k&&b(this).height()<=i&&!(c++>l.step_limit)&&(h=parseInt(e.css("font-size"),10),!(l.maximum_font_size&&h>l.maximum_font_size));)e.css("font-size",h+l.step_size);e.css("font-size",parseInt(e.css("font-size"),10)-l.step_size)}return b(this)}return null!==a.console?console.info("Set static height/width on target DIV before using boxfit! Detected width: "+k+" height: "+i):void 0})};return b.fn.boxfit=function(a){return c(this,a)},c}); \ No newline at end of file diff --git a/src/jquery.boxfit.js b/src/jquery.boxfit.js index 096c1dc..8138226 100644 --- a/src/jquery.boxfit.js +++ b/src/jquery.boxfit.js @@ -23,7 +23,7 @@ 'use strict'; var boxfit = function ($nodes, options) { return $nodes.each(function () { - var current_step, inner_span, next_font_size, original_height, original_text, original_width, settings, span; + var current_step, inner_span, minimum_font, maximum_font, next_font_size, original_height, original_text, original_width, settings, span; settings = { // manually set a width/height if you haven't set one explicitly via CSS width: null, @@ -90,21 +90,42 @@ // fixing issue where custom line-heights would break wrapped text inner_span.css('line-height', settings.line_height); - // keep growing the target so long as we haven't exceeded the width or height - inner_span.css('font-size', settings.minimum_font_size); - while ($(this).width() <= original_width && $(this).height() <= original_height) { - if (current_step++ > settings.step_limit) { - break; + if (settings.maximum_font_size) { + // use binary searching algorithm if we have max font size set + minimum_font = settings.minimum_font_size; + maximum_font = settings.maximum_font_size; + + next_font_size = parseInt((minimum_font + maximum_font) / 2, 10); + inner_span.css('font-size', (next_font_size)); + + while (minimum_font <= maximum_font) { + if($(this).width() <= original_width && $(this).height() <= original_height){ + minimum_font = next_font_size + 1; + } else { + maximum_font = next_font_size - 1; + } + + next_font_size = parseInt((minimum_font + maximum_font) / 2, 10); + inner_span.css('font-size', (next_font_size)); } - next_font_size = parseInt(inner_span.css('font-size'), 10); - if (settings.maximum_font_size && next_font_size > settings.maximum_font_size) { - break; + } else { + // keep growing the target so long as we haven't exceeded the width or height + inner_span.css('font-size', settings.minimum_font_size); + while ($(this).width() <= original_width && $(this).height() <= original_height) { + if (current_step++ > settings.step_limit) { + break; + } + next_font_size = parseInt(inner_span.css('font-size'), 10); + if (settings.maximum_font_size && next_font_size > settings.maximum_font_size) { + break; + } + inner_span.css('font-size', next_font_size + settings.step_size); } - inner_span.css('font-size', next_font_size + settings.step_size); + + // go back one step + inner_span.css('font-size', parseInt(inner_span.css('font-size'), 10) - settings.step_size); } - // go back one step - inner_span.css('font-size', parseInt(inner_span.css('font-size'), 10) - settings.step_size); return $(this); } });