1. ホーム
  2. Web制作
  3. CSS

[CSSチュートリアル】波動効果を生み出すCSSのアイデア

2022-01-21 10:09:41

前回、純粋なCSSを使って波動効果を実装する方法をいくつか紹介しましたが、それについて関連する記事が2つあります。

ピュアCSSで波動効果を実現!

CSSで作るクールな充電アニメーション

今回は、CSSを使った波動効果の面白いアイデアをもう一つ取り上げます。

曲がった三角形の面積の定積分から始める

本題に入る前に、これを見てください。高等数学では、二次曲線グラフの面積を定積分で求めることができます。

曲線の下の領域を細かい高さのn個の長方形に分割し、nが無限大になるにつれて、すべての長方形の面積が曲線のグラフの面積に等しくなるようにすればよいのです。

から引用した2つの簡単な模式図。 なぜ定積分は面積を求めることができるのか? :

nが無限大に近づくと、すべての長方形の面積は、曲面グラフの面積と等しくなるとき。

このアイデアを使えば、CSSでも複数のdivで曲線のエッジ、つまり波線をシミュレートすることができる。

ステップ1.グラフィックを複数枚に切り分ける

まず、親コンテナを定義し、その下に12個の子 div を定義します。

"""


import numpy as np


from scipy.optimize import leastsq




def func(x, p): 


"""



By """ A, k, theta = p return A*np.sin(2*np.pi*k*x+theta) def residuals(p, y, x):  """ レイアウト、シンプルなレイアウトでは、このように各子要素の高さが等しいグラフが得られます。

"""


return y - func(x, p)




x = np.linspace(-2*np.pi, 0, 100)


A, k, theta = 10, 0.34, np.pi/6 # function arguments for real data


y0 = func(x, [A, k, theta]) # real data


# Experimental data after adding noise


y1 = y0 + 2 * np.random.randn(len(x)) 




p0 = [7, 0.2, 0] # First-guess function fit parameters
# call leastsq to fit the data, residuals is the function that calculates the error


# p0 is the initial value of the fit parameters, # args is the experimental data to be fitted


plsq = leastsq(residuals, p0, args=(y1, x)) 


# In addition to the initial values, the args argument is called to specify the other parameters used in the residuals (the global variables for x,y are used directly in the linear fit), again returning a tuple with the first element being the array of parameters after the fit.
Here (y1, x) is passed to the args argument. leastsq() will pass these two additional arguments to residuals(). Thus residuals() has three arguments, p for the sine function, and y and x for the array representing the experimental data.


print u"Real Parameters:", [A, k, theta]  


print u "Fitted parameters", plsq[0] # Parameters after fitting to experimental data 




import pylab as pl 


pl.plot(x, y0, label=u"real data") 


pl.plot(x, y1, label=u"Experimental data with noise") 


pl.plot(x, func(x, plsq[0]), label=u"Fitted data") 


pl.legend() 


pl.show() 
>>> Real Parameters: [10, 0.340000000000000000002, 0.52359877559829882]


>>> Fitted parameters [-9.84152775 0.33829767 -2.68899335]

その効果は次の通りです。

ステップ2. 各子要素に、異なる負の遅延で高さ変換アニメーションを実行させる

次に、簡単な模様替えをするために、グラフを動かす必要がありますが、これは、各子要素の高さを

minimize(fun, x0[, args, method, jac, hess, ...]) Minimization of scalar function of one or more variables.
Note: The parameter bounds=((0,None), (0,None)) represents the bounds corresponding to each dimension of x. If there is only one dimension, write bounds= ((0, None), ) as well, or use the following minimize_scalar function.
bounds= ((0, None), (0, None)) corresponds to the initial value x0 of x, which should be two-dimensional, as in (1, 0). 
For example see [ 
scipy.optimize.minimize
]


 minimize_scalar(fun[, bracket, bounds, ...]) Minimization of scalar function of one variable.
Note: These functions, such as minimize_scalar, return an OptimizeResult object, and print() results like this.    
 fun: -2.3627208257312922 


    nfev: 9 


     nit: 8 


 success: True 


       x: 1.333333333395553

その効果は次の通りです。

次に、各子要素のアニメーションシーケンスに、異なる時間の負の遅延を設定させるだけで、予備的な波の効果が得られますが、ここでは作業負荷を軽減するためにSASSの助けを借りて実装しています。

def test():
    import math
    from scipy import optimize
    func = lambda x: x * math.log(x, 2)
    a = optimize.optimize_scalar(func, bounds=[0.1, 1], method='bounded')
    print(a)

これによって、予備的な波動効果である

ステップ3.ジャギーをなくす

上の波のアニメーションはご覧の通り、ジャギーが出ているので、できるだけジャギーをなくすようにします。

方法1:divの数を増やす

冒頭の曲線グラフの面積を定積分で求める考え方にならい、子divの数をできるだけ増やせばよく、divの数が無限になれば、ジャギーは消えます。

上の12個のサブディビジョンを120個に置き換えてみることができます。120個のdivをひとつひとつ書くのは面倒なので、ここでは パグ テンプレートエンジン

     fun: -0.5307378454230427 



 message: 'Solution found.' 


    nfev: 9 


  status: 0 


 success: True 


       x: 0.3678794534141907 



[...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...]