2017-08-17 15 views
2

jQuery Mobileの標準アイコンを使用して折り畳みが折りたたまれたり、展開されたときにすばらしい回転アニメーションを得ようとしましたが、奇妙な結果が表示された場合、見出しの折りたたみタイトル全体が回転します。jQuery Mobile折りたたみ見出しのアイコンをアニメーション化する方法は?

私の理想的なソリューションでは、あらかじめ定義されたjQMアイコンクラスを使用するだけで、その目的のためだけに追加のスタイルを追加する必要はありません。

例:icon-carat-uicon-carat-dは180度回転しているため、折りたたみが展開されて折りたたまれているときにアニメーション化されています。

さらに、コードcollapsible("expand")またはcollapsible("collapse")で使用しているときに折りたたみアイコンがアニメーション化されるため、clickイベントを使用しないようにしてください。ここで

は私のコードです:

.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>

私はjQueryのモバイル折りたたみ可能な見出しにすてきな滑らかなアニメーションを取得するために、標準カラットアイコンを回転させることができますどのように?

答えて

3

最初のものが最初です - キャレットだけでなくコード全体でバーが回転している理由は、.ui-icon-carat-d.ui-icon-carat-uはバー自体のクラスです。キャレットアイコンはそのバーの::after pseudo-classにあります。

私はこれを美しい解決策ではないと言って前置きしますが、解決策です。

これがもっと簡単ではない理由を理解するには、このキャレットのjQuery Mobileのスタイルシートで何が起きているのかを理解する必要があります。本質的に、キャレットと逆さまのキャレットは、CSSでエンコードされた背景画像としてスワップアウトされている別個の無関係のSVGアイコンです。

そのため、その変更はそのままではアニメーション化できません。ブラウザはそれらのイメージについて何も知らないし、間違いなく巧妙なアニメーションを実行することはできません。

ので、私の解決策は、jQueryのモバイルのスタイルから「通常の」キャレットを表しSVGの背景画像を貼り付け/コピー、と私たちはアニメーション化できるように、逆さまの状態にも表示するようにそれを強制的に開始しますそれは伝統的な方法で。

このように、私は(と、キャレットアイコン(::after擬似クラス)で要素を標的とすることに正規キャレットSVG background-imageを適用し、トグルの両方の状態のために、その画像上に保持することを強制してい!important)。

次に、.ui-icon-carat-uクラス(逆さま)のクラスを追加すると、イメージは変更されなくなり、アイコンはtransformで180度回転し、transitionでアニメートします。

希望すると便利です。下でそれをテストしてください。

.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

私は実際にこのCSS .'ui-アイコンカラット-Dを使用しています:: 変換{後:回転(-180deg)。 移行:.5s; } .ui-icon-carat-u :: after { 変換:回転(180度); 移行:.5s; } 'それはうまく回転していますが、私はCSS変換とトランジションの新しさだから、なぜ半回転だけ回転させることができないのかまだ理解できません。私はあなたの文章を完全に理解するために、このトピックを深くする必要があると信じています。「ブラウザーは確かに2つの別々の無関係のアイコンの間に巧妙なアニメーションを作れません。私のせい。それについての示唆? – deblocker

+0

@deblocker私はあなたのコメントごとに半円回転をするように自分のコードを調整しました。デフォルトjQuery Mobileスタイルでそうすることができない理由は、CSSを介してキャレットが回転していないということです。アイコンは別の画像に置き換えられています。残念なことに、CSSでは2つの背景画像の間で遷移する方法はないので、私の例では、画像を強制的に最初の通常のキャレットに残しています。 –

関連する問題