suchen
HeimWeb-Frontendjs-TutorialjQuery iScroll.js mobiles Bildlaufleisten-Verschönerungs-Plug-in Seite 1/5_jquery

jQuery iScroll.js Mobile Scroll Bar Beautification Plug-in Seite 1/5_jquery

Offizielle Website: http://cubiq.org/iscroll-5

Demo:

Scroll-Aktualisierung: http://cubiq.org/dropbox/iscroll4/examples/pull-to-refresh/

'Karussell'-Demo

iScroll ist sehr leistungsstark. Derzeit verwende ich es nur zum Anpassen von Bildlaufleisten. Hier finden Sie eine kurze Einführung in die Verwendung und Vorsichtsmaßnahmen von iscrol beim Anpassen von Bildlaufleisten auf mobilen Endgeräten.

1. Verwendung

iScroll initialisiert die zu scrollenden Elemente und schränkt die Verwendung von iScroll nicht ein eine Seite die Anzahl der Elemente.

Bei Verwendung von iScroll sollte die Struktur des DOM-Baums einfach genug sein, unnötige Tags entfernen und übermäßige Tag-Verschachtelung vermeiden.

1. HTML-Teil

1.1. Die beste und einfachste iScroll-Struktur

<div id="wrapper">
<ul>
<li></li>
.....
</ul>
</div>

In diesem Beispiel wird das ul-Tag gescrollt. Um wirksam zu werden, muss iScroll mit dem Wrapper außerhalb des Bildlaufinhalts zusammenarbeiten.

1.2. Nur das erste untergeordnete Element im Wrapper kann gescrollt werden

Da nur das erste untergeordnete Element im Wrapper gescrollt werden kann, lassen Sie es zum Scrollen mehrerer Elemente zu , die Schreibweise lautet wie folgt:

<div id="wrapper">
<div id="scroller">
<ul>
<li></li>
...
</ul>
<ul>
<li></li>
...
</ul>
</div>
</div>

Das Scroller-Element kann gescrollt werden, auch wenn es zwei ul-Elemente enthält.


2. js-Aufrufteil

2.1, verwenden Sie das onDomContentLoaded-Ereignis, um das Scrollen zu implementieren

Gilt für scrollende Inhalte, die nur Text und Bilder enthalten, und alle Bilder haben feste Größen

<script src="iscroll.js"></script>
<script>
var myscroll; //myscroll是全局变量,可以在任意地方调用
function loaded(){
myscroll=new iScroll("wrapper");
} window.addEventListener("DOMContentLoaded",loaded,false);
</script>

2.2. Verwenden Sie das onLoad-Ereignis, um das Scrollen zu implementieren

Weil DOMContentLoaded Das Ereignis wird aufgerufen, nachdem die DOM-Struktur geladen wurde, sodass die Länge und Breite des Bildlaufbereichs möglicherweise nicht bestimmt wird, bevor Elemente wie Bilder geladen werden. In diesem Fall kann das Ereignis onLoad verwendet werden.

<script src="iscroll.js"><script>
<script>
var myscroll;
function loaded(){
setTimeout(function(){
myscroll=new iScroll("wrapper");
},100 );
}
window.addEventListener("load",loaded,false);
</script>

In diesem Fall wird iScroll 100 ms nach dem Laden der Seitenressourcen (einschließlich Bilder) initialisiert. Dies sollte eine sicherere Möglichkeit sein, iScroll aufzurufen.

2.3. Laden der Bildlaufleiste im Popup-Frame

Der Popup-Frame wird im Allgemeinen durch Umschalten zwischen display:none und display:block implementiert.

Der Elementbrowser mit display:none wird nicht gerendert, daher kann die Höhe des scrollenden Inhalts nicht berechnet werden.

Nachdem das Popup-Fenster show() aufruft, um es anzuzeigen, wird der Bildlaufleistenbereich instanziiert. Wie folgt:

$("#mobile_show_duobao_all_num").show();
new iScroll(&#39;tc-wrapper2&#39;, {
scrollbarClass: &#39;myScrollbar&#39; ,
hScrollbar:false,
vScroll:true,
hideScrollbar: false //是否隐藏滚动条 
});


Tipp: Wenn der Schiebebildschirm angezeigt wird, ist das Kompatibilitätsproblem des gesamten Seitenschiebebildschirms wie folgt:

document.addEventListener(&#39;touchmove&#39;, function (e) { e.preventDefault(); }, false);

2.4. iScroll-Übergabeparameter

Mit dem zweiten Parameter in iScroll können Sie einige Inhalte anpassen, z. B. ob die ausgeblendet werden sollen Bildlaufleiste usw. . Häufig verwendete Parameter sind wie folgt:

hScroll false, horizontales Scrollen deaktivieren, true, horizontales Scrollen ist standardmäßig auf true
vScroll false, zartes vertikales Scrollen, true, vertikales Scrollen ist standardmäßig auf true
hScrollbar false, blendet die Bildlaufleiste aus in horizontaler Richtung
vScrollbar false verbirgt die Bildlaufleiste in vertikaler Richtung
fixedScrollbar Unter iOS wird die Bildlaufleiste verkleinert, wenn das Element über die Grenzen des Scrollers hinausgezogen wird verhindern, dass die Grenzen des
Sichtbaren Bereichs überschritten werden. Der Standardwert ist „true“ auf Android, „false“ auf iOS.
fadeScrollbar false Gibt an, dass die Bildlaufleiste ausgeblendet wird, wenn kein Fade-Effekt vorliegt.
hideScrollbar Blendet die Bildlaufleiste aus, wenn keine Benutzerinteraktion erfolgt. Der Standardwert ist true.
bounce Aktivieren oder deaktivieren die Grenze Bounce, Standard ist true
momentum Trägheit aktivieren oder deaktivieren, Standard ist true, dieser Parameter ist sehr nützlich, wenn Sie Ressourcen sparen möchten
lockDirection false hebt die Sperre der Ziehrichtung auf, wahres Ziehen kann nur in sein eine Richtung Nach oben (oben/unten oder links/rechts)

2.5, allgemeine Methode

refresh Diese Methode sollte aufgerufen werden, wenn sich der DOM-Baum ändert

zB: setTimeout(function () { myScroll.refresh(); }, 0);

3. Der CSS-Teil

erfordert einen Bildlauf beim Anpassen der Bildlaufleiste style Fügen Sie der Leiste wie folgt einen Klassenparameter hinzu

var myscroll=new iScroll("wrapper",{
  scrollbarClass: "myScrollbar"
});

Die Bildlaufleiste besteht aus zwei Elementen: dem Container und der Anzeige. Der Container hat die gleiche Höhe wie die Hülle und die Anzeige stellt die Bildlaufleiste selbst dar.

HTML-Ergebnisse lauten wie folgt:

<div class="myScrollbarV">
<div></div>
</div>

CSS lautet wie folgt, Sie können es selbst ändern:

@charset "utf-8";
/* CSS Document */
/**
*
* Horizontal Scrollbar
*
*/
.myScrollbarH {
position:absolute;
z-index:100;
height:8px;
bottom:1px;
left:2px;
right:7px
}
.myScrollbarH > div {
position:absolute;
z-index:100;
height:100%;
/* The following is probably what you want to customize */
background-image:-webkit-gradient(linear, 0 0, 100% 0, from(#a00), to(#f00));
background-image:-moz-linear-gradient(top, #f00, #900);
background-image:-o-linear-gradient(top, #f00, #900);
border:1px solid #900;
-webkit-background-clip:padding-box;
-moz-background-clip:padding-box;
-o-background-clip:padding-box;
background-clip:padding-box;
-webkit-box-sizing:border-box;
-moz-box-sizing:border-box;
-o-box-sizing:border-box;
box-sizing:border-box;
-webkit-border-radius:4px;
-moz-border-radius:4px;
-o-border-radius:4px;
border-radius:4px;
-webkit-box-shadow:inset 1px 1px 0 rgba(255,255,255,0.5);
-moz-box-shadow:inset 1px 1px 0 rgba(255,255,255,0.5);
-o-box-shadow:inset 1px 1px 0 rgba(255,255,255,0.5);
box-shadow:inset 1px 1px 0 rgba(255,255,255,0.5);
}
/**
*
* Vertical Scrollbar
*
*/
.myScrollbarV {
position:absolute;
z-index:100;
width:8px;bottom:7px;top:2px;right:1px
}
.myScrollbarV > div {
position:absolute;
z-index:100;
width:100%;
/* The following is probably what you want to customize */
background:-webkit-gradient(linear, 0 0, 100% 0, from(#f00), to(#900));
background-image:-moz-linear-gradient(top, #f00, #900);
background-image:-o-linear-gradient(top, #f00, #900);
border:1px solid #900;
-webkit-background-clip:padding-box;
-moz-background-clip:padding-box;
-o-background-clip:padding-box;
background-clip:padding-box;
-webkit-box-sizing:border-box;
-moz-box-sizing:border-box;
-o-box-sizing:border-box;
box-sizing:border-box;
-webkit-border-radius:4px;
-moz-border-radius:4px;
-o-border-radius:4px;
border-radius:4px;
-webkit-box-shadow:inset 1px 1px 0 rgba(255,255,255,0.5);
-moz-box-shadow:inset 1px 1px 0 rgba(255,255,255,0.5);
-o-box-shadow:inset 1px 1px 0 rgba(255,255,255,0.5);
box-shadow:inset 1px 1px 0 rgba(255,255,255,0.5);
}

Beispiel

1. html+js

iScroll.js

/*!
* iScroll v4.2.5 ~ Copyright (c) 2012 Matteo Spinelli, http://cubiq.org
* Released under MIT license, http://cubiq.org/license
*/
(function(window, doc){
var m = Math,
dummyStyle = doc.createElement(&#39;div&#39;).style,
vendor = (function () {
var vendors = &#39;t,webkitT,MozT,msT,OT&#39;.split(&#39;,&#39;),
t,
i = 0,
l = vendors.length;
for ( ; i < l; i++ ) {
t = vendors[i] + &#39;ransform&#39;;
if ( t in dummyStyle ) {
return vendors[i].substr(0, vendors[i].length - 1);
}
}
return false;
})(),
cssVendor = vendor ? &#39;-&#39; + vendor.toLowerCase() + &#39;-&#39; : &#39;&#39;,
// Style properties
transform = prefixStyle(&#39;transform&#39;),
transitionProperty = prefixStyle(&#39;transitionProperty&#39;),
transitionDuration = prefixStyle(&#39;transitionDuration&#39;),
transformOrigin = prefixStyle(&#39;transformOrigin&#39;),
transitionTimingFunction = prefixStyle(&#39;transitionTimingFunction&#39;),
transitionDelay = prefixStyle(&#39;transitionDelay&#39;),
// Browser capabilities
isAndroid = (/android/gi).test(navigator.appVersion),
isIDevice = (/iphone|ipad/gi).test(navigator.appVersion),
isTouchPad = (/hp-tablet/gi).test(navigator.appVersion),
has3d = prefixStyle(&#39;perspective&#39;) in dummyStyle,
hasTouch = &#39;ontouchstart&#39; in window && !isTouchPad,
hasTransform = vendor !== false,
hasTransitionEnd = prefixStyle(&#39;transition&#39;) in dummyStyle,
RESIZE_EV = &#39;onorientationchange&#39; in window ? &#39;orientationchange&#39; : &#39;resize&#39;,
START_EV = hasTouch ? &#39;touchstart&#39; : &#39;mousedown&#39;,
MOVE_EV = hasTouch ? &#39;touchmove&#39; : &#39;mousemove&#39;,
END_EV = hasTouch ? &#39;touchend&#39; : &#39;mouseup&#39;,
CANCEL_EV = hasTouch ? &#39;touchcancel&#39; : &#39;mouseup&#39;,
TRNEND_EV = (function () {
if ( vendor === false ) return false;
var transitionEnd = {
&#39;&#39; : &#39;transitionend&#39;,
&#39;webkit&#39; : &#39;webkitTransitionEnd&#39;,
&#39;Moz&#39; : &#39;transitionend&#39;,
&#39;O&#39; : &#39;otransitionend&#39;,
&#39;ms&#39; : &#39;MSTransitionEnd&#39;
};
return transitionEnd[vendor];
})(),
nextFrame = (function() {
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(callback) { return setTimeout(callback, 1); };
})(),
cancelFrame = (function () {
return window.cancelRequestAnimationFrame ||
window.webkitCancelAnimationFrame ||
window.webkitCancelRequestAnimationFrame ||
window.mozCancelRequestAnimationFrame ||
window.oCancelRequestAnimationFrame ||
window.msCancelRequestAnimationFrame ||
clearTimeout;
})(),
// Helpers
translateZ = has3d ? &#39; translateZ(0)&#39; : &#39;&#39;,
// Constructor
iScroll = function (el, options) {
var that = this,
i;
that.wrapper = typeof el == &#39;object&#39; ? el : doc.getElementById(el);
that.wrapper.style.overflow = &#39;hidden&#39;;
that.scroller = that.wrapper.children[0];
// Default options
that.options = {
hScroll: true,
vScroll: true,
x: 0,
y: 0,
bounce: true,
bounceLock: false,
momentum: true,
lockDirection: true,
useTransform: true,
useTransition: false,
topOffset: 0,
checkDOMChanges: false, // Experimental
handleClick: true,
// Scrollbar
hScrollbar: true,
vScrollbar: true,
fixedScrollbar: isAndroid,
hideScrollbar: isIDevice,
fadeScrollbar: isIDevice && has3d,
scrollbarClass: &#39;&#39;,
// Zoom
zoom: false,
zoomMin: 1,
zoomMax: 4,
doubleTapZoom: 2,
wheelAction: &#39;scroll&#39;,
// Snap
snap: false,
snapThreshold: 1,
// Events
onRefresh: null,
onBeforeScrollStart: function (e) { e.preventDefault(); },
onScrollStart: null,
onBeforeScrollMove: null,
onScrollMove: null,
onBeforeScrollEnd: null,
onScrollEnd: null,
onTouchEnd: null,
onDestroy: null,
onZoomStart: null,
onZoom: null,
onZoomEnd: null
};
// User defined options
for (i in options) that.options[i] = options[i];
// Set starting position
that.x = that.options.x;
that.y = that.options.y;
// Normalize options
that.options.useTransform = hasTransform && that.options.useTransform;
that.options.hScrollbar = that.options.hScroll && that.options.hScrollbar;
that.options.vScrollbar = that.options.vScroll && that.options.vScrollbar;
that.options.zoom = that.options.useTransform && that.options.zoom;
that.options.useTransition = hasTransitionEnd && that.options.useTransition;
// Helpers FIX ANDROID BUG!
// translate3d and scale doesn&#39;t work together!
// Ignoring 3d ONLY WHEN YOU SET that.options.zoom
if ( that.options.zoom && isAndroid ){
translateZ = &#39;&#39;;
}
// Set some default styles
that.scroller.style[transitionProperty] = that.options.useTransform ? cssVendor + &#39;transform&#39; : &#39;top left&#39;;
that.scroller.style[transitionDuration] = &#39;0&#39;;
that.scroller.style[transformOrigin] = &#39;0 0&#39;;
if (that.options.useTransition) that.scroller.style[transitionTimingFunction] = &#39;
cubic-bezier(0.33,0.66,0.66,1)&#39;;
if (that.options.useTransform) that.scroller.style[transform] 
= &#39;translate(&#39; + that.x + &#39;px,&#39; + that.y + &#39;px)&#39; + translateZ;
else that.scroller.style.cssText += &#39;;position:absolute;top:&#39; + that.y + &#39;px;left:&#39; + that.x + &#39;px&#39;;
if (that.options.useTransition) that.options.fixedScrollbar = true;
that.refresh();
that._bind(RESIZE_EV, window);
that._bind(START_EV);
if (!hasTouch) {
if (that.options.wheelAction != &#39;none&#39;) {
that._bind(&#39;DOMMouseScroll&#39;);
that._bind(&#39;mousewheel&#39;);
}
}
if (that.options.checkDOMChanges) that.checkDOMTime = setInterval(function () {
that._checkDOMChanges();
}, 500);
};
// Prototype
iScroll.prototype = {
enabled: true,
x: 0,
y: 0,
steps: [],
scale: 1,
currPageX: 0, currPageY: 0,
pagesX: [], pagesY: [],
aniTime: null,
wheelZoomCount: 0,
handleEvent: function (e) {
var that = this;
switch(e.type) {
case START_EV:
if (!hasTouch && e.button !== 0) return;
that._start(e);
break;
case MOVE_EV: that._move(e); break;
case END_EV:
case CANCEL_EV: that._end(e); break;
case RESIZE_EV: that._resize(); break;
case &#39;DOMMouseScroll&#39;: case &#39;mousewheel&#39;: that._wheel(e); break;
case TRNEND_EV: that._transitionEnd(e); break;
}
},
_checkDOMChanges: function () {
if (this.moved || this.zoomed || this.animating ||
(this.scrollerW == this.scroller.offsetWidth 
* this.scale && this.scrollerH == this.scroller.offsetHeight * this.scale)) return;
this.refresh();
},
_scrollbar: function (dir) {
var that = this,
bar;
if (!that[dir + &#39;Scrollbar&#39;]) {
if (that[dir + &#39;ScrollbarWrapper&#39;]) {
if (hasTransform) that[dir + &#39;ScrollbarIndicator&#39;].style[transform] = &#39;&#39;;
that[dir + &#39;ScrollbarWrapper&#39;].parentNode.removeChild(that[dir + &#39;ScrollbarWrapper&#39;]);
that[dir + &#39;ScrollbarWrapper&#39;] = null;
that[dir + &#39;ScrollbarIndicator&#39;] = null;
}
return;
}
if (!that[dir + &#39;ScrollbarWrapper&#39;]) {
// Create the scrollbar wrapper
bar = doc.createElement(&#39;div&#39;);
if (that.options.scrollbarClass) bar.className = that.options.scrollbarClass + dir.toUpperCase();
else bar.style.cssText = &#39;position:absolute;z-index:100;&#39; + (dir == &#39;h&#39; ? &#39;height:7px;bottom:1px;
left:2px;right:&#39; + (that.vScrollbar ? &#39;7&#39; : &#39;2&#39;) + &#39;px&#39; : &#39;width:7px;bottom:&#39; + 
(that.hScrollbar ? &#39;7&#39; : &#39;2&#39;) + &#39;px;top:2px;right:1px&#39;);
bar.style.cssText += &#39;;pointer-events:none;&#39; + cssVendor + &#39;transition-property:opacity;&#39; + 
cssVendor + &#39;transition-duration:&#39; + (that.options.fadeScrollbar ? &#39;350ms&#39; : &#39;0&#39;) + &#39;;
overflow:hidden;opacity:&#39; + (that.options.hideScrollbar ? &#39;0&#39; : &#39;1&#39;);
that.wrapper.appendChild(bar);
that[dir + &#39;ScrollbarWrapper&#39;] = bar;
// Create the scrollbar indicator
bar = doc.createElement(&#39;div&#39;);
if (!that.options.scrollbarClass) {
bar.style.cssText = &#39;position:absolute;z-index:100;background:rgba(0,0,0,0.5);
border:1px solid rgba(255,255,255,0.9);&#39; + cssVendor + &#39;background-clip:padding-box;&#39; + cssVendor + 
&#39;box-sizing:border-box;&#39; + (dir == &#39;h&#39; ? &#39;height:100%&#39; : &#39;width:100%&#39;) + &#39;;&#39; +
 cssVendor + &#39;border-radius:3px;border-radius:3px&#39;;
}
bar.style.cssText += &#39;;pointer-events:none;&#39; + cssVendor + &#39;transition-property:&#39; +
 cssVendor + &#39;transform;&#39; + cssVendor + &#39;transition-timing-function:cubic-bezier(0.33,0.66,0.66,1);&#39;
  + cssVendor + &#39;transition-duration:0;&#39; + cssVendor + &#39;transform: translate(0,0)&#39; + translateZ;
if (that.options.useTransition)
 bar.style.cssText += &#39;;&#39; + cssVendor + &#39;transition-timing-function:cubic-bezier(0.33,0.66,0.66,1)&#39;;
that[dir + &#39;ScrollbarWrapper&#39;].appendChild(bar);
that[dir + &#39;ScrollbarIndicator&#39;] = bar;
}
if (dir == &#39;h&#39;) {
that.hScrollbarSize = that.hScrollbarWrapper.clientWidth;
that.hScrollbarIndicatorSize = m.max(m.round(that.hScrollbarSize * that.hScrollbarSize / that.scrollerW), 8);
that.hScrollbarIndicator.style.width = that.hScrollbarIndicatorSize + &#39;px&#39;;
that.hScrollbarMaxScroll = that.hScrollbarSize - that.hScrollbarIndicatorSize;
that.hScrollbarProp = that.hScrollbarMaxScroll / that.maxScrollX;
} else {
that.vScrollbarSize = that.vScrollbarWrapper.clientHeight;
that.vScrollbarIndicatorSize = m.max(m.round(that.vScrollbarSize * that.vScrollbarSize / that.scrollerH), 8);
that.vScrollbarIndicator.style.height = that.vScrollbarIndicatorSize + &#39;px&#39;;
that.vScrollbarMaxScroll = that.vScrollbarSize - that.vScrollbarIndicatorSize;
that.vScrollbarProp = that.vScrollbarMaxScroll / that.maxScrollY;
}
// Reset position
that._scrollbarPos(dir, true);
},
_resize: function () {
var that = this;
setTimeout(function () { that.refresh(); }, isAndroid ? 200 : 0);
},
_pos: function (x, y) {
if (this.zoomed) return;
x = this.hScroll ? x : 0;
y = this.vScroll ? y : 0;
if (this.options.useTransform) {
this.scroller.style[transform] = &#39;translate(&#39; + x + &#39;px,&#39; + y + &#39;px) scale(&#39; + this.scale + &#39;)&#39; + translateZ;
} else {
x = m.round(x);
y = m.round(y);
this.scroller.style.left = x + &#39;px&#39;;
this.scroller.style.top = y + &#39;px&#39;;
}
this.x = x;
this.y = y;
this._scrollbarPos(&#39;h&#39;);
this._scrollbarPos(&#39;v&#39;);
},
_scrollbarPos: function (dir, hidden) {
var that = this,
pos = dir == &#39;h&#39; ? that.x : that.y,
size;
if (!that[dir + &#39;Scrollbar&#39;]) return;
pos = that[dir + &#39;ScrollbarProp&#39;] * pos;
if (pos < 0) {
if (!that.options.fixedScrollbar) {
size = that[dir + &#39;ScrollbarIndicatorSize&#39;] + m.round(pos * 3);
if (size < 8) size = 8;
that[dir + &#39;ScrollbarIndicator&#39;].style[dir == &#39;h&#39; ? &#39;width&#39; : &#39;height&#39;] = size + &#39;px&#39;;
}
pos = 0;
} else if (pos > that[dir + &#39;ScrollbarMaxScroll&#39;]) {
if (!that.options.fixedScrollbar) {
size = that[dir + &#39;ScrollbarIndicatorSize&#39;] - m.round((pos - that[dir + &#39;ScrollbarMaxScroll&#39;]) * 3);
if (size < 8) size = 8;
that[dir + &#39;ScrollbarIndicator&#39;].style[dir == &#39;h&#39; ? &#39;width&#39; : &#39;height&#39;] = size + &#39;px&#39;;
pos = that[dir + &#39;ScrollbarMaxScroll&#39;] + (that[dir + &#39;ScrollbarIndicatorSize&#39;] - size);
} else {
pos = that[dir + &#39;ScrollbarMaxScroll&#39;];
}
}
that[dir + &#39;ScrollbarWrapper&#39;].style[transitionDelay] = &#39;0&#39;;
that[dir + &#39;ScrollbarWrapper&#39;].style.opacity = hidden && that.options.hideScrollbar ? &#39;0&#39; : &#39;1&#39;;
that[dir + &#39;ScrollbarIndicator&#39;].style[transform] 
= &#39;translate(&#39; + (dir == &#39;h&#39; ? pos + &#39;px,0)&#39; : &#39;0,&#39; + pos + &#39;px)&#39;) + translateZ;
},
_start: function (e) {
var that = this,
point = hasTouch ? e.touches[0] : e,
matrix, x, y,
c1, c2;
if (!that.enabled) return;
if (that.options.onBeforeScrollStart) that.options.onBeforeScrollStart.call(that, e);
if (that.options.useTransition || that.options.zoom) that._transitionTime(0);
that.moved = false;
that.animating = false;
that.zoomed = false;
that.distX = 0;
that.distY = 0;
that.absDistX = 0;
that.absDistY = 0;
that.dirX = 0;
that.dirY = 0;
// Gesture start
if (that.options.zoom && hasTouch && e.touches.length > 1) {
c1 = m.abs(e.touches[0].pageX-e.touches[1].pageX);
c2 = m.abs(e.touches[0].pageY-e.touches[1].pageY);
that.touchesDistStart = m.sqrt(c1 * c1 + c2 * c2);
that.originX = m.abs(e.touches[0].pageX + e.touches[1].pageX - that.wrapperOffsetLeft * 2) / 2 - that.x;
that.originY = m.abs(e.touches[0].pageY + e.touches[1].pageY - that.wrapperOffsetTop * 2) / 2 - that.y;
if (that.options.onZoomStart) that.options.onZoomStart.call(that, e);
}
if (that.options.momentum) {
if (that.options.useTransform) {
// Very lame general purpose alternative to CSSMatrix
matrix = getComputedStyle(that.scroller, null)[transform].replace(/[^0-9\-.,]/g, &#39;&#39;).split(&#39;,&#39;);
x = +(matrix[12] || matrix[4]);
y = +(matrix[13] || matrix[5]);
} else {
x = +getComputedStyle(that.scroller, null).left.replace(/[^0-9-]/g, &#39;&#39;);
y = +getComputedStyle(that.scroller, null).top.replace(/[^0-9-]/g, &#39;&#39;);
}
if (x != that.x || y != that.y) {
if (that.options.useTransition) that._unbind(TRNEND_EV);
else cancelFrame(that.aniTime);
that.steps = [];
that._pos(x, y);
if (that.options.onScrollEnd) that.options.onScrollEnd.call(that);
}
}
that.absStartX = that.x; // Needed by snap threshold
that.absStartY = that.y;
that.startX = that.x;
that.startY = that.y;
that.pointX = point.pageX;
that.pointY = point.pageY;
that.startTime = e.timeStamp || Date.now();
if (that.options.onScrollStart) that.options.onScrollStart.call(that, e);
that._bind(MOVE_EV, window);
that._bind(END_EV, window);
that._bind(CANCEL_EV, window);
},
_move: function (e) {
var that = this,
point = hasTouch ? e.touches[0] : e,
deltaX = point.pageX - that.pointX,
deltaY = point.pageY - that.pointY,
newX = that.x + deltaX,
newY = that.y + deltaY,
c1, c2, scale,
timestamp = e.timeStamp || Date.now();
if (that.options.onBeforeScrollMove) that.options.onBeforeScrollMove.call(that, e);
// Zoom
if (that.options.zoom && hasTouch && e.touches.length > 1) {
c1 = m.abs(e.touches[0].pageX - e.touches[1].pageX);
c2 = m.abs(e.touches[0].pageY - e.touches[1].pageY);
that.touchesDist = m.sqrt(c1*c1+c2*c2);
that.zoomed = true;
scale = 1 / that.touchesDistStart * that.touchesDist * this.scale;
if (scale < that.options.zoomMin) scale = 0.5 * that.options.zoomMin * Math.pow(2.0, 
scale / that.options.zoomMin);
else if (scale > that.options.zoomMax) scale = 2.0 * that.options.zoomMax * 
Math.pow(0.5, that.options.zoomMax / scale);
that.lastScale = scale / this.scale;
newX = this.originX - this.originX * that.lastScale + this.x,
newY = this.originY - this.originY * that.lastScale + this.y;
this.scroller.style[transform] = &#39;translate(&#39; + newX + &#39;px,&#39; + newY + &#39;px) scale(&#39; + scale + &#39;)&#39; + translateZ;
if (that.options.onZoom) that.options.onZoom.call(that, e);
return;
}
that.pointX = point.pageX;
that.pointY = point.pageY;
// Slow down if outside of the boundaries
if (newX > 0 || newX < that.maxScrollX) {
newX = that.options.bounce ? that.x + (deltaX / 2) : newX >= 0 || that.maxScrollX >= 0 ? 0 : that.maxScrollX;
}
if (newY > that.minScrollY || newY < that.maxScrollY) {
newY = that.options.bounce ? that.y + (deltaY / 2) : newY >= that.minScrollY || that.maxScrollY >= 0 ? 
that.minScrollY : that.maxScrollY;
}
that.distX += deltaX;
that.distY += deltaY;
that.absDistX = m.abs(that.distX);
that.absDistY = m.abs(that.distY);
if (that.absDistX < 6 && that.absDistY < 6) {
return;
}
// Lock direction
if (that.options.lockDirection) {
if (that.absDistX > that.absDistY + 5) {
newY = that.y;
deltaY = 0;
} else if (that.absDistY > that.absDistX + 5) {
newX = that.x;
deltaX = 0;
}
}
that.moved = true;
that._pos(newX, newY);
that.dirX = deltaX > 0 ? -1 : deltaX < 0 ? 1 : 0;
that.dirY = deltaY > 0 ? -1 : deltaY < 0 ? 1 : 0;
if (timestamp - that.startTime > 300) {
that.startTime = timestamp;
that.startX = that.x;
that.startY = that.y;
}
if (that.options.onScrollMove) that.options.onScrollMove.call(that, e);
},
_end: function (e) {
if (hasTouch && e.touches.length !== 0) return;
var that = this,
point = hasTouch ? e.changedTouches[0] : e,
target, ev,
momentumX = { dist:0, time:0 },
momentumY = { dist:0, time:0 },
duration = (e.timeStamp || Date.now()) - that.startTime,
newPosX = that.x,
newPosY = that.y,
distX, distY,
newDuration,
snap,
scale;
that._unbind(MOVE_EV, window);
that._unbind(END_EV, window);
that._unbind(CANCEL_EV, window);
if (that.options.onBeforeScrollEnd) that.options.onBeforeScrollEnd.call(that, e);
if (that.zoomed) {
scale = that.scale * that.lastScale;
scale = Math.max(that.options.zoomMin, scale);
scale = Math.min(that.options.zoomMax, scale);
that.lastScale = scale / that.scale;
that.scale = scale;
that.x = that.originX - that.originX * that.lastScale + that.x;
that.y = that.originY - that.originY * that.lastScale + that.y;
that.scroller.style[transitionDuration] = &#39;200ms&#39;;
that.scroller.style[transform] = &#39;translate(&#39; + that.x + &#39;px,&#39; + that.y + &#39;px) 
scale(&#39; + that.scale + &#39;)&#39; + translateZ;
that.zoomed = false;
that.refresh();
if (that.options.onZoomEnd) that.options.onZoomEnd.call(that, e);
return;
}
if (!that.moved) {
if (hasTouch) {
if (that.doubleTapTimer && that.options.zoom) {
// Double tapped
clearTimeout(that.doubleTapTimer);
that.doubleTapTimer = null;
if (that.options.onZoomStart) that.options.onZoomStart.call(that, e);
that.zoom(that.pointX, that.pointY, that.scale == 1 ? that.options.doubleTapZoom : 1);
if (that.options.onZoomEnd) {
setTimeout(function() {
that.options.onZoomEnd.call(that, e);
}, 200); // 200 is default zoom duration
}
} else if (this.options.handleClick) {
that.doubleTapTimer = setTimeout(function () {
that.doubleTapTimer = null;
// Find the last touched element
target = point.target;
while (target.nodeType != 1) target = target.parentNode;
if (target.tagName != &#39;SELECT&#39; && target.tagName != &#39;INPUT&#39; && target.tagName != &#39;TEXTAREA&#39;) {
ev = doc.createEvent(&#39;MouseEvents&#39;);
ev.initMouseEvent(&#39;click&#39;, true, true, e.view, 1,
point.screenX, point.screenY, point.clientX, point.clientY,
e.ctrlKey, e.altKey, e.shiftKey, e.metaKey,
0, null);
ev._fake = true;
target.dispatchEvent(ev);
}
}, that.options.zoom ? 250 : 0);
}
}
that._resetPos(400);
if (that.options.onTouchEnd) that.options.onTouchEnd.call(that, e);
return;
}
if (duration < 300 && that.options.momentum) {
momentumX = newPosX ? that._momentum(newPosX - that.startX, duration, -that.x,
 that.scrollerW - that.wrapperW + that.x, that.options.bounce ? that.wrapperW : 0) : momentumX;
momentumY = newPosY ? that._momentum(newPosY - that.startY, duration, -that.y, 
(that.maxScrollY < 0 ? that.scrollerH - that.wrapperH + that.y - that.minScrollY : 0), that.options.bounce ? 
that.wrapperH : 0) : momentumY;
newPosX = that.x + momentumX.dist;
newPosY = that.y + momentumY.dist;
if ((that.x > 0 && newPosX > 0) || (that.x < that.maxScrollX && newPosX < that.maxScrollX))
 momentumX = { dist:0, time:0 };
if ((that.y > that.minScrollY && newPosY > that.minScrollY) || (that.y < that.maxScrollY && newPosY 
< that.maxScrollY)) momentumY = { dist:0, time:0 };
}
if (momentumX.dist || momentumY.dist) {
newDuration = m.max(m.max(momentumX.time, momentumY.time), 10);
// Do we need to snap?
if (that.options.snap) {
distX = newPosX - that.absStartX;
distY = newPosY - that.absStartY;
if (m.abs(distX) < that.options.snapThreshold && m.abs(distY) < that.options.snapThreshold) 
{ that.scrollTo(that.absStartX, that.absStartY, 200); }
else {
snap = that._snap(newPosX, newPosY);
newPosX = snap.x;
newPosY = snap.y;
newDuration = m.max(snap.time, newDuration);
}
}
that.scrollTo(m.round(newPosX), m.round(newPosY), newDuration);
if (that.options.onTouchEnd) that.options.onTouchEnd.call(that, e);
return;
}
// Do we need to snap?
if (that.options.snap) {
distX = newPosX - that.absStartX;
distY = newPosY - that.absStartY;
if (m.abs(distX) < that.options.snapThreshold && m.abs(distY) < that.options.snapThreshold) 
that.scrollTo(that.absStartX, that.absStartY, 200);
else {
snap = that._snap(that.x, that.y);
if (snap.x != that.x || snap.y != that.y) that.scrollTo(snap.x, snap.y, snap.time);
}
if (that.options.onTouchEnd) that.options.onTouchEnd.call(that, e);
return;
}
that._resetPos(200);
if (that.options.onTouchEnd) that.options.onTouchEnd.call(that, e);
},
_resetPos: function (time) {
var that = this,
resetX = that.x >= 0 ? 0 : that.x < that.maxScrollX ? that.maxScrollX : that.x,
resetY = that.y >= that.minScrollY || that.maxScrollY > 0 ? that.minScrollY : that.y 
< that.maxScrollY ? that.maxScrollY : that.y;
if (resetX == that.x && resetY == that.y) {
if (that.moved) {
that.moved = false;
if (that.options.onScrollEnd) that.options.onScrollEnd.call(that); // Execute custom code on scroll end
}
if (that.hScrollbar && that.options.hideScrollbar) {
if (vendor == &#39;webkit&#39;) that.hScrollbarWrapper.style[transitionDelay] = &#39;300ms&#39;;
that.hScrollbarWrapper.style.opacity = &#39;0&#39;;
}
if (that.vScrollbar && that.options.hideScrollbar) {
if (vendor == &#39;webkit&#39;) that.vScrollbarWrapper.style[transitionDelay] = &#39;300ms&#39;;
that.vScrollbarWrapper.style.opacity = &#39;0&#39;;
}
return;
}
that.scrollTo(resetX, resetY, time || 0);
},
_wheel: function (e) {
var that = this,
wheelDeltaX, wheelDeltaY,
deltaX, deltaY,
deltaScale;
if (&#39;wheelDeltaX&#39; in e) {
wheelDeltaX = e.wheelDeltaX / 12;
wheelDeltaY = e.wheelDeltaY / 12;
} else if(&#39;wheelDelta&#39; in e) {
wheelDeltaX = wheelDeltaY = e.wheelDelta / 12;
} else if (&#39;detail&#39; in e) {
wheelDeltaX = wheelDeltaY = -e.detail * 3;
} else {
return;
}
if (that.options.wheelAction == &#39;zoom&#39;) {
deltaScale = that.scale * Math.pow(2, 1/3 * (wheelDeltaY ? wheelDeltaY / Math.abs(wheelDeltaY) : 0));
if (deltaScale < that.options.zoomMin) deltaScale = that.options.zoomMin;
if (deltaScale > that.options.zoomMax) deltaScale = that.options.zoomMax;
if (deltaScale != that.scale) {
if (!that.wheelZoomCount && that.options.onZoomStart) that.options.onZoomStart.call(that, e);
that.wheelZoomCount++;
that.zoom(e.pageX, e.pageY, deltaScale, 400);
setTimeout(function() {
that.wheelZoomCount--;
if (!that.wheelZoomCount && that.options.onZoomEnd) that.options.onZoomEnd.call(that, e);
}, 400);
}
return;
}
deltaX = that.x + wheelDeltaX;
deltaY = that.y + wheelDeltaY;
if (deltaX > 0) deltaX = 0;
else if (deltaX < that.maxScrollX) deltaX = that.maxScrollX;
if (deltaY > that.minScrollY) deltaY = that.minScrollY;
else if (deltaY < that.maxScrollY) deltaY = that.maxScrollY;
if (that.maxScrollY < 0) {
that.scrollTo(deltaX, deltaY, 0);
}
},
_transitionEnd: function (e) {
var that = this;
if (e.target != that.scroller) return;
that._unbind(TRNEND_EV);
that._startAni();
},
/**
*
* Utilities
*
*/
_startAni: function () {
var that = this,
startX = that.x, startY = that.y,
startTime = Date.now(),
step, easeOut,
animate;
if (that.animating) return;
if (!that.steps.length) {
that._resetPos(400);
return;
}
step = that.steps.shift();
if (step.x == startX && step.y == startY) step.time = 0;
that.animating = true;
that.moved = true;
if (that.options.useTransition) {
that._transitionTime(step.time);
that._pos(step.x, step.y);
that.animating = false;
if (step.time) that._bind(TRNEND_EV);
else that._resetPos(0);
return;
}
animate = function () {
var now = Date.now(),
newX, newY;
if (now >= startTime + step.time) {
that._pos(step.x, step.y);
that.animating = false;
if (that.options.onAnimationEnd) that.options.onAnimationEnd.call(that); 
// Execute custom code on animation end
that._startAni();
return;
}
now = (now - startTime) / step.time - 1;
easeOut = m.sqrt(1 - now * now);
newX = (step.x - startX) * easeOut + startX;
newY = (step.y - startY) * easeOut + startY;
that._pos(newX, newY);
if (that.animating) that.aniTime = nextFrame(animate);
};
animate();
},
_transitionTime: function (time) {
time += &#39;ms&#39;;
this.scroller.style[transitionDuration] = time;
if (this.hScrollbar) this.hScrollbarIndicator.style[transitionDuration] = time;
if (this.vScrollbar) this.vScrollbarIndicator.style[transitionDuration] = time;
},
_momentum: function (dist, time, maxDistUpper, maxDistLower, size) {
var deceleration = 0.0006,
speed = m.abs(dist) / time,
newDist = (speed * speed) / (2 * deceleration),
newTime = 0, outsideDist = 0;
// Proportinally reduce speed if we are outside of the boundaries
if (dist > 0 && newDist > maxDistUpper) {
outsideDist = size / (6 / (newDist / speed * deceleration));
maxDistUpper = maxDistUpper + outsideDist;
speed = speed * maxDistUpper / newDist;
newDist = maxDistUpper;
} else if (dist < 0 && newDist > maxDistLower) {
outsideDist = size / (6 / (newDist / speed * deceleration));
maxDistLower = maxDistLower + outsideDist;
speed = speed * maxDistLower / newDist;
newDist = maxDistLower;
}
newDist = newDist * (dist < 0 ? -1 : 1);
newTime = speed / deceleration;
return { dist: newDist, time: m.round(newTime) };
},
_offset: function (el) {
var left = -el.offsetLeft,
top = -el.offsetTop;
while (el = el.offsetParent) {
left -= el.offsetLeft;
top -= el.offsetTop;
}
if (el != this.wrapper) {
left *= this.scale;
top *= this.scale;
}
return { left: left, top: top };
},
_snap: function (x, y) {
var that = this,
i, l,
page, time,
sizeX, sizeY;
// Check page X
page = that.pagesX.length - 1;
for (i=0, l=that.pagesX.length; i<l; i++) {
if (x >= that.pagesX[i]) {
page = i;
break;
}
}
if (page == that.currPageX && page > 0 && that.dirX < 0) page--;
x = that.pagesX
<div class="pagenum tc">当前1/5页 <strong>1</strong>
<a href="80039_2.htm">2</a>
<a href="80039_3.htm">3</a>
<a href="80039_4.htm">4</a>
<a href="80039_5.htm">5</a>
<a href="80039_2.htm">下一页</a>
<a href="80039_all.htm">阅读全文</a>
</div>


Das Obige ist die mobile jQuery iScroll.js Bildlaufleisten-Verschönerungs-Plug-in Nr. 1/ 5 Seiten mit _jquery-Inhalten Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
JavaScripts Rolle: das Web interaktiv und dynamisch machenJavaScripts Rolle: das Web interaktiv und dynamisch machenApr 24, 2025 am 12:12 AM

JavaScript ist das Herzstück moderner Websites, da es die Interaktivität und Dynamik von Webseiten verbessert. 1) Es ermöglicht die Änderung von Inhalten, ohne die Seite zu aktualisieren, 2) Webseiten durch DOMAPI zu manipulieren, 3) Komplexe interaktive Effekte wie Animation und Drag & Drop, 4) die Leistung und Best Practices optimieren, um die Benutzererfahrung zu verbessern.

C und JavaScript: Die Verbindung erklärteC und JavaScript: Die Verbindung erklärteApr 23, 2025 am 12:07 AM

C und JavaScript erreichen die Interoperabilität durch WebAssembly. 1) C -Code wird in das WebAssembly -Modul zusammengestellt und in die JavaScript -Umgebung eingeführt, um die Rechenleistung zu verbessern. 2) In der Spieleentwicklung kümmert sich C über Physik -Engines und Grafikwiedergabe, und JavaScript ist für die Spiellogik und die Benutzeroberfläche verantwortlich.

Von Websites zu Apps: Die verschiedenen Anwendungen von JavaScriptVon Websites zu Apps: Die verschiedenen Anwendungen von JavaScriptApr 22, 2025 am 12:02 AM

JavaScript wird in Websites, mobilen Anwendungen, Desktop-Anwendungen und serverseitigen Programmierungen häufig verwendet. 1) In der Website -Entwicklung betreibt JavaScript DOM zusammen mit HTML und CSS, um dynamische Effekte zu erzielen und Frameworks wie JQuery und React zu unterstützen. 2) Durch reaktnatives und ionisches JavaScript wird ein plattformübergreifendes mobile Anwendungen entwickelt. 3) Mit dem Elektronenframework können JavaScript Desktop -Anwendungen erstellen. 4) Node.js ermöglicht es JavaScript, auf der Serverseite auszuführen und unterstützt hohe gleichzeitige Anforderungen.

Python gegen JavaScript: Anwendungsfälle und Anwendungen verglichenPython gegen JavaScript: Anwendungsfälle und Anwendungen verglichenApr 21, 2025 am 12:01 AM

Python eignet sich besser für Datenwissenschaft und Automatisierung, während JavaScript besser für die Entwicklung von Front-End- und Vollstapel geeignet ist. 1. Python funktioniert in Datenwissenschaft und maschinellem Lernen gut und unter Verwendung von Bibliotheken wie Numpy und Pandas für die Datenverarbeitung und -modellierung. 2. Python ist prägnant und effizient in der Automatisierung und Skripten. 3. JavaScript ist in der Front-End-Entwicklung unverzichtbar und wird verwendet, um dynamische Webseiten und einseitige Anwendungen zu erstellen. 4. JavaScript spielt eine Rolle bei der Back-End-Entwicklung durch Node.js und unterstützt die Entwicklung der Vollstapel.

Die Rolle von C/C bei JavaScript -Dolmetschern und CompilernDie Rolle von C/C bei JavaScript -Dolmetschern und CompilernApr 20, 2025 am 12:01 AM

C und C spielen eine wichtige Rolle in der JavaScript -Engine, die hauptsächlich zur Implementierung von Dolmetschern und JIT -Compilern verwendet wird. 1) C wird verwendet, um JavaScript -Quellcode zu analysieren und einen abstrakten Syntaxbaum zu generieren. 2) C ist für die Generierung und Ausführung von Bytecode verantwortlich. 3) C implementiert den JIT-Compiler, optimiert und kompiliert Hot-Spot-Code zur Laufzeit und verbessert die Ausführungseffizienz von JavaScript erheblich.

JavaScript in Aktion: Beispiele und Projekte in realer WeltJavaScript in Aktion: Beispiele und Projekte in realer WeltApr 19, 2025 am 12:13 AM

Die Anwendung von JavaScript in der realen Welt umfasst Front-End- und Back-End-Entwicklung. 1) Zeigen Sie Front-End-Anwendungen an, indem Sie eine TODO-Listanwendung erstellen, die DOM-Operationen und Ereignisverarbeitung umfasst. 2) Erstellen Sie RESTFUFFUPI über Node.js und express, um Back-End-Anwendungen zu demonstrieren.

JavaScript und das Web: Kernfunktionalität und AnwendungsfälleJavaScript und das Web: Kernfunktionalität und AnwendungsfälleApr 18, 2025 am 12:19 AM

Zu den Hauptanwendungen von JavaScript in der Webentwicklung gehören die Interaktion der Clients, die Formüberprüfung und die asynchrone Kommunikation. 1) Dynamisches Inhaltsaktualisierung und Benutzerinteraktion durch DOM -Operationen; 2) Die Kundenüberprüfung erfolgt vor dem Einreichung von Daten, um die Benutzererfahrung zu verbessern. 3) Die Aktualisierung der Kommunikation mit dem Server wird durch AJAX -Technologie erreicht.

Verständnis der JavaScript -Engine: ImplementierungsdetailsVerständnis der JavaScript -Engine: ImplementierungsdetailsApr 17, 2025 am 12:05 AM

Es ist für Entwickler wichtig, zu verstehen, wie die JavaScript -Engine intern funktioniert, da sie effizientere Code schreibt und Leistungs Engpässe und Optimierungsstrategien verstehen kann. 1) Der Workflow der Engine umfasst drei Phasen: Parsen, Kompilieren und Ausführung; 2) Während des Ausführungsprozesses führt die Engine dynamische Optimierung durch, wie z. B. Inline -Cache und versteckte Klassen. 3) Zu Best Practices gehören die Vermeidung globaler Variablen, die Optimierung von Schleifen, die Verwendung von const und lass und die Vermeidung übermäßiger Verwendung von Schließungen.

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

SublimeText3 Englische Version

SublimeText3 Englische Version

Empfohlen: Win-Version, unterstützt Code-Eingabeaufforderungen!

SublimeText3 Linux neue Version

SublimeText3 Linux neue Version

SublimeText3 Linux neueste Version

WebStorm-Mac-Version

WebStorm-Mac-Version

Nützliche JavaScript-Entwicklungstools

mPDF

mPDF

mPDF ist eine PHP-Bibliothek, die PDF-Dateien aus UTF-8-codiertem HTML generieren kann. Der ursprüngliche Autor, Ian Back, hat mPDF geschrieben, um PDF-Dateien „on the fly“ von seiner Website auszugeben und verschiedene Sprachen zu verarbeiten. Es ist langsamer und erzeugt bei der Verwendung von Unicode-Schriftarten größere Dateien als Originalskripte wie HTML2FPDF, unterstützt aber CSS-Stile usw. und verfügt über viele Verbesserungen. Unterstützt fast alle Sprachen, einschließlich RTL (Arabisch und Hebräisch) und CJK (Chinesisch, Japanisch und Koreanisch). Unterstützt verschachtelte Elemente auf Blockebene (wie P, DIV),