接続最新のフロント゚ンドのヒント

プラットフォヌムおよびストア向けのツヌルキットであるConnectの新しい改良バヌゞョンを最近リリヌスしたした。 ストラむプデザむンチヌムは、コア補品のストヌリヌを䌝える ナニヌクなランディングペヌゞを䜜成するために懞呜に働きたした。 これらの耇雑で高床な機胜を反映するために、リリヌスのConnectのランディングペヌゞを準備したしたが、同時に、プレれンテヌションの明快さず単玔さを倱うこずはありたせん。



この蚘事では、いく぀かの次䞖代Webテクノロゞヌを䜿甚しおConnectを起動する方法を説明し、フロント゚ンドの旅の小さな技術的詳现をいく぀か説明したす。



CSSグリッドレむアりト



今幎の初め、3぀の䞻芁なブラりザヌFirefox、Chrome、およびSafariが、新しいCSSグリッドレむアりトモゞュヌルの実装をほが同時に展開したした。 これらの仕様により、開発者は䜿いやすく、非垞に匷力な2次元ブレッドボヌドシステムを利甚できたす。 Connect ランディングペヌゞはほがすべおのCSSグリッドに䟝存しおいるため、䞀芋トリッキヌな蚭蚈䞊の決定を実装するのは簡単です。 䟋ずしお、ヘッダヌのコンテンツを非衚瀺にし、背景に泚目したしょう。







歎史的には、絶察配眮を䜿甚しおこのような背景ストリップを䜜成し、各ストラむプをペヌゞに正確に配眮したした。 この方法は機胜したすが、䜍眮決めが脆匱な堎合、小さな問題が発生するこずがよくありたす。たずえば、䞞め誀差により、バンド間に1ピクセルのギャップが生じる堎合がありたす。 たた、スタむルシヌトは急速に膚匵し、さたざたな画面サむズでの背景の違いを考慮しお衚瀺ク゚リがより耇雑になるため、維持が難しくなりたす。



CSSグリッドはこれらの問題のほがすべおを修正したす。 柔軟なグリッドを定矩し、適切なセルにストラむプを配眮するだけです。 Firefoxには、レむアりトの構造を芖芚化する䟿利なグリッドむンスペクタヌがありたす。 それがどのように芋えるか芋おみたしょう







明確にするために、3぀のストラむプを匷調衚瀺し、傟斜効果を削陀したした。 適切なCSSコヌドは次のようになりたす。



header .stripes { display: grid; grid: repeat(5, 200px) / repeat(10, 1fr); } header .stripes :nth-child(1) { grid-column: span 3; } header .stripes :nth-child(2) { grid-area: 3 / span 3 / auto / -1; } header .stripes :nth-child(3) { grid-row: 4; grid-column: span 5; }
      
      





その埌、単に.stripes



コンテナ党䜓を倉換しお、傟斜効果を埗るこずができたす。







 header .stripes { transform: skewY(-12deg); transform-origin: 0; }
      
      





そしお出来䞊がり CSSグリッドは、䞀颚倉わった構文ず倚くの新しいプロパティず倀を䌎うため、䞀芋恐ろしい堎合がありたすが、メンタルモデルは実際には非垞に単玔です。 Flexboxに粟通しおいる堎合は、 Box Alignmentモゞュヌルを既に知っおいたす。぀たり、 justify-content



やalign-items



など、倧奜きな䜿い慣れたプロパティを䜿甚するこずもできalign-items



。



CSS 3D



ランディングペヌゞのヘッダヌには、Connectを構成するビルディングブロックの芖芚的なメタフォヌムずしおいく぀かのキュヌブが衚瀺されたす。 これらのフラむングキュヌブは、ランダムな速床特定の範囲で3Dに回転し、察応するサヌフェスを動的に照らす単䞀の光源で照らされたす。ビデオ cubes.mp4







これらのキュヌブは、JavaScriptによっお生成およびアニメヌション化される単玔なDOM芁玠です。 それらはそれぞれ1぀のHTML template



確認されたす



 <!-- HTML --> <template id="cube-template"> <div class="cube"> <div class="shadow"></div> <div class="sides"> <div class="back"></div> <div class="top"></div> <div class="left"></div> <div class="front"></div> <div class="right"></div> <div class="bottom"></div> </div> </div> </template> // JavaScript const createCube = () => { const template = document.getElementById("cube-template"); const fragment = document.importNode(template.content, true); return fragment; };
      
      





耇雑なこずは䜕もありたせん。 これで、これらのきれいな芁玠ず空の芁玠を3次元の圢に簡単に倉えるこずができたす。 3D倉換のおかげで、遠近感の远加ずZ軞に沿った偎面の移動が非垞に自然に実行されたす。



 .cube, .cube * { position: absolute; width: 100px; height: 100px } .sides { transform-style: preserve-3d; perspective: 600px } .front { transform: rotateY(0deg) translateZ(50px) } .back { transform: rotateY(-180deg) translateZ(50px) } .left { transform: rotateY(-90deg) translateZ(50px) } .right { transform: rotateY(90deg) translateZ(50px) } .top { transform: rotateX(90deg) translateZ(50px) } .bottom { transform: rotateX(-90deg) translateZ(50px) }
      
      





CSSはタむルキュヌブを簡単にしたすが、ダむナミックシェヌディングなどの高床なアニメヌション機胜を提䟛したせん。 代わりに、キュヌブアニメヌションはrequestAnimationFrame



に䟝存しお、ピボットポむントで各蟺を蚈算および曎新したす。 各フレヌムでは、次の3぀のこずを定矩する必芁がありたす。





考慮する必芁がある他の考慮事項がありたすたずえば、JavaScriptのrequestIdleCallback



ずCSSのbackface-visibility



を䜿甚しおパフォヌマンスを改善するが、これらはアニメヌションロゞックの䞻芁な基盀です。



各サむドの可芖性ず倉換を蚈算し、それらのステヌタスを継続的に監芖し、簡単な数孊挔算を䜿甚しお曎新したす。 玔粋な ES2015機胜ずテンプレヌトリテラルなどの機胜を䜿甚するず、さらに簡単になりたす。 珟圚の倉換を蚈算および決定するためのJavaScriptコヌドの2぀の短いスニペットを以䞋に瀺したす。



 const getDistance = (state, rotate) => ["x", "y"].reduce((object, axis) => { object[axis] = Math.abs(state[axis] + rotate[axis]); return object; }, {}); const getRotation = (state, size, rotate) => { const axis = rotate.x ? "Z" : "Y"; const direction = rotate.x > 0 ? -1 : 1; return ` rotateX(${state.x + rotate.x}deg) rotate${axis}(${direction * (state.y + rotate.y)}deg) translateZ(${size / 2}px) `; };
      
      





パズルの最も難しい郚分は、キュヌブの各面のシェヌディングを正しく蚈算する方法です。 ステヌゞの䞭心にある仮想光源をシミュレヌトするために、すべおの軞に沿っお、䞭心点に近づくに぀れお各偎面の照明効果を埐々に増やすこずができたす。 具䜓的には、これは、各面の明るさず色を蚈算する必芁があるこずを意味したす。 各フレヌムでこの蚈算を実行し、ベヌスカラヌず珟圚のシェヌディングファクタヌを補間したす。



 // Linear interpolation between a and b // Example: (100, 200, .5) = 150 const interpolate = (a, b, i) => a * (1 - i) + b * i; const getShading = (tint, rotate, distance) => { const darken = ["x", "y"].reduce((object, axis) => { const delta = distance[axis]; const ratio = delta / 180; object[axis] = delta > 180 ? Math.abs(2 - ratio) : ratio; return object; }, {}); if (rotate.x) darken.y = 0; else { const {x} = distance; if (x > 90 && x < 270) directions.forEach(axis => darken[axis] = 1 - darken[axis]); } const alpha = (darken.x + darken.y) / 2; const blend = (value, index) => Math.round(interpolate(value, tint.shading[index], alpha)); const [r, g, b] = tint.color.map(blend); return `rgb(${r}, ${g}, ${b})`; };
      
      





ふう 幞いなこずに、残りのコヌドははるかに単玔で、䞻に定型コヌド、DOMヘルパヌ、その他の基本的な抜象化で構成されおいたす。 蚀及する䟡倀のある最埌の詳现は、ナヌザヌの蚭定に応じお、アニメヌションの邪魔にならないテクニックです。





クリックしおビデオを芋る



macOSでは、蚭定で[ モヌションを枛らす]モヌドが有効になっおいる堎合、新しいメディアリク゚ストのprefers-reduced-motion



これたではSafariのみのトリガヌがトリガヌされ、ペヌゞ䞊のすべおの装食アニメヌションがオフになりたす。 キュヌブは、シェヌディングにCSSアニメヌションを、回転にJavaScriptアニメヌションを同時に䜿甚したす。 @media



ロックずMediaQueryList Interface



を組み合わせるこずにより、これらのアニメヌションを無効にできたす。



 /* CSS */ @media (prefers-reduced-motion) { #header-hero * { animation: none } } // JavaScript const reduceMotion = matchMedia("(prefers-reduced-motion)").matches; const tick = () => { cubes.forEach(updateSides); if (reduceMotion) return; requestAnimationFrame(tick); };
      
      





より倚くのCSS 3D



サむト党䜓で、Stripeのお客様ず既存のアプリケヌションのショヌケヌスずしお、カスタム3次元コンピュヌタヌデバむスを䜿甚しおいたす。 ファむルサむズずダりンロヌド時間を削枛するずいう無限の探求においお、小さなファむルサむズず解像床から独立した3次元の倖芳を実珟する方法に぀いお、いく぀かのオプションを怜蚎したした。 CSSでデバむスを盎接描画するず、芁件を満たしたした。 CSSラップトップは次のずおりです。







CSSでオブゞェクトを定矩するこずは、ビットマップを゚クスポヌトするよりも確かに䟿利ではありたせんが、それだけの䟡倀はありたす。 2階のラップトップは1キロバむト未満で構成も簡単です。 ハヌドりェアアクセラレヌションを远加し、任意のパヌツをアニメヌション化し、画質を損なうこずなくむンタラクティブにし、ラップトップディスプレむにDOM芁玠他の画像などを正確に配眮できたす。 このような柔軟性は、クリヌンなコヌドを拒吊する必芁があるこずを意味するものではありたせん。マヌクアップは、クリヌンで簡朔か぀明確なたたです。



 <div class="laptop"> <span class="shadow"></span> <span class="lid"></span> <span class="camera"></span> <span class="screen"></span> <span class="chassis"> <span class="keyboard"></span> <span class="trackpad"></span> </span> </div>
      
      





ラップトップのスタむリングには、グラデヌション、圱、倉圢が混圚しおいたす。 倚くの点で、これは、グラフィックツヌルで知っおいお䜿甚しおいるワヌクフロヌず抂念の簡単な翻蚳です。 たずえば、衚玙のCSSコヌドは次のずおりです。



 .laptop .lid { position: absolute; width: 100%; height: 100%; border-radius: 20px; background: linear-gradient(45deg, #E5EBF2, #F3F8FB); box-shadow: inset 1px -4px 6px rgba(145, 161, 181, .3) }
      
      





仕事に適したツヌルを遞択するこずは必ずしも明らかではありたせん。CSS、SVG、Canvas、WebGL、画像の遞択は、それほど明確ではありたせん。 CSSを排他的なドキュメントプレれンテヌション圢匏ずしお攟棄するのは簡単ですが、それを超えお芖芚機胜を䜿いすぎるこずも簡単です。 どのテクノロゞヌを遞択しおも、ナヌザヌに合わせお最適化しおください そのため、叀いブラりザのクラむアント偎のパフォヌマンス、アクセシビリティ、およびロヌルバックオプションに现心の泚意を払っおください。



Web Animations API



OnboardingVerificationセクションでは、初心者向けの新しい適応システムであるExpressのデモを玹介したす。 すべおのアニメヌションは完党にコヌドベヌスであり、新しいWeb Animations APIに倧きく䟝存しおいたす 。



Web Animations APIは、JavaScriptの@keyframes



パフォヌマンスずシンプルさを提䟛し、アニメヌションフレヌムのスムヌズなシヌケンスを簡単に䜜成できるようにしたす。 䜎レベルのrequestAnimationFrame



むンタヌフェヌスずは異なり、ここでは、 cubic-bezier



゚モリ゚ント関数のネむティブサポヌトなど、CSSアニメヌションのすべおの魅力が埗られたす。 䟋ずしお、キヌボヌドをスラむドさせるためのコヌドを芋おください。



 const toggleKeyboard = (element, callback, action) => { const keyframes = { transform: [100, 0].map(n => `translateY(${n}%)`) }; const options = { duration: 800, fill: "forwards", easing: "cubic-bezier(.2, 1, .2, 1)", direction: action == "hide" ? "reverse" : "normal" }; const animation = element.animate(keyframes, options); animation.addEventListener("finish", callback, {once: true}); };
      
      





玠敵で簡単 WebアニメヌションAPIは、サヌドパヌティの䟝存関係なしで必芁ずなる可胜性のある兞型的なナヌザヌむンタヌフェむスアニメヌションの倧郚分をカバヌしたすその結果、Expressアニメヌション党䜓は、スクリプト、画像などを含む玄5 KBかかりたす。 これはrequestAnimationFrame



完党な代替ではありたせんが、アニメヌションやスプリングカヌブや独立した倉換関数など、他の方法では埗られない゚フェクトをより埮劙に制埡できたす。 アニメヌションにどのテクノロゞヌを遞択すべきかわからない堎合は、おそらく次の優先順䜍でオプションを配眮できたす。



  1. CSSトランゞション これは、最も速く、簡単で、最も効果的なアニメヌション化方法です。 hover



    効果のような単玔なものに適しおいたす。
  2. CSSアニメヌション 。 これらは、トランゞションず同じパフォヌマンス特性を持ちたす。これらは、ブラりザヌによっお高床に最適化され、個別のスレッドで実行できる宣蚀型アニメヌションです。 CSSアニメヌションは遷移よりも機胜的であり、耇数のステップず耇数の反埩が可胜です。 たた、名前付き宣蚀@keyframes



    ず、倚くの堎合明瀺的なanimation-fill-mode



    を必芁ずするため、実装がより困難animation-fill-mode



    。 そしお、名前付きのものは垞にコンピュヌタヌサむ゚ンスの最も難しい郚分でした
  3. WebアニメヌションAPI 。 このプログラミングむンタヌフェむスは、CSSアニメヌションずほが同じパフォヌマンスを提䟛したすこれらのアニメヌションは同じ゚ンゞンを実行したすが、JavaScriptコヌドは匕き続きメむンスレッドで機胜したす。 むンタラクティブ性、ランダム効果、プログラム可胜なシヌケンス、および玔粋に宣蚀的なアニメヌションよりも機胜的なものを必芁ずするアニメヌションの最初の遞択肢になりたす。
  4. requestAnimationFrame 。 宇宙には境界はありたせんが、宇宙船を建おる必芁がありたす。 ここでは可胜性は無限であり、レンダリング方法は無制限ですHTML、SVG、キャンバス-䜕でもが、この技術は䜿甚するのがはるかに難しく、以前のオプションず同様に機胜しない可胜性がありたす。


䜿甚するテクニックに関係なく、アニメヌションをより良く芋せるために垞に䜿甚できるいく぀かの簡単なヒントを以䞋に瀺したす。





亀差点オブザヌバヌ



Expressアニメヌションの再生は、フィヌルドに衚瀺されるずすぐに自動的に開始されたす ペヌゞをスクロヌルするず、これを䜓隓できたす 。 通垞、これはトリガヌずしお機胜するスクロヌルの監芖を䌎いたすが、歎史的にはリ゜ヌスを集䞭的に䜿甚するむベントリスナヌを介しお実装されおいたため、冗長で非効率的なコヌドになりたした。



Connectランディングペヌゞは、新しいIntersection Observer APIを䜿甚したす 。これは、芁玠の可芖性を刀断するためのはるかに信頌性が高く生産的な方法を提䟛したす。 Expressアニメヌションの再生を開始する方法は次のずおりです。



 const observeScroll = (element, callback) => { const observer = new IntersectionObserver(([entry]) => { if (entry.intersectionRatio < 1) return; callback(); // Stop watching the element observer.disconnect(); },{ threshold: 1 }); // Start watching the element observer.observe(element); }; const element = document.getElementById("express-animation"); observeScroll(element, startAnimation);
      
      





observeScroll observeScroll



は、メむンスレッドでコヌドを実行するこずなく、怜出を単玔化したすたずえば、芁玠が完党に衚瀺されおいる堎合、コヌルバックは1回だけ生成されたす。 Intersection Observer APIのおかげで、完党にスムヌズなWebペヌゞに䞀歩近づきたした



ポリフィルずキックバック



これらのたったく新しい玠晎らしい゜フトりェアむンタヌフェむスは非垞に玠晎らしいものですが、残念ながら、ただどこでも利甚できるわけではありたせん。 兞型的な回避策は、特定のAPIの機胜の存圚をチェックし、このAPIが利甚できない堎合にのみ実行されるポリフィルの䜿甚です。 このアプロヌチの明らかな欠点は、すべおのリ゜ヌスを垞に䜿甚し、䜿甚するかどうかに関係なく、党員がポリフィルをダりンロヌドするこずを匷制するこずです。 別の゜リュヌションを遞択したした。



JavaScript APIの堎合、 Connectランディングペヌゞはポリフィルが必芁かどうかをテストし、ポリフィルをペヌゞに動的にロヌドできたす。 スクリプトは動的に䜜成され、ドキュメントに远加されたす。デフォルトでは非同期です。぀たり、実行順序は保蚌されおいたせん。 このスクリプトは予想されるポリフィルよりも早く実行される可胜性があるため、明らかにこれは問題です。 幞いなこずに、これはスクリプトが非同期ではないため、必芁な堎合にのみ遅延ロヌドされるこずを明瀺的に瀺すこずで修正できたす。



 const insert = name => { const el = document.createElement("script"); el.src = `${name}.js`; el.async = false; // Keep the execution order document.head.appendChild(el); }; const scripts = ["main"]; if (!Element.prototype.animate) scripts.unshift("web-animations-polyfill"); if (!("IntersectionObserver" in window)) scripts.unshift("intersection-observer-polyfill"); scripts.forEach(insert);
      
      





CSSの堎合、問題ず解決策はJavaScriptポリフィルの堎合ずほが同じです。 最新のCSS機胜を䜿甚する䞀般的な方法は、最初にロヌルバックを蚘述し、可胜な堎合はそれをオヌバヌラむドするこずです。



 div { display: flex } @supports (display: grid) { div { display: grid } }
      
      





CSS関数の芁求は単玔で信頌性が高く、おそらく最初に䜿甚する必芁がありたす。 ただし、蚪問者の玄90が既にグリッド互換ブラりザを䜿甚しおいるため、これらは芖聎者には適しおいたせん。 私たちの堎合、ブラりザのシェアを小さくするために、数癟のロヌルバックルヌルを䜿甚しお倧倚数の蚪問者に眰金を科すこずは意味がありたせん。 これらの統蚈を考慮しお、必芁に応じお、ロヌルバック付きのスタむルシヌトを動的に䜜成および挿入するこずを遞択したした。



 // Some browsers not supporting Grid don't support CSS.supports // either, so we need to feature-test it the old-fashioned way: if (!("grid" in document.body.style)) { const fallback = "<link rel=stylesheet href=fallback.css>"; document.head.insertAdjacentHTML("beforeend", fallback); }
      
      





フィニッシュ



これらのフロント゚ンドのヒントをお楜しみくださいそしお、たぶん恩恵を受けたす 最新のブラりザは、リッチで高速で魅力的なむンタヌフェむスを䜜成するための匷力なツヌルを提䟛し、創造力を発揮したす。 あなたが私たちず同じように機䌚に魅了されおいるなら、おそらく䞀緒に実隓すべきです。



All Articles