TextMetrics.js
上传用户:dawnssy
上传日期:2022-08-06
资源大小:9345k
文件大小:6k
源码类别:

JavaScript

开发平台:

JavaScript

  1. /*!
  2.  * Ext JS Library 3.1.0
  3.  * Copyright(c) 2006-2009 Ext JS, LLC
  4.  * licensing@extjs.com
  5.  * http://www.extjs.com/license
  6.  */
  7. /**
  8.  * @class Ext.util.TextMetrics
  9.  * Provides precise pixel measurements for blocks of text so that you can determine exactly how high and
  10.  * wide, in pixels, a given block of text will be. Note that when measuring text, it should be plain text and
  11.  * should not contain any HTML, otherwise it may not be measured correctly.
  12.  * @singleton
  13.  */
  14. Ext.util.TextMetrics = function(){
  15.     var shared;
  16.     return {
  17.         /**
  18.          * Measures the size of the specified text
  19.          * @param {String/HTMLElement} el The element, dom node or id from which to copy existing CSS styles
  20.          * that can affect the size of the rendered text
  21.          * @param {String} text The text to measure
  22.          * @param {Number} fixedWidth (optional) If the text will be multiline, you have to set a fixed width
  23.          * in order to accurately measure the text height
  24.          * @return {Object} An object containing the text's size {width: (width), height: (height)}
  25.          */
  26.         measure : function(el, text, fixedWidth){
  27.             if(!shared){
  28.                 shared = Ext.util.TextMetrics.Instance(el, fixedWidth);
  29.             }
  30.             shared.bind(el);
  31.             shared.setFixedWidth(fixedWidth || 'auto');
  32.             return shared.getSize(text);
  33.         },
  34.         /**
  35.          * Return a unique TextMetrics instance that can be bound directly to an element and reused.  This reduces
  36.          * the overhead of multiple calls to initialize the style properties on each measurement.
  37.          * @param {String/HTMLElement} el The element, dom node or id that the instance will be bound to
  38.          * @param {Number} fixedWidth (optional) If the text will be multiline, you have to set a fixed width
  39.          * in order to accurately measure the text height
  40.          * @return {Ext.util.TextMetrics.Instance} instance The new instance
  41.          */
  42.         createInstance : function(el, fixedWidth){
  43.             return Ext.util.TextMetrics.Instance(el, fixedWidth);
  44.         }
  45.     };
  46. }();
  47. Ext.util.TextMetrics.Instance = function(bindTo, fixedWidth){
  48.     var ml = new Ext.Element(document.createElement('div'));
  49.     document.body.appendChild(ml.dom);
  50.     ml.position('absolute');
  51.     ml.setLeftTop(-1000, -1000);
  52.     ml.hide();
  53.     if(fixedWidth){
  54.         ml.setWidth(fixedWidth);
  55.     }
  56.     var instance = {
  57.         /**
  58.          * <p><b>Only available on the instance returned from {@link #createInstance}, <u>not</u> on the singleton.</b></p>
  59.          * Returns the size of the specified text based on the internal element's style and width properties
  60.          * @param {String} text The text to measure
  61.          * @return {Object} An object containing the text's size {width: (width), height: (height)}
  62.          */
  63.         getSize : function(text){
  64.             ml.update(text);
  65.             var s = ml.getSize();
  66.             ml.update('');
  67.             return s;
  68.         },
  69.         /**
  70.          * <p><b>Only available on the instance returned from {@link #createInstance}, <u>not</u> on the singleton.</b></p>
  71.          * Binds this TextMetrics instance to an element from which to copy existing CSS styles
  72.          * that can affect the size of the rendered text
  73.          * @param {String/HTMLElement} el The element, dom node or id
  74.          */
  75.         bind : function(el){
  76.             ml.setStyle(
  77.                 Ext.fly(el).getStyles('font-size','font-style', 'font-weight', 'font-family','line-height', 'text-transform', 'letter-spacing')
  78.             );
  79.         },
  80.         /**
  81.          * <p><b>Only available on the instance returned from {@link #createInstance}, <u>not</u> on the singleton.</b></p>
  82.          * Sets a fixed width on the internal measurement element.  If the text will be multiline, you have
  83.          * to set a fixed width in order to accurately measure the text height.
  84.          * @param {Number} width The width to set on the element
  85.          */
  86.         setFixedWidth : function(width){
  87.             ml.setWidth(width);
  88.         },
  89.         /**
  90.          * <p><b>Only available on the instance returned from {@link #createInstance}, <u>not</u> on the singleton.</b></p>
  91.          * Returns the measured width of the specified text
  92.          * @param {String} text The text to measure
  93.          * @return {Number} width The width in pixels
  94.          */
  95.         getWidth : function(text){
  96.             ml.dom.style.width = 'auto';
  97.             return this.getSize(text).width;
  98.         },
  99.         /**
  100.          * <p><b>Only available on the instance returned from {@link #createInstance}, <u>not</u> on the singleton.</b></p>
  101.          * Returns the measured height of the specified text.  For multiline text, be sure to call
  102.          * {@link #setFixedWidth} if necessary.
  103.          * @param {String} text The text to measure
  104.          * @return {Number} height The height in pixels
  105.          */
  106.         getHeight : function(text){
  107.             return this.getSize(text).height;
  108.         }
  109.     };
  110.     instance.bind(bindTo);
  111.     return instance;
  112. };
  113. Ext.Element.addMethods({
  114.     /**
  115.      * Returns the width in pixels of the passed text, or the width of the text in this Element.
  116.      * @param {String} text The text to measure. Defaults to the innerHTML of the element.
  117.      * @param {Number} min (Optional) The minumum value to return.
  118.      * @param {Number} max (Optional) The maximum value to return.
  119.      * @return {Number} The text width in pixels.
  120.      * @member Ext.Element getTextWidth
  121.      */
  122.     getTextWidth : function(text, min, max){
  123.         return (Ext.util.TextMetrics.measure(this.dom, Ext.value(text, this.dom.innerHTML, true)).width).constrain(min || 0, max || 1000000);
  124.     }
  125. });