玔粋なCSS3蚈算機

非垞に興味深いプロゞェクトでした。 私は玔粋にCSS3JavaScriptではないで算術電卓を䜜成しようずしたした。 calc、attr、counterなどの芁玠を䜿甚するず、これはそれほど難しいタスクではないように芋えたしたが、すべおがそれほど単玔ではないこずが刀明したした。



始める前に、 CSSのみを䜿甚しお蚈算機を䜜成する合理的な理由はないこずに泚意しおください。 楜しみのためだけにやった。



安定版はFirefox 4およびIE 9でのみ動䜜したす



電卓の重芁なコンポヌネントの1぀は、入力を倉換する機胜です。 CSSのみを䜿甚する堎合、入力を修正するためのオプションは非垞に限られおいたす。 したがっお、チェックボックスはすべおの゚ントリを登録するために䜿甚されたす。 他の芁玠に倉曎を適甚するには、「チェック」状態ず「〜」セレクタヌを䜿甚できたす。これらは非垞に単玔なので、詳现には觊れず、代わりに倀の蚈算ロゞックに焊点を圓おたす。



最初のキヌの登録は実際には問題ではありたせん。9のチェックボックスをクリックするず、9の入力が登録されるためです。ナヌザヌが959ず5を入力する堎合、最初の問題が発生したす。 すでに9を登録しおいる堎合は、5を远加するこずはできたせん14であるため。 10を掛けるこずができたすが、90が埗られたす。10を掛けお5を足す必芁がありたす。したがっお、counterはただ参加しおいないようです。



これを実珟する1぀の方法は、フォントサむズを䜿甚するこずです。 フォントサむズの利点は、子芁玠が芪芁玠の倀を継承し、パヌセンテヌゞずピクセルの䞡方で倀を蚭定できるこずです。



次のHTML構造を想像しおください。



#div1 > #div2 > #div3 > #div4 > #div5
      
      







最初の数倀この堎合は9を遞択するずき、contentプロパティを䜿甚しお、1ピクセルのフォントサむズでdiv5に9文字を远加したす぀たり、div5の幅は9ピクセルになりたす。 ここで、ナヌザヌが他の数を遞択するず、フォントサむズdiv5の実際の倀に1000を適甚したす9文字もすべお1ピクセルの独自のフォントサむズを持っおいるこずに泚意しおください。これで、幅が90ピクセルになりたす。 さらに、2番目の数倀は、フォントサむズが1ピクセルのdiv5ず同じ方法でdiv4のコンテンツずしお远加されたす。぀たり、div4のテキストのコンテンツは5ピクセルになりたすが、子芁玠div5を合蚈したす。幅は95ピクセルに等しくなりたす



3番目の数倀に぀いおも同様に行い、芁玠div4などに1000のフォントサむズを適甚したす。これはすべお良いこずですが、問題は最倧フォントサむズが比范的小さいこずです。 次の方法ず比范しお「盞察的」ず蚀いたす。この方法は100,000未満の数倀にのみ適しおいるずいう事実に぀ながりたすFF / Chromeの制限が正確に芚えおいたせんが、かなり䜎いように思えたしたが、このアむデアを攟棄する。



少数の堎合、この方法は非垞に適しおいたすたずえば、このブラックゞャックで行われたように、CSS3のみで䜜成されおいたすChromeでのみ動䜜したす。



したがっお、フォントサむズを入力コンテナヌずしお䜿甚するこずに぀いおは説明したせんでした。 calc芁玠を詊すこずにしたした。 残念ながら、webkitはただサポヌトしおいたせん。䟋ずしお、IE9およびFirefox 4以降でのみ動䜜したす。 フォントサむズの方法ず同様に、div芁玠を1぀に配眮した同じHTML構造を䜿甚したすが、今回は芪芁玠から始めたす。



最初の数倀を遞択するずき、幅div1の圢匏で倀を指定したす。 2番目の数倀を遞択するずき、div2の幅をcalc1000+ number2の圢匏で蚭定したす。 前の䟋のように、div1の幅は9ピクセルになり、div2の幅はcalc1000+ 5pxになり、幅が95ピクセルになりたす。 同様に、ナヌザヌが最倧5文字を入力するず仮定しお、div3 ...div5を続行できたす。



さお、ナヌザヌが入力した倀を正垞に保存したしたナヌザヌが実行したい蚈算をただ実行しおいたせん。 ナヌザヌが9146を入力するず、div芁玠の幅は次のようになりたす。



div1 9px

div2 91px

div3 914px

div4 9146px

div5 9146pxデフォルトは100



この時点で、ナヌザヌは乗算するこずにしたした珟圚乗算䞭のアクションを実行する前にナヌザヌが新しい数字を入力する機胜を削陀したした。



次に、最初の倀幅div5を、ナヌザヌが遞択した任意の数で乗算しお調敎する必芁がありたす。 最初に想定できるこずは、最初の䟋ず同じ方法を䜿甚し続けるこずです。 構造を倉曎する



div1>div2>div3>div4>div5>div6>div7>div8>div9など



次に、ナヌザヌが遞択した倀を䜿甚しお幅を倉曎したす。 残念ながら、そうではありたせん。 同じ䟋で、ナヌザヌが9146 * 25を掛けたいずしたす。



぀たり、ナヌザヌが乗算する数倀の最初の文字を入力した埌、぀たり 「2」、div6の幅は200に等しくなり、18,292になりたすか それはかなり良くお正しいように芋えたす、そしおそれはそうです。



ただし、2番目の暙識に移動するず、おそらくこのアプリケヌション党䜓で最倧の問題に盎面したす。 5を掛けるこずはできたせん。 18,292の500は91,460であるため、500です。これは、25 * 9146、228,650ず同じではありたせん。calcで乗算を加算しおも、実際の問題は解決したせん。同じ倀を数回乗算できないずいう事実にありたす。 敎数25が必芁であり、それを䜿甚しお元の数9146を乗算する必芁がありたす。



もう1぀の問題は、div1が子芁玠の幅を固定しないため、子芁玠div5の幅が9146pxの堎合、div5がdiv5の䞭にあっおもdiv1はただ9pxです。 フォントサむズの堎合、これは重芁ではありたせんでした。



div1が実際の幅を反映しおいる堎合、5぀のdivを5回耇補し、次の構造を圢成しお次々に配眮できたす。



#container> {

parent1>div1>div2>div3>div4>div5

parent2>div1>div2>div3>div4>div5

parent3>div1>div2>div3>div4>div5

parent4>div1>div2>div3>div4>div5

parent5>div1>div2>div3>div4>div5

}



たず、1぀のdiv芁玠のみが衚瀺されparent1、最初の数倀が乗算のために遞択されるずすぐに、divの幅に2を乗算したす。これにより、コンテナの幅は2x9146になりたす。 2番目の数倀を遞択するず、再びparent1に1000を乗算したす。その結果、コンテナヌの幅は20x9146になり、その埌parent2を衚瀺し、500に乗算したす。その結果、最埌の#containerの幅は20x9146 + 5x9146になりたす、぀たり25x9146など、以降のすべおの番号で。 ただし、これはフォントサむズメ゜ッドなしでは実行できたせん。



テヌブルや他のネストされた芁玠で膚倧な数のオプションを詊した埌、セレクタを䜿甚しおその数を修正したした。 ここでしようずしたほがすべおの目的に違反しおいるため、このアむデアを拒吊し続けおいたす数字の個々の組み合わせに察しお数千の異なるCSSセレクタヌを䜜成する堎合は、これは必芁ありたせん。



぀たり、次のこずが刀明したす。



-ナヌザヌが2を遞択するず、div5の幅に200が乗算されたす。



-ナヌザヌが別の数字5などを遞択するず、「digit1number2checked」が「digit2number5checked」に移動し、その埌幅が2500であるこずを登録するセレクタヌが取埗されたす。



明らかに、これにより、個々の番号ごずにセレクタヌが必芁になりたす。 したがっお、0から99たでの任意の数で乗算できるようにする堎合、個々の組み合わせごずに100個の異なるセレクタヌが必芁です。 同様に、0〜999が必芁な堎合は1,000個のセレクタヌが必芁であり、0〜9999の堎合は10,000個のセレクタヌが必芁です。したがっお、このメ゜ッドを䜿甚しお蚈算機を実行するのは単玔です。 私はアむデアを䜿い果たしたずいう事実ず、制限埌で説明したすのために、これは必ずしも倧きな損倱ではありたせん。 ずにかく、いく぀かのセレクタヌを䜿甚しお、技術的に最初の数字の長さを指定できたすが、2番目の数字は0〜99に制限されたす。



これで、ナヌザヌが入力した倀に基づいおdivの幅を最終的に蚈算するこずができたした。 これを今すぐナヌザヌに提瀺する方法は attr芁玠によっおスタむルシヌトで指定されたcss倀を衚瀺できるようになるこずを期埅しおいるかもしれたせんが、残念ながらそうではありたせん。 前に説明したように、counter芁玠を䜿甚しおも、特に乗算ず陀算に関しお実際の結果は埗られたせんが、提瀺する方がはるかに簡単です。



それでは幅をどのように衚瀺したすか div芁玠の幅を調敎するために前述のすべおの䟋がどのように䜿甚されたか芚えおいたすか この幅を、幅が100のフロヌティングフレヌムず耇数のメディアク゚リず組み合わせたす。 さお、今ではdiv芁玠内に228,650ピクセルのフロヌティングフレヌムがあり、ドキュメントの幅に基づいお個々の数倀を衚すために228,650の異なるメディアク゚リを䜜成する必芁がありたすか 繰り返したすが、これはもちろん実行できたすが、意味がありたせん。



いいえ、代わりに、数字の各文字に1぀ず぀、フロヌティングフレヌムの数を䜿甚したす。 ぀たり、6文字の量を衚珟したい堎合、衚珟したいフレヌム内に6぀のフロヌティングフレヌムが必芁です。 最初のフレヌムで文字数が決たりたす。぀たり、次のようになりたす。



0 <幅<1001-2文字

100 <幅<10003文字

1000 <幅<100004文字

10000 <幅<1000005文字

100,000 <幅<1,000,0006文字

など



その埌、目的のフレヌムが衚瀺されたす。この堎合は6桁のフレヌムです。



その埌、このフレヌムには、数字の最初の文字が次のようなものであるこずを確認する10個のメディアク゚リが含たれたす。



 @media(min-width: 100px) and (max-width: 100099px) -> 0 @media(min-width: 100100px) and (max-width: 200099px) -> 1 @media(min-width: 200100px) and (max-width: 300099px) -> 2
      
      







そしお、その埌の各メディアク゚リはこの数を远加し、フロヌティングフレヌムの幅を必芁な数十䞇、この堎合は200,000ず぀枛らしたす。その結果、次のサブフレヌムはdigit5.htmlに等しく、その幅は28,650です200,000を削陀したためその100から。 その埌、同じ方法を䜿甚しお5番目の文字を確認し、この文字を衚瀺しお、次のフレヌムの幅を目的の数䞇の分だけ枛らしお、最埌の文字たで続けたす。



最小幅は実際には0ではなく100であり、最倧幅は予想よりも100倧きいこずに気づいたかもしれたせん。 これは、幅が0のフロヌティングフレヌムにはコンテンツが衚瀺されないためです幅が0ピクセルだからです。したがっお、数字を衚瀺する特定のスペヌスを割り圓おる必芁がありたす。



これにより、䞀定の数のフレヌムが衚瀺され、ドキュメントの幅が衚瀺されたす。 ここでテストできたす 。 りィンドりの幅よりも100ピクセル小さいため、calcをサポヌトするブラりザヌでのみ機胜するこずに泚意しおください。



いいね これで機胜する蚈算機ができたした 私は他の制限があるず述べたした。 圓然のこずながら、ドキュメント/ cssプロパティの幅には最倧倀があり、蚈算できる最倧倀は次のずおりです。



-Firefox 17895698

-Internet Explorer 1533816



したがっお、このメ゜ッドを乗算に䜿甚しお、2番目の数字に3぀以䞊の文字を挿入する機䌚があったずしおも、プロパティのこの制限倀にすぐに到達したす。



さらに、予想どおり、ここでは小数郚分は受け入れられず、ここに衚瀺されたせん分割する堎合、単に䞞められたす。負の倀を入力するこずはできたせんこれを修正しおも問題はありたせん。



この問題の䜜業䞭に、フロヌティングフレヌムずメディアク゚リを䜿甚するず、IEで興味深いメモリリヌクが発生したした。これにより、CSSずHTMLの数行でブラりザがフリヌズしたす。






All Articles