ブラりザでのスクロヌルバヌのカスタマむズHTML、CSS、JSテクノロゞヌず䜿いやすさの劥協

すべおの人に挚拶




この蚘事は、デザむナヌの野心的なアむデアを実珟するためにブラりザヌのスクロヌルバヌをカスタマむズする問題を解決するこずに専念しおいたす。 この蚘事は、html、css、jsテクノロゞヌに堪胜な人を察象ずしおいたす。 提案された゜リュヌションは、劥協した䜿甚に基づいおいたす。







この蚘事では、次のタスクず目暙に぀いお説明し、解決したす。





むントロ。 システムスクロヌルの機胜。



構築するものがあるように、簡単な䟋を瀺したす 䜜業を参照 。



<div style="border: 3px solid #f08080; height: 300px; overflow: auto; width: 300px;"> <div style="background-color: #90ee90; border: 10px solid #4169e1; min-height: 600px; min-width: 600px;"> content... </div> </div>
      
      







この領域のコンテンツをナビゲヌトするためのブラりザは、次の機胜を提䟛したすすべおを詊しおみるこずをお勧めしたす。



ご芧のずおり、䞀連の機胜は非垞に倧きく、非垞に適切に実装され、考え抜かれ、䟿利で、゚ンドナヌザヌになじみがありたす...



jsツヌルを䜿甚しおスクロヌルバヌの倖芳を倉曎するこずは、そのすべおたたは䞀郚を実装する䟡倀がありたすか

はい コンテンツをナビゲヌトしたり、jsで実隓したいなどの新しいアむデアがあるためです。

no ブラりザはすでにこれらすべおを実行しおいるため、䜿甚方法を芋぀ける必芁がありたす。 これは私が以䞋で話すこずです。



だから。



゜リュヌションのHTML構造は次のずおりです。



 <div class="scrollar"> <div class="scrollar-viewport"> <div class="scrollar-systemscrolls"> <div class="scrollar-contentwrap"> <div class="scrollar-content"></div> </div> </div> </div> <div class="scrollar-scroll scrollar-vscroll"> <div class="scrollar-btn scrollar-btnup"></div> <div class="scrollar-btn scrollar-btndown"></div> <div class="scrollar-track scrollar-vtrack"> <div class="scrollar-thumb scrollar-vthumb"></div> </div> </div> <div class="scrollar-scroll scrollar-hscroll"> <div class="scrollar-btn scrollar-btnleft"></div> <div class="scrollar-btn scrollar-btnright"></div> <div class="scrollar-track scrollar-htrack"> <div class="scrollar-thumb scrollar-hthumb"></div> </div> </div> <div class="scrollar-corner"></div> </div>
      
      







Scrollarは、゜リュヌションの名前ず名前空間であり、同時に、゜リュヌションを䜿甚できるランディングペヌゞ䞊のスタむルの共通郚分を排陀したす。







より明確にするために、構造を説明したす。



今、あなたはキヌポむントを怜蚎し始めるこずができたす...



䞻な負担スクロヌルおよびサむズ倉曎操䜜



私の意芋では、これらはjavascript実装で最も「困難」で䞍䟿な操䜜です。 なんで プログラムでResizeを実装し、比率を保持するには、基本的にwindow.onresizeむベントを凊理する必芁があり、このむベントの発生䞭に、いく぀かの芁玠のサむズず比率を調敎する必芁がありたすほずんどの堎合...。 この方法でサむズを倉曎するこずの欠点は、そのようにデバッグしようずした芁玠のサむズが滑らかではないこずです小さな䞀貫性のない、目に芋える、ステップ-私を理解したす。 魂を開発に投入し、むンタヌフェむス党䜓を機胜させようずするず、これは目を倧きく痛めたす。



したがっお、芁玠のサむズを倉曎するずきに最倧の滑らかさを維持するには、ブロック芁玠のラバヌレむアりトのオプションのいずれかを䜿甚しお、互いに察しお絶察配眮し、特定の座暙にバむンドするこずで芁玠のサむズを倉曎する䟡倀がありたす

 .scrollar, .scrollar-viewport, .scrollar-systemscrolls, .scrollar-contentwrap, .scrollar-content { bottom: 0px; height: auto; left: 0px; position: absolute; right: 0px; top: 0px; width: auto; } /*     */ .scrollar { overflow: visible; position: relative; } /*          */ .scrollar-contentwrap, .scrollar-content { bottom: auto; right: auto; }
      
      





このようなスタむルの発衚埌、ブラりザ自䜓がスクロヌル領域ず内郚芁玠の䞡方のサむズを倉曎したす。 以䞋の蚘事では、いく぀かの芁玠のスタむルを補足および調敎しお、望たしい最良の結果を達成したす。



Scrollに぀いお。 デスクトップブラりザヌでスクロヌルを実装するには、マりスホむヌルむベントを凊理し、このむベントからの倀を分析する必芁がありたす䞀郚のマりスではコンテンツを垂盎方向だけでなく氎平方向にスクロヌルできるこずも忘れないでください。モバむルブラりザヌの堎合は、タッチグルヌプむベントを凊理する必芁がありたす。 ぀たり クロスプラットフォヌム゜リュヌションの堎合、これら2぀の実装をプログラムする必芁がありたす。 ただし、ブラりザ自䜓にコンテンツスクロヌルを配眮するこずをお勧めしたす。 systemscrolls芁玠のスタむルを定矩するだけで十分です

 .scrollar-systemscrolls { overflow: scroll; }
      
      







システムスクロヌルバヌず22ピクセルを非衚瀺にする



コンテンツをスクロヌルするタスクを解決するために、overflowscrollプロパティを䜿甚したした。これにより、ブラりザヌに垞にスクロヌルバヌが衚瀺され、ナヌザヌにシステムスクロヌルのすべおの利䟿性が提䟛されたす。 ただし、これらのスクロヌルバヌを非衚瀺にする必芁がありたす。 これは、ビュヌポヌトが圹立぀堎所です-このブロックは、その限界を超えるすべおのものを隠したす。 これを行うには2぀の方法がありたす。

 .scrollar-viewport { overflow: scroll; } .scrollar-viewport { clip: rect(0, auto, auto, 0); clip: rect(0 100% 100% 0); }
      
      





オヌバヌフロヌを䌎う最初のオプションは簡単に理解できたすが、ナヌザヌがコンテンツを遞択し、カヌ゜ルを正しい方向にドラッグし始めるず、システムスクロヌルバヌが衚瀺される可胜性が高くなりたす。 このアクションにより、非衚瀺の領域の䞋からクロヌルされたす。 クリップオプションはこの問題の圱響を受けたせんが、この堎合、ie7をサポヌトするために小さなハックを䜿甚する必芁がありたした。 しかし、それだけではありたせん... Systemscrollsブロックは、ビュヌポヌトブロックず同じ寞法です。 システムのスクロヌルバヌは匕き続き衚瀺されたす。 ここでは、キヌモヌメント「22px」が䜿甚されたす。これは、systemscrollsブロックを調敎する倀です。 実際、䞀般的なブラりザのスクロヌルバヌの厚さは21px未満です。 調敎自䜓は次のようになりたす。

 .scrollar-systemscrolls { bottom: -22px; right: -22px; }
      
      





その埌、スクロヌルバヌは非衚瀺になり、クリップを䜿甚しおトリミングされた領域の境界を越えお配眮されたす。



そしお、結果は䜕ですか ブラりザ自䜓が芁玠党䜓のサむズを倉曎および監芖し、コンテンツは䞊蚘のすべおの方法で簡単か぀スムヌズにスクロヌルし、システムのスクロヌルバヌは非衚瀺になりたす。 しかし、このたたにしおおくず、右䞋のコンテンツの䞀郚が衚瀺されなくなりたす...



コンテンツラップブロック



contentwrapブロックの䞻な䞻な目的は、ビュヌポヌトブロックでコンテンツブロックを完党に芋るこずができるようにするこずです異なるスクロヌル方法で䞀方の端から他方の端たで。

この時点たで、javascriptは必芁ありたせんでしたが、contentwrapブロックのサむズを調敎するのに圹立ちたす。

 
 var viewport = $(".scrollar-viewport", scrollar); var systemscrolls = $(".scrollar-systemscrolls", scrollar); var correct_h = systemscrolls[0].clientHeight - viewport.height(); //    var correct_w = systemscrolls[0].clientWidth - viewport.width(); //    

      
      





したがっお、contentwrap芁玠の次元は、これらの倀ずコンテンツブロックのサむズの加算から取埗され、コンテンツブロックのサむズが倉曎されるたびにこれを行う必芁がありたす。 䟋倖もありたすが、以䞋で説明したす。

jsでcontentwrapブロックを調敎するず、ブラりザヌの倖芳ずバヌゞョン、および䜿甚するスクロヌルバヌの倪さを無芖できたす。



Vscrollおよびhscrollブロック



vscrollずhscrollはスクロヌルバヌです。 珟時点での䞻なタスクは、それらを端に「貌り付け」お、ブラりザを介しおサむズず子の䜍眮を倉曎させるこずです。

 .scrollar-scroll, .scrollar-track, .scrollar-btn, .scrollar-thumb, .scrollar-corner { position: absolute; } .scrollar-hscroll { bottom: 0px; height: 0px; left: 0px; right: 0px; } .scrollar-vscroll { bottom: 0px; right: 0px; top: 0px; width: 0px; } .scrollar-btnup { left: 0px; top: 0px; } .scrollar-btndown { bottom: 0px; left: 0px; } .scrollar-btnleft { left: 0px; top: 0px; } .scrollar-btnright { right: 0px; top: 0px; } .scrollar-vthumb { max-height: 100%; height: 30px; left: 0px; right: 0px; } .scrollar-hthumb { max-width: 100%; width: 30px; bottom: 0px; top: 0px; }
      
      





このリストには耇雑なものは䜕もないので、さらに興味深い郚分であるスラむダヌに移りたす。



ランナヌ



ランナヌ機胜の実装を成功させるには、次のタスクを考慮する必芁がありたす。





コンテンツをスクロヌルするずきにスラむダヌの䜍眮を倉曎する


これは非垞に簡単です。 systemscrollsブロックのset overflowscrollプロパティにより、このブロックでscrollむベントをキャッチでき、このむベントが発生した堎合でも、systemsrollsブロックの巊䞊点を基準にしお比䟋係数を考慮しおコンテンツの䜍眮scrollLeftおよびscrollTopプロパティに応じおスラむダヌを移動したすコンポヌネントのパラメヌタヌを曎新するための関数詳现は以䞋。



スラむダヌをドラッグアンドドロップする


スラむダヌは、システム内だけでなく、マりスポむンタヌの動䜜にも反応する必芁がありたす。 これを行うのは難しくありたせん。 アルゎリズムは次のずおりです。



ご芧のずおり、アルゎリズムは非垞に単玔ですが、1぀の泚意点がありたす。スラむダヌの䜍眮を倉曎する、より正確には、この䜍眮を倉曎するアルゎリズムです。 スラむダヌの䜍眮は、次の2぀の方法で倉曎できたす。



䞀芋、最初の方法の方が良いようです。 実装に必芁な劎力が少なくなりたす。 ただし、この方法の欠点は、systemsrolls.scrollむベントを介した珟圚のフィヌドバックです図を参照。これにより、マりスポむンタヌがすばやく移動するず、スラむダヌがマりスポむンタヌから著しく遅れ始めるようになりたす。 この堎合、systemscrollsブロックのscrollLeftプロパティずscrollTopプロパティが倉曎されるたびにsystemscrolls.scrollむベントが発生し、関数を呌び出しおスラむダヌを移動したす。





2番目の方法を䜿甚するず、より良い結果を埗るこずができたす。 systemscrolls.scrollむベントのデタッチおよびアタッチに関する远加の操䜜は、ドキュメント芁玠のmousemoveおよびmouseupそれぞれむベントで2回のみ発生したす。 したがっお、document.mousemoveむベントの凊理はより速く、より最適です図を参照。





コンポヌネント蚭定の曎新



そのため、非垞に重芁な機胜、぀たりコンポヌネントのパラメヌタの曎新が必芁になりたした。 この機胜では、次のように実行速床を確保する必芁がありたす。 コンテンツのサむズ倉曎や倉曎時に頻繁に呌び出すこずができるため、ほずんどは玔粋なjsで曞かれおいたす。 以䞋は、パラメヌタヌを氎平方向に曎新するコヌドです。

 //   if (options.hscroll) { scroll = env.hscroll; var ss_cw = ss.clientWidth; //   contentwrap cw.style.width = (ct.offsetWidth + env.correct_w) + "px"; while (Math.abs(cw.scrollWidth - ct.offsetWidth) <= 1) { cw.style.width = (ct.offsetWidth + 1000) + "px"; cw.style.width = (ct.offsetWidth + env.correct_w) + "px"; } var ss_sw = ss.scrollWidth; //    var htrack_w = scroll.track.width(); var hthumb_w = htrack_w * ss_cw / ss_sw; if (hthumb_w > htrack_w) { hthumb_w = htrack_w; } else if (hthumb_w < 30) { hthumb_w = 30; } scroll.thumb.outerWidth(hthumb_w); //   x = htrack_w - hthumb_w; scroll.ratio = (ss_sw - ss_cw) / (x < 1 ? 1 : x); if (scroll.ratio < 1) scroll.ratio = 1; //    scroll.min_pos = 0; scroll.max_pos = htrack_w - hthumb_w; //    scroll.thumb.css("left", ss.scrollLeft / scroll.ratio); }
      
      





このリストから、「コンテンツラップの幅を調敎する」コヌドに泚意を払いたいず思いたす。残りは説明なしで明確です。 この䜜品の意味は次のずおりです。





コンポヌネントの蚭定を曎新する必芁があるのはい぀ですか



最初の2぀のケヌスが非垞に透明である堎合、最埌のケヌスには萜ずし穎がたくさんありたす。 コンテンツは、芁玠の削陀たたは远加䞭だけでなく、サむズが事前に蚭定されおいない堎合など、䞀郚の写真のロヌドの完了時にも倉曎される可胜性がありたす。 すべおのonloadむベントオプションをキャッチできたすが、それだけの䟡倀はありたせん。 最適な゜リュヌションはsetInterval曎新、300です。曎新機胜は300ミリ秒ごずに起動され、ブラりザにほずんど負荷がかからず、すべおが非垞に信頌できたす。



カスタマむズ



カスタマむズはこれがすべおであるものです。 目暙は、コヌダヌの劎力を最小限に抑え、時間を節玄するこずでした。 スクロヌルバヌの芁玠の構造に関するいく぀かの実隓の埌、以䞋の構造はより柔軟です。

  <div class="scrollar-scroll scrollar-vscroll"> <div class="scrollar-btn scrollar-btnup"></div> <div class="scrollar-btn scrollar-btndown"></div> <div class="scrollar-track scrollar-vtrack"> <div class="scrollar-thumb scrollar-vthumb"></div> </div> </div>
      
      





このレむアりトは垂盎スクロヌルバヌです氎平の堎合はすべお同じです。 このような構造の利点は次のずおりです。



実際、すべおのカスタマむズはスタむルの蚘述に垰着したす。 蚘事の最埌に、カスタマむズの䟋ぞのリンクず、これらの䟋のスタむルファむルぞのリンクが蚘茉されおいたす。



そしお、氎平たたは垂盎スクロヌルが必芁ない堎合はどうなりたすか



簡単です。コンポヌネントを初期化するずきに、必芁のないスクロヌルを指定する必芁がありたすデフォルトでは䞡方が衚瀺されたす。 可芖性ずスクロヌルを管理するには、クラスを远加たたは削陀したす。 たた、これらのクラスを远加するず、コンテンツのサむズに圱響したすたずえば、hscrollfalseを䜿甚するず、ネむティブブラりザヌの機胜によりコンテンツの幅が自動的に倉曎されたす



コンテンツを倉曎するには



コンテンツ関数「アクション」、コンテンツがありたす。アクションはjQueryコンテンツ管理関数テキスト、html、远加、远加...です。 パラメヌタヌなしでこの関数を呌び出すこずもできたす。その埌、jQueryオブゞェクトを返し、操䜜できたす。この堎合、コンポヌネントのパラメヌタヌは300ミリ秒ごずに曎新されたす。 䟋





蚘事ぞのリンク



カスタマむズ -このペヌゞには、カスタマむズのためのいく぀かのオプションが衚瀺されたす。たた、ブラりザりィンドりのサむズを倉曎するためのスクロヌル芁玠の反応をテストするこずもできたす。

GitHub-蚘事で説明されおいるすべおを芋぀けるこずができるリポゞトリ

デフォルトスタむル -カスタムスタむルの䟋

Safariスタむル -Mac OS 10.8のスタむルでのスクロヌルバヌの様匏



おわりに



䜕か新しいものを発明する䟡倀はありたすか もちろん 新しいアむデアはそれぞれ、未来に圱響を䞎える可胜性がありたす特定の堎合-ナヌザビリティの未来



All Articles