Spec-Zone.ru › jQuery

jQuery.cssHooks

jQuery.cssHooksВозвращает: Объект

Описание: Непосредственно подключается к jQuery для переопределения того, как извлекаются или устанавливаются определённые свойства CSS, нормализует именование свойств CSS или создаёт пользовательские свойства.

  • версия добавлена: 1.4.3jQuery.cssHooks

Объект $.cssHooks предоставляет способ определения функций для получения и установки определённых значений CSS. Он также может использоваться для создания новых cssHooks для нормализации функций CSS3, таких как тени и градиенты.

Например, некоторые версии браузеров на основе Webkit требуют -webkit-border-radius для установки border-radius элемента, в то время как более ранние версии Firefox требуют -moz-border-radius. Css-хук может нормализовать эти префиксы поставщиков, чтобы .css() принимал одно стандартное имя свойства (border-radius, или с синтаксисом свойства DOM, borderRadius).

Помимо предоставления точного контроля над тем, как обрабатываются отдельные свойства стиля, $.cssHooks также расширяет набор свойств, доступных для метода .animate().

Определение нового css-хука простое. Приведённый ниже шаблон скелета может служить руководством для создания собственного.

(function( $ ) {
 
// First, check to see if cssHooks are supported
if ( !$.cssHooks ) {
  // If not, output an error message
  throw( new Error( "jQuery 1.4.3 or above is required for this plugin to work" ) );
}
 
// Wrap in a document ready call, because jQuery writes
// cssHooks at this time and will blow away your functions
// if they exist.
$(function () {
  $.cssHooks[ "someCSSProp" ] = {
    get: function( elem, computed, extra ) {
      // Handle getting the CSS property
    },
    set: function( elem, value ) {
      // Handle setting the CSS value
    }
  };
});
 
})( jQuery );

Тестирование возможностей

Прежде чем нормализовать свойство CSS, зависящее от поставщика, сначала определите, поддерживает ли браузер стандартное свойство или вариацию с префиксом поставщика. Например, чтобы проверить поддержку свойства border-radius, проверьте, является ли какая-либо из вариаций членом объекта style временного элемента.

(function( $ ) {
 
function styleSupport( prop ) {
  var vendorProp, supportedProp,
 
    // Capitalize first character of the prop to test vendor prefix
    capProp = prop.charAt( 0 ).toUpperCase() + prop.slice( 1 ),
    prefixes = [ "Moz", "Webkit", "ms" ],
    div = document.createElement( "div" );
 
  if ( prop in div.style ) {
 
    // Browser supports standard CSS property name
    supportedProp = prop;
  } else {
 
    // Otherwise test support for vendor-prefixed property names
    for ( var i = 0; i < prefixes.length; i++ ) {
      vendorProp = prefixes[ i ] + capProp;
      if ( vendorProp in div.style ) {
        supportedProp = vendorProp;
        break;
      }
    }
  }
 
  // Avoid memory leak in IE
  div = null;
 
  // Add property to $.support so it can be accessed elsewhere
  $.support[ prop ] = supportedProp;
  return supportedProp;
}
 
// Call the function, e.g. testing for "border-radius" support:
styleSupport( "borderRadius" );
 
})( jQuery );

Определение полного css-хука

Чтобы определить полный css-хук, объедините тест поддержки с заполненной версией шаблонного скелета, представленного в первом примере:

(function( $ ) {
 
if ( !$.cssHooks ) {
  throw( new Error( "jQuery 1.4.3+ is needed for this plugin to work" ) );
}
 
function styleSupport( prop ) {
  var vendorProp, supportedProp,
    capProp = prop.charAt( 0 ).toUpperCase() + prop.slice( 1 ),
    prefixes = [ "Moz", "Webkit", "ms" ],
    div = document.createElement( "div" );
 
  if ( prop in div.style ) {
    supportedProp = prop;
  } else {
    for ( var i = 0; i < prefixes.length; i++ ) {
      vendorProp = prefixes[ i ] + capProp;
      if ( vendorProp in div.style ) {
        supportedProp = vendorProp;
        break;
      }
    }
  }
 
  div = null;
  $.support[ prop ] = supportedProp;
  return supportedProp;
}
 
var borderRadius = styleSupport( "borderRadius" );
 
// Set cssHooks only for browsers that support a vendor-prefixed border radius
if ( borderRadius && borderRadius !== "borderRadius" ) {
  $.cssHooks.borderRadius = {
    get: function( elem, computed, extra ) {
      return $.css( elem, borderRadius );
    },
    set: function( elem, value) {
      elem.style[ borderRadius ] = value;
    }
  };
}
 
})( jQuery );

Затем вы можете установить радиус границы в поддерживаемом браузере, используя либо стиль DOM (camelCased), либо стиль CSS (с дефисами):

$( "#element" ).css( "borderRadius", "10px" );
$( "#another" ).css( "border-radius", "20px" );

Если браузер не поддерживает ни одну форму свойства CSS, с префиксом поставщика или без, стиль не применяется к элементу. Однако, если браузер поддерживает собственную альтернативу, её можно применить к cssHooks вместо этого.

(function( $ ) {
 
// Feature test for support of a CSS property
// and a proprietary alternative
// ...
if ( $.support.someCSSProp && $.support.someCSSProp !== "someCSSProp" ) {
 
  // Set cssHooks for browsers that
  // support only a vendor-prefixed someCSSProp
  $.cssHooks.someCSSProp = {
    get: function( elem, computed, extra ) {
      return $.css( elem, $.support.someCSSProp );
    },
    set: function( elem, value) {
      elem.style[ $.support.someCSSProp ] = value;
    }
  };
} else if ( supportsProprietaryAlternative ) {
  $.cssHooks.someCSSProp = {
    get: function( elem, computed, extra ) {
      // Handle crazy conversion from the proprietary alternative
    },
    set: function( elem, value ) {
      // Handle crazy conversion to the proprietary alternative
    }
  }
}
 
})( jQuery );

Специальные единицы

По умолчанию jQuery добавляет единицу "px" к значениям, переданным методу .css(). Это поведение можно предотвратить, добавив свойство в объект jQuery.cssNumber.

$.cssNumber.someCSSProp = true;

Анимация с помощью cssHooks

Css-хук также может подключиться к механизму анимации jQuery, добавив свойство к объекту jQuery.fx.step:

$.fx.step.someCSSProp = function( fx ) {
  $.cssHooks.someCSSProp.set( fx.elem, fx.now + fx.unit );
};

Обратите внимание, что это лучше всего работает для простых анимированных значений чисел. В зависимости от свойства CSS, типа возвращаемого значения и сложности анимации может потребоваться больше пользовательского кода.

© The jQuery Foundation and other contributors
Licensed under the MIT License.
https://api.jquery.com/jQuery.cssHooks

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API