4 * style 値の変更は、enterFrame 後にまとめて適用
5 * width(), height(), x(), y() 1em の取得時にも適用
6 * css3 の ie用 fix は X.UI レベルで行う
11 /* font-size -> fontSize */
12 function X_Node_CSS_camelize( cssProp ){
13 var parts, l, i, parts0, camelized;
15 if( camelized = X_Node_CSS__DICTIONARY_CAMELIZE[ cssProp ] ) return camelized;
16 parts = cssProp.split( ' ' ).join( '' ).split( '-' );
19 if( l === 1 ) return parts0;
21 camelized = cssProp.charAt(0) === '-'
22 ? parts0.charAt( 0 ).toUpperCase() + parts0.substring( 1 )
25 for( i = 1; i < l; ++i ){
26 camelized += parts[ i ].charAt( 0 ).toUpperCase() + parts[ i ].substring( 1 );
28 return X_Node_CSS__DICTIONARY_CAMELIZE[ cssProp ] = camelized;
31 // TODO use X_HTMLParser_CHARS
32 /* fontSize -> font-size */
33 function X_Node_CSS_uncamelize( str ){
34 var A = X_Node_CSS_CHAR_CODE_A,
36 uncamelized, l, chr, code, i;
37 str = str.split( ' ' ).join( '' );
38 if( uncamelized = X_Node_CSS__DICTIONARY_UNCAMELIZE[ str ] ) return uncamelized;
40 for( i = 0, l = str.length; i < l; ++i ){
41 chr = str.charAt( i );
42 code = chr.charCodeAt( 0 );
43 uncamelized += ( A <= code && code <= Z ) ? '-' + chr : chr;
45 return X_Node_CSS__DICTIONARY_UNCAMELIZE[ str ] = uncamelized.toLowerCase();
50 X_node_CSS_getComputedStyle = window.getComputedStyle || document.defaultView && document.defaultView.getComputedStyle,
52 /* font-size -> fontSize */
53 X_Node_CSS__DICTIONARY_CAMELIZE = {},
55 /* fontSize -> font-size */
56 X_Node_CSS_CHAR_CODE_A = 'A'.charCodeAt( 0 ),
58 X_Node_CSS__DICTIONARY_UNCAMELIZE = {},
61 * CSS における display, position, float プロパティの相互関係
62 * http://d.hatena.ne.jp/elm200/20080201/1201874740
64 * CSS21:9.7 Relationships between ’display’, ’position’, and ’float’
65 * http://www.w3.org/TR/CSS21/visuren.html#dis-pos-flo
67 * display:none? -yes-> 非表示
69 * position:absolute? -yes-> float:none,display:block;
71 * float:none? -no-> display:block;
76 display position float
77 block static|relative none
78 block static|relative right|left
80 inline static|relative none
87 X_Node_CSS_VENDER_PREFIX = {},
89 X_Node_CSS__CLIP_SEPARATOR = X_UA.IE < 8 ? ' ' : ',',
91 X_Node_CSS__UNIT_RATIO = {},
92 X_Node_CSS__FONT_SIZE_RATIO = {},
94 // https://developer.mozilla.org/en-US/docs/Web/CSS/transform
95 // Firefox 3.5, ie9, Opera 10.5, Safari 3.1, Chrome
96 // 3D support Firefox 10, ie10, Safari 4.0, Chrome 12.0
97 // transform : void 0,
99 // https://developer.mozilla.org/ja/docs/Web/Guide/CSS/Using_CSS_transitions
100 // Chrome 1.0, Firefox 4.0, ie10, Opera 10.5, Safari 3.2
101 // Android 2.1, Firefox Android 4.0, Opera Mobile 10, Safari Mobile 3.2
102 // transition : void 0
104 // ブラウザ毎の getComputedStyle の戻り値 http://d.hatena.ne.jp/uupaa/20080928/1222543331
126 SLATEGRAY : 0x708090,
128 GAINSBORO : 0xDCDCDC,
129 MIDNIGHTBLUE : 0x191970,
130 SLATEBLUE : 0x6A5ACD,
131 MEDIUMBLUE : 0x0000CD,
132 ROYALBLUE : 0x4169E1,
133 DODGERBLUE : 0x1E90FF,
135 STEELBLUE : 0x4682B4,
136 LIGHTBLUE : 0xADD8E6,
137 PALETURQUOISE : 0xAFEEEE,
138 TURQUOISE : 0x40E0D0,
139 LIGHTCYAN : 0xE0FFFF,
140 AQUAMARINE : 0x7FFFD4,
141 DARKGREEN : 0x006400,
143 LIGHTGREEN : 0x90EE90,
144 CHARTREUSE : 0x7FFF00,
145 GREENYELLOW : 0xADFF2F,
146 LIMEGREEN : 0x32CD32,
147 YELLOWGREEN : 0x9ACD32,
148 OLIVEDRAB : 0x6B8E23,
149 DARKKHAKI : 0xBCB76B,
150 PALEGOLDENROD : 0xEEE8AA,
151 LIGHTYELLOW : 0xFFFFE0,
153 GOLDENROD : 0xDAA520,
154 DARKGOLDENROD : 0xB8860B,
155 ROSYBROWN : 0xBC8F8F,
156 INDIANRED : 0xCD5C5C,
157 SADDLEBROWN : 0x8B4513,
160 BURLYWOOD : 0xDEB887,
163 SANDYBROWN : 0xF4A460,
165 CHOCOLATE : 0xD2691E,
166 FIREBRICK : 0xB22222,
175 PALEVIOLETRED : 0xDB7093,
179 DARKVIOLET : 0x9400D3,
180 BLUEVIOLET : 0x8A2BE2,
181 MEDIUMPURPLE : 0x9370DB,
184 MISTYROSE : 0xFFE4E1,
186 LEMONCHIFFON : 0xFFFACD
189 function X_Node_CSS_parseColor( x ){
192 if( X.Type.isNumber( x ) ){
193 return ( 0x0 <= x && x <= 0xFFFFFF ) ? x : undefined;
195 if( !X.Type.isString( x ) ) return;
197 if( X.Type.isNumber( rgb = X_Node_CSS_COLOR[ x.toUpperCase() ] ) && 0x0 <= rgb && rgb <= 0xFFFFFF ){
200 if( x.charAt( 0 ) === '#' ){
203 r = parseInt( x.substr( 1, 2 ), 16 );
204 g = parseInt( x.substr( 3, 2 ), 16 );
205 b = parseInt( x.substr( 5, 2 ), 16 );
208 r = parseInt( x.charAt( 1 ) + x.charAt( 1 ), 16 );
209 g = parseInt( x.charAt( 2 ) + x.charAt( 2 ), 16 );
210 b = parseInt( x.charAt( 3 ) + x.charAt( 3 ), 16 );
213 r = g = b = parseInt( x.charAt( 1 ) + x.charAt( 1 ), 16 );
219 if( x.indexOf( 'rgb(' ) === 0 ){
220 rgb = x.substr( 4 ).split( ',' );
221 r = parseFloat( rgb[ 0 ] );
222 g = parseFloat( rgb[ 1 ] );
223 b = parseFloat( rgb[ 2 ] );
224 if( x.indexOf( '%' ) !== -1 ){
230 if( x.indexOf( 'rgba(' ) === 0 ){
231 rgb = x.substr( 5 ).split( ',' );
232 r = parseFloat( rgb[ 0 ] );
233 g = parseFloat( rgb[ 1 ] );
234 b = parseFloat( rgb[ 2 ] );
235 //a = parseFloat( rgb[ 3 ] );
236 if( x.indexOf( '%' ) !== -1 ){
244 return isFinite( r + b + g ) ? ( r << 16 ) + ( g << 8 ) + b : undefined;
247 function X_Node_CSS_objToCssText( that ){
249 plain = X_EMPTY_OBJECT,
252 p, v, specialFix, filterFix;
254 if( !obj ) return ''; // Opera7.5 未満?
257 // object の拡張に備えて plain なオブジェクトを用意し、そのメンバーと一致するものは処理の対象外。
258 if( plain[ p ] ) continue;
262 p = X_Node_CSS_uncamelize( X_Node_CSS_VENDER_PREFIX[ p ] || p );
264 if( specialFix = X_Node_CSS_SPECIAL_FIX_PROP[ p ] ){
265 css[ ++n ] = p + ':' + specialFix( v );
268 if( X_Node_CSS_FILTER_FIX_PROPS && X_Node_CSS_FILTER_FIX_PROPS[ p ] ){
269 ( filterFix || ( filterFix = {} ) )[ p ] = v;
272 css[ ++n ] = p + ':' + v;
276 filterFix && ( css[ ++n ] = 'filter:' + X_Node_CSS_objToIEFilterText( that, filterFix ) );
278 return css.join( ';' );
282 X_Node_CSS_FILTER_FIX_PROPS =
283 X_UA.ActiveX && X_UA.IE < 9 && !X_UA.MacIE ?
289 X_UA.ActiveX && X_UA.IE9 ? // == 9
295 function X_Node_CSS_objToIEFilterText( that, opt_css ){
296 var obj = opt_css || that._css,
297 test = X_Node_CSS_FILTER_FIX_PROPS,
300 p, id, v, num, ary, params, i, l, dir,
301 afterUpdate, impossible;
303 if( X_EMPTY_OBJECT[ p ] ) continue;
305 if( !( id = test[ p ] ) ) continue;
309 case 1 : //'filter' :
312 case 2 : //'opacity' :
313 filters[ ++n ] = 'alpha(opacity=' + ( v * 100 | 0 ) +')';
315 case 3 : //'boxShadow' :
317 // box-shadow: 10px 10px 10px 10px rgba(0,0,0,0.4) inset;
318 // スペース区切りで、水平方向の距離 垂直方向の距離 ぼかし距離 広がり距離 影の色 insetキーワードを指定する。 ぼかし距離 広がり距離 影の色 insetキーワードは省略可
319 // https://developer.mozilla.org/ja/docs/Web/CSS/box-shadow
320 // <length> に絶対値は不可? <color> 省略した場合は、文字の色が使われる(webkit以外)
321 // shadow(color=#cccccc, strength=10, direction=135);
322 ary = v.split( ' ' );
323 params = [ 0, 0, 0, 0 ]; // offset-x, offset-y, blur-radius, spread-radius
324 for( i = 0, l = ary.length; i < l; ++i ){
326 num = i < 4 && parsetFloat( v );
329 vu = X_Node_CSS__splitValueAndUnit( v );
333 if( _v = X_Node_CSS__UNIT_RATIO[ u ] ){
334 params[ i ] = v / _v;
341 if( X_Node_updateTimerID ){
344 params[ i ] = X_Node_CSS_getCharSize( that ) * v;
355 if( v.charAt( 0 ) === '#' || v.indexOf( 'rgb' ) === 0 || X_Node_CSS_COLOR[ v.toUpperCase() ] ){
356 v = X_Node_CSS_parseColor( v );
357 if( 0 <= v && v < 0x100000 ){
358 color = '00000' + v.toString( 16 );
359 color = '#' + color.substr( color.length - 6 );
362 color = '#' + v.toString( 16 );
371 if( impossible || !color ){
375 // AFTER_UPDATE 時に 再計算
376 X_ViewPort.listenOnce( X_Event.AFTER_UPDATE, that, X_Node_CSS_onAfterUpdateForIEFilterFix );
379 dir = Math.atan2( params[ 1 ] + params[ 3 ], params[ 0 ] + params[ 3 ] ) * 180 / Math.PI + 90;
380 dir += dir < 0 ? 360 : 0;
381 filters[ ++n ] = 'shadow(color=' + color + ',strength=' + params[ 3 ] + ',direction=' + ( dir | 0 ) + ')';
383 case 4 : //'textShadow' :
384 //text-shadow: 5px 5px 2px blue; 水平方向の距離 垂直方向の距離 影のぼかし半径 影の色 none
385 //glow(Color=yellow,Strength=10);
386 //どうやらCSSのbackgroundプロパティと同時に使えないようです。 s
388 case 5 : //'backgroundImage' :
392 return filters.join( ' ' );
395 function X_Node_CSS_onAfterUpdateForIEFilterFix(){
396 if( this._root ){ // 要素があり、要素がツリーに属している
397 this._flags |= X_Node_State.DIRTY_IE_FILTER;
398 X_Node_reserveUpdate();
404 * http://css-eblog.com/ie-css-problems/rgba-pe.html
405 * ie67 では rgb() は background-color で反応しない、、、
412 // ex, rem, vh, vw, vmin, vmax
430 function X_Node_CSS__splitValueAndUnit( v ){
432 if( X.Type.isNumber( v ) ) return [ v || 0, '' ];
433 num = parseFloat( v );
434 if( num !== num ) return [ 0, '' ];
436 if( 0 < num && num < 1 && v.charAt( 0 ) === '.' ) _num = _num.slice( 1 );
437 if( -1 < num && num < 0 && v.charAt( 1 ) === '.' ) _num = '-.' + _num.substr( 2 );
438 u = v.substr( v.indexOf( _num ) + _num.length );
439 return [ num, X_Node_CSS_UNIT[ u ] ? u : 'px' ];
443 var test = X_Node_CSS_SPECIAL_FIX_PROP,
444 ret = [], p, id, v, bgpX, bgpY, clipT, clipB, clipL, clipR;
446 if( !( id = test[ p ] ) ) continue;
449 case 1 : //'backgroundPositionX' :
452 case 2 : //'backgroundPositionY' :
455 case 3 : //'clipTop' :
458 case 4 : //'clipBottom' :
461 case 5 : //'clipLeft' :
464 case 6 : //'clipRight' :
469 if( bgpX || bgpY ) ret[ ret.length ] = 'background-position:';
470 if( clipT || clipB || clipL || clipR ){
471 ret[ ret.length ] = 'clip:rect(';
473 return ret.join( ';' );
481 // unitID, name 単位指定のプロパティ取得 geter
483 // name, value setter
485 Node.prototype.css = function( nameOrObj /* orUnitID, valuOrUnitOrName */ ){
486 var plain = X_EMPTY_OBJECT,
489 p, name, v, camelize, unit, ieFix;
490 if( this._xnodeType !== 1 ) return this;
492 if( X.Type.isObject( nameOrObj ) ){
493 if( !css ) css = this._css = {};
494 camelize = X_Node_CSS_camelize;
495 ieFix = X_Node_CSS_FILTER_FIX_PROPS;
496 for( p in nameOrObj ){
497 if( plain[ p ] ) continue;
499 if( ieFix && ieFix[ p ] ){
500 this._flags |= X_Node_State.DIRTY_IE_FILTER;
503 v || v === 0 ? css[ camelize( p ) ] = v : delete css[ camelize( p ) ];
504 if( p === 'display' ){
505 v === 'none' ? ( this._flags |= X_Node_State.IE5_DISPLAY_NONE_FIX ) : ( this._flags &= ~X_Node_State.IE5_DISPLAY_NONE_FIX );
506 v === 'none' ? ( this._flags |= X_Node_State.STYLE_IS_DISPLAY_NONE ) : ( this._flags &= ~X_Node_State.STYLE_IS_DISPLAY_NONE );
509 this._flags |= X_Node_State.DIRTY_CSS;
510 this.parent && X_Node_reserveUpdate();
511 delete this._cssText;
514 if( 1 < args.length ){
515 // setter name, value
516 if( !css ) css = this._css = {};
517 name = X_Node_CSS_camelize( nameOrObj );
519 if( css[ name ] === v ) return this;
520 if( X_Node_CSS_FILTER_FIX_PROPS && X_Node_CSS_FILTER_FIX_PROPS[ name ] ){
521 this._flags |= X_Node_State.DIRTY_IE_FILTER;
528 delete this._cssText;
529 this._flags |= X_Node_State.DIRTY_CSS;
530 if( name === 'display' ){
531 v === 'none' ? ( this._flags |= X_Node_State.IE5_DISPLAY_NONE_FIX ) : ( this._flags &= ~X_Node_State.IE5_DISPLAY_NONE_FIX );
532 v === 'none' ? ( this._flags |= X_Node_State.STYLE_IS_DISPLAY_NONE ) : ( this._flags &= ~X_Node_State.STYLE_IS_DISPLAY_NONE );
534 // TODO this._flags & in tree
535 this.parent && X_Node_reserveUpdate();
540 // 集計 border, padding, margin, backgroundPosition, clip
541 // border で正確なデータを返せない時は、null を返す
542 return css[ X_Node_CSS_camelize( nameOrObj ) ];
545 Node.prototype.cssText = function( v ){
546 var obj, i, l, attr, name;
549 this._flags &= ~X_Node_State.IE5_DISPLAY_NONE_FIX;
550 this._flags |= X_Node_State.DIRTY_CSS;
551 this.parent && X_Node_reserveUpdate();
552 delete this._cssText;
555 if( X.Type.isString( v ) ){
557 this._flags &= ~X_Node_State.IE5_DISPLAY_NONE_FIX;
559 v = v.split( ';' ); // TODO content ";" などにも対応
560 for( i = 0, l = v.length; i < l; ++i ){
561 attr = v[ i ].split( ':' );
562 ( name = attr[ 0 ] ) && ( obj[ name ] = attr[ 1 ] || true );
564 return this.css( obj );
567 if( this._flags & X_Node_State.DIRTY_CSS && !( this._cssText = X_Node_CSS_objToCssText( this ) ) ){
568 delete this._cssText;
570 return this._cssText;
574 * ここでは HTMLElement のチ1ェックは行わない!
576 * body に css attr がセットされた場合には X_ViewPort_baseFontSize をクリア
577 * class, id, attr(<font size><basefont>) の変更があった場合は、変更の適用の後、charSize を取得
578 * css の場合は、計算で求めることが可能、content は影響しない
579 * :hover, #target, が絡む場合、正しく扱えない
582 X_Node_CSS_getCharSize =
583 X_node_CSS_getComputedStyle ?
585 X_Node_updateTimerID && X_Node_startUpdate();
586 if( that === X_Node_body && X_ViewPort_baseFontSize ) return X_ViewPort_baseFontSize;
587 if( that._fontSize ) return that._fontSize;
588 return that._fontSize = parseFloat( X_node_CSS_getComputedStyle( that._rawObject, null ).fontSize );
593 var font, vu, v, u, _v;
594 X_Node_updateTimerID && X_Node_startUpdate();
595 if( that === X_Node_body && X_ViewPort_baseFontSize ) return X_ViewPort_baseFontSize;
596 if( that._fontSize ) return that._fontSize;
598 font = that._rawObject.currentStyle.fontSize;
599 //font = that._css && that._css.fontSize || '1em';
600 vu = X_Node_CSS__splitValueAndUnit( font );
605 if( v = X_Node_CSS__FONT_SIZE_RATIO[ font ] ) return that._fontSize = v;
607 if( _v = X_Node_CSS__UNIT_RATIO[ u ] ) return that._fontSize = v / _v;
611 return that._fontSize = v;
613 // body まで辿ってしまった場合は?
614 if( that.parent ) return that._fontSize = X_Node_CSS_getCharSize( that.parent ) * v;
617 // body まで辿ってしまった場合は?
618 if( that.parent ) return that._fontSize = X_Node_CSS_getCharSize( that.parent ) * v / 100;
625 X_Node_updateTimerID && X_Node_startUpdate();
626 if( that === X_Node_body && X_ViewPort_baseFontSize ) return X_ViewPort_baseFontSize;
627 if( that._fontSize ) return that._fontSize;
629 that._rawObject.appendChild( elm = document.createElement( 'span' ) );
630 elm.style.cssText = 'display:block;position:absolute;top:0;left:0;visivility:hidden;line-height:1;height:1em;';
632 v = elm.offsetHeight;
633 that._rawObject.removeChild( elm );
634 return that._fontSize = v;
638 var font, vu, v, u, _v;
639 X_Node_updateTimerID && X_Node_startUpdate();
640 if( that === X_Node_body && X_ViewPort_baseFontSize ) return X_ViewPort_baseFontSize;
641 if( that._fontSize ) return that._fontSize;
643 if( that._css && ( font = that._css.fontSize ) ){
644 vu = X_Node_CSS__splitValueAndUnit( font );
649 if( _v = X_Node_CSS__FONT_SIZE_RATIO[ font ] ) return that._fontSize = _v;
651 if( _v = X_Node_CSS__UNIT_RATIO[ u ] ) return that._fontSize = v / _v;
660 return that._fontSize = v;
662 // body まで辿ってしまった場合は?
663 if( that.parent ) return that._fontSize = X_Node_CSS_getCharSize( that.parent ) * v;
666 // body まで辿ってしまった場合は?
667 if( that.parent ) return that._fontSize = X_Node_CSS_getCharSize( that.parent ) * v / 100;
673 var X_Node_CSS_Support = {},
675 X_Node_CSS_SPECIAL_FIX_PROP = {
677 transitionDuration : X_UA.Android && !X_UA.Chrome && function( v ){ // bad Android
678 return parseFloat( v ) === 0 ? '0.001s' : v;
681 //webkit boxShadow <color> が省略された場合。transparent になるのを color に
682 //webkit boxShadow が border-radius をはみ出す, background-image に グラデーションのないグラデーション指定
683 // http://melty.koume.in/android-bug-boxshadow-radius/
689 VENDER_PREFIX : X_Node_CSS_VENDER_PREFIX,
691 uncamelize : X_Node_CSS_uncamelize,
693 Support : X_Node_CSS_Support
697 * backgroundPositionX : testStyle.backgroundPositionX === undefined ? 3 : 0,
698 backgroundPosiitonY : testStyle.backgroundPositionX === undefined ? 3 : 0,
699 clipTop : testStyle.clipTop === undefined && testStyle[ 'clip-top' ] === undefined ? 3 : 0,
700 clipBottom : testStyle.clipTop === undefined && testStyle[ 'clip-top' ] === undefined ? 4 : 0,
701 clipLeft : testStyle.clipTop === undefined && testStyle[ 'clip-top' ] === undefined ? 5 : 0,
702 clipRight : testStyle.clipTop === undefined && testStyle[ 'clip-top' ] === undefined ? 6 : 0
706 var testStyle = X_UA.IE4 ? {} : ( /*document.documentElement ||*/ document.createElement( 'div' ) ).style,
707 temp = testStyle.cssText,
708 vendors = 'webkit,Webkit,Moz,moz,Ms,ms,O,o,khtml,Khtml'.split( ',' ),
710 'opacity,boxSizing,boxShadow,' +
711 'transform,transformOrigin,perspective,' +
712 'transisiton,transitionDelay,transitionProperty,transitionDuration,transitionTimingFunction,backfaceVisibility,willChange,filter,' +
713 'userSelect,touchSelect,touchAction,touchCallout,contentZooming,userDrag,tapHighlightColor' ).split( ',' ),
714 vendor, i, search, prop, j, v;
716 for( i = searches.length; i; ){
717 search = prop = searches[ --i ];
719 if( testStyle[ prop ] === undefined ){
720 prop = prop.charAt( 0 ).toUpperCase() + prop.substr( 1 );
721 for( j = vendors.length; j; ){
723 if( testStyle[ v + prop ] !== undefined ){
724 if( v === 'ms' ) v = 'Ms';// for ie9
725 if( v === 'o' ) v = 'O';//for opera12
726 X_Node_CSS_VENDER_PREFIX[ search ] = v + prop;
731 X_Node_CSS_VENDER_PREFIX[ search ] = prop;
735 testStyle.cssText = 'background:rgba(0,0,0,0.5);border-color:transparent';
736 X_Node_CSS_Support[ 'rgba' ] = !!testStyle[ 'background' ];
737 X_Node_CSS_Support[ 'transparent' ] = !!testStyle[ 'borderColor' ];
738 // TODO border による三角形の可否
739 // 2:完全、 1:透過に非対応(IE7-) 0:borderの描画が非標準で三角形が作れない
742 * chrome 1+, ff3.5(1.9.1), ie9+, opera10.5+, Safari3+(522)
744 if( prop = X_Node_CSS_VENDER_PREFIX[ 'boxShadow' ] ){
746 testStyle.cssText = X_Node_CSS_uncamelize( prop ) + ':0 0';
747 X_Node_CSS_Support[ 'boxShadow' ] = !!testStyle[ prop ];
750 * chrome 4+, ff3.5(1.9.1), ie9+, opera10.5+, Safari5+(533)
752 testStyle.cssText = X_Node_CSS_uncamelize( prop ) + ':0 0, 0 0';
753 X_Node_CSS_Support[ 'boxShadowMulti' ] = !!testStyle[ prop ];
756 * https://developer.mozilla.org/ja/docs/Web/CSS/box-shadow
757 * この値を用いる場合には、spread-radius を省略出来ません。box-shadow が効かないケースに遭遇した時はこの事を思い出して下さい。
758 * chrome 4+, ff3.5(1.9.1), ie9+, opera10.5+, Safari5+(533)
760 * http://unformedbuilding.com/articles/considerations-when-using-the-box-shadow/
761 * box-shadow:inset と border-radius を指定しているときの Google Chrome の表示
762 * このバグは Windows と Linux で発生するようです。
763 * Windows 版 Chrome 10.0.648.127 で修正されているのを確認しました。
765 testStyle.cssText = X_Node_CSS_uncamelize( prop ) + ':0 0 inset';
766 X_Node_CSS_Support[ 'boxShadowInset' ] = testStyle[ prop ] && testStyle[ prop ].indexOf( 'inset' ) !== -1;
771 testStyle.cssText = temp;
775 X_ViewPort.listenOnce( X_TEMP.SYSTEM_EVENT_INIT, function(){
776 var xnode = X_Node_systemNode,
777 output = X_Node_CSS__UNIT_RATIO,
778 list = 'cm,mm,in,pt,pc'.split( ',' ),
781 for( i = list.length; i; ){
783 output[ unit ] = xnode.css( 'width', 10 + unit ).width() / 10;
786 output = X_Node_CSS__FONT_SIZE_RATIO,
787 list = 'xx-large,x-large,large,larger,medium,small,smaller,x-small,xx-small'.split( ',' );
788 xnode.css( { lineHeight : '100%', height : '1em' } ).text( 'X' );
790 for( i = list.length; i; ){
792 output[ size ] = xnode.css( 'fontSize', size ).height();// / base;
795 xnode.cssText( '' ).empty();