2017-08-17 5 views
2

Wenn Sie versuchen, die Standard-Icons eines jQuery Mobile zu verwenden, um eine schöne Rotationsanimation zu erhalten, wenn das reduzierbare Objekt ausgeblendet oder erweitert ist, aber ein seltsames Ergebnis erzielt wird, wird der gesamte reduzierbare Titel in der Überschrift gedreht.Wie animiert man das Symbol einer faltbaren Überschrift von jQuery Mobile?

In meiner idealen Lösung möchte ich einfach die vordefinierten jQM-Symbolklassen verwenden, ohne dass ich dafür extra einen zusätzlichen Stil hinzufügen muss.

Beispiel: icon-carat-u und icon-carat-d drehen sich um 180 Grad, so dass sie animieren, wenn das kollabierbare Bild expandiert bzw. kollabiert.

Darüber hinaus versuche ich, das Ereignis click zu vermeiden, weil das zusammenklappbare Symbol animiert werden sollte, auch wenn ich Code collapsible("expand") oder verwende.

Hier ist mein Code:

.ui-icon-carat-d { 
 
    transform: rotate(-180deg); 
 
    transition: .3s; 
 
} 
 
.ui-icon-carat-u { 
 
    transform: rotate(0deg); 
 
    transition: .3s; 
 
}
<!DOCTYPE html> 
 
<html> 
 
<head> 
 
    <meta charset="utf-8"> 
 
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> 
 
    <link rel="stylesheet" href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.css"> 
 
    <script src="https://code.jquery.com/jquery-1.11.2.min.js"></script> 
 
    <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script> 
 
</head> 
 

 
<body> 
 
    <div data-role="page" id="page-one"> 
 
    <div data-role="content"> 
 
     <div data-role="collapsible" data-collapsed-icon="carat-d" data-expanded-icon="carat-u"> 
 
     <h4>Heading</h4> 
 
     <p>I'm the collapsible content. By default I'm closed, but you can click the header to open me.</p> 
 
     </div> 
 
    </div> 
 
    </div> 
 
</body> 
 

 
</html>

Wie kann ich die Standard Karat Symbole drehen, um eine schöne glatte Animation in einer jQuery Mobile zusammenklappbar Überschrift zu bekommen?

Antwort

3

Das erste, was zuerst ist - der Grund, warum die gesamte Bar in Ihrem Code und nicht nur das Caret dreht, ist, dass .ui-icon-carat-d und .ui-icon-carat-u Klassen auf der Bar selbst sind. Das Caret-Symbol befindet sich in einer dieser Leiste.

Mit dem gesagt, ich werde vorweg damit sagen, dass dies keine schöne Lösung ist, aber es ist dennoch eine Lösung.

Um zu verstehen, warum dies nicht einfacher sein kann, müssen Sie erkennen, was im jQuery Mobile Stylesheet für dieses Caret passiert. Im Wesentlichen sind der Caret UND der Upside-Down-Caret getrennte, nicht verwandte SVG-Icons, die als CSS-codierte Hintergrundbilder ausgelagert werden.

Aus diesem Grund kann diese Änderung nicht so wie sie ist animiert werden - der Browser weiß nichts über diese Bilder, und es kann sicherlich keine clevere Animation zwischen ihnen machen.

So, meine Lösung beginnt mit dem Kopieren/Einfügen des SVG Hintergrund-Bildes, das die „normale“ caret von jQuery Mobile Styles, und zwingt sie stellt auch für den Upside-Down-Zustand zu zeigen, so dass wir animieren es auf eine traditionelle Art und Weise.

Als solche ich Targeting das Element mit dem Caret-Symbol (ein ::after pseudo-Klasse), die regelmäßige caret SVG background-image, um es der Anwendung, und zwingt sie auf diesem Bild für beide Zustände des Knebels zu halten (mit ein !important).

Dann, wenn jQuery Mobile fügt die .ui-icon-carat-u Klasse (upside-down), das Bild ändert sich nicht mehr, und wir einfach drehen Sie das Symbol 180 Grad mit einer transform und animieren, dass mit einem transition.

Hoffe, das hilft! Testen Sie es unten.

.ui-collapsible-heading-toggle::after { 
 
    background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20style%3D%22fill%3A%23FFFFFF%3B%22%20points%3D%2211.949%2C3.404%207%2C8.354%202.05%2C3.404%20-0.071%2C5.525%207%2C12.596%2014.07%2C5.525%20%22%2F%3E%3C%2Fsvg%3E") !important; 
 
    transition: transform .3s; 
 
} 
 

 
.ui-icon-carat-u::after { 
 
    transform: rotate(-90deg); 
 
}
<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 
    <meta charset="utf-8"> 
 
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> 
 
    <link rel="stylesheet" href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.css"> 
 
    <script src="https://code.jquery.com/jquery-1.11.2.min.js"></script> 
 
    <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script> 
 
</head> 
 

 
<body> 
 
    <div data-role="page" id="page-one"> 
 
    <div data-role="content"> 
 
     <div data-role="collapsible" data-collapsed-icon="carat-d" data-expanded-icon="carat-u"> 
 
     <h4>Heading</h4> 
 
     <p>I'm the collapsible content. By default I'm closed, but you can click the header to open me.</p> 
 
     </div> 
 
    </div> 
 
    </div> 
 
</body> 
 

 
</html>

+0

Ich verwende eigentlich diese CSS .'ui-icon-Karat-d :: after { verwandeln: drehen (-180deg); Übergang: .5s; } .ui-icon-carat-u :: nach { transform: rotieren (180deg); Übergang: .5s; } 'und es dreht sich gut, aber weil ich ein Newbe in CSS-Transformationen und Übergängen bin, kann ich noch nicht verstehen, warum es nicht möglich ist, nur eine halbe Kreisumdrehung zu machen. Ich glaube, ich muss dieses Thema vertiefen, um Ihren Satz vollständig zu verstehen. "Der Browser kann sicherlich keine clevere Animation zwischen zwei getrennten, nicht verwandten Icons machen". Mein Fehler. Irgendwelche Vorschläge dazu? – deblocker

+0

@deblocker Ich habe meinen Code so angepasst, dass er je nach Kommentar eine Halbkreisrotation ausführt. Der Grund, warum dies nicht mit den standardmäßigen jQuery Mobile-Stilen möglich ist, ist, dass sich das Caret NICHT über CSS dreht - das Symbol wird durch ein anderes Bild ersetzt. In CSS gibt es leider keine Möglichkeit, zwischen zwei Hintergrundbildern zu wechseln. In meinem Beispiel zwinge ich das Bild also dazu, die ganze Zeit auf der ersten, regelmäßigen Einfügemarke zu bleiben. –

Verwandte Themen