モジョリボン-LESSの完璧なテープまたは三角法

おはようございます。 最近、あるプロジェクトで、ブロック用のリボンを作成する必要がありました。 たとえば、「GitHubでフォークしてください」という碑文のリボンが一番上に作成されたり、ポートフォリオ内の各要素の作品の公開日が記載されたリボンがあったりすることが非常に多くあります。 公式のLESS Webサイトから例を示した方がよいでしょう。これは非常に小さな詳細であるため、まったく注意を払わない人もいるからです。



画像



このリボンは、絶対配置のリンク内の画像です。 このオプションで私に合わないものは何ですか? まず、私は最新のCSS標準が本当に好きです。これを使用すると、最小限の画像を使用して素敵なデザインを作成できます。この場合、リボンはtransform rotate



した通常のブロックにできます。 第二に:最近、RetinaディスプレイでWebを見ると、最適化されていないimg



すぐに目を引きますが、開発者はある種のリボンに注意を払い、メディアクエリで表示を最適化します。



長さ500ピクセル、高さ50ピクセル、絶対配置、上、左のブロックを作成します。 結果は、次の左側の画像に表示されているものです。 次に、ブロックを-45度回転させて、LESS付きリボンに似たものを取得します。 結果は画像の右側に表示されます。 要素は中心から回転し、左側にインデントが作成され、将来のテープの一部が作業領域を離れます。



画像



インスペクターの助けを借りて、 top



および-left



必要な値を選択できます。 このオプションで私に合わないものは何ですか? 第一に、完璧主義:指定したピクセルの最大数(この場合は500)をワークスペースに表示し、それを超えないようにします。 第二に-怠iness:位置(上、右、下、左)と傾斜の度合いを変更するときに、すべてのコーナーを非表示にするために値を手動で選択したくありません。





幾何学



私が言ったように、要素は中心から回転します。 したがって、インデント値は作業領域の端から中心まで測定されます。 結果の図を想像してください-三角形、その側面を計算する必要があります:

画像



2つの三角形ABCA2B2C2が判明しました。これらの側面を計算する必要があります。 C = 500px(幅)、 C2 = 50px(高さ)、傾斜角は-65(deg)であるため、三角形ABCの角度aは65度、角度bは25度(180-90-65)です。 。 三角形A2B2C2では、角度a2b2はそれぞれ65度と25度です。



三角法



すべてがシンプルです。 角度のサインは、反対側と下垂体の比率に等しくなります。 したがって:



A = sin(a)* CまたはA = sin(65)* 500;

B = sin(b)* CまたはB = sin(25)* 500;



A2 = sin(a2)* C2またはA2 = sin(65)* 50;

B2 = sin(b2)* C2またはB2 =歌う(25)* 50;



少ない



 .MojoRibbon(@width, @height, @deg, @valign) { width: @width; height: @height; -webkit-box-sizing: border-box; /*       padding */ -moz-box-sizing: border-box; -ms-box-sizing: border-box; box-sizing: border-box; .defineDegree(@deg, @valign) when (@deg < 0) and (@valign = top) { @degree: -@deg; /*   ,   sin */ top: @countHeight; left: @countWidth; -webkit-transform: rotate(@deg); -moz-transform: rotate(@deg); -o-transform: rotate(@deg); -ms-transform: rotate(@deg); transform: rotate(@deg); }; .defineDegree(@deg, @valign) when (@deg < 0) and (@valign = bottom) { @degree: -@deg; /*   ,   sin */ bottom: @countHeight; right: @countWidth; /*            ,          */ -webkit-transform: rotate(@deg); -moz-transform: rotate(@deg); -o-transform: rotate(@deg); -ms-transform: rotate(@deg); transform: rotate(@deg); }; .defineDegree(@deg, @valign) when (@deg > 0) and (@valign = top) { @degree: @deg; top: @countHeight; right: @countWidth; -webkit-transform: rotate(@degree); -moz-transform: rotate(@degree); -o-transform: rotate(@degree); -ms-transform: rotate(@degree); transform: rotate(@degree); }; .defineDegree(@deg, @valign) when (@deg > 0) and (@valign = bottom) { @degree: @deg; bottom: @countHeight; left: @countWidth; /*            ,          */ -webkit-transform: rotate(@degree); -moz-transform: rotate(@degree); -o-transform: rotate(@degree); -ms-transform: rotate(@degree); transform: rotate(@degree); }; .defineDegree(@deg, @valign) when (@deg = 0) { @degree: @deg; top: 0; left: 0; }; .defineDegree(@deg, @valign); @angleB: 90-@degree; @angleB2: @angleB; @sideA: round(sin(@degree), 3)*@width; /*   */ @sideB: round(sin(@angleB), 3)*@width; /*  B */ @sideB2: round(sin(@angleB2), 3)*@height; /*  2 */ @sideA2: round(sin(@degree), 3)*@height; /*  B2 */ @countHeight: @sideA/2 - @height/2 - @sideB2/2; @countWidth: -((@width)-(@sideB))/2 - @sideA2/2; }
      
      







デモ結果

Github



CSSが注目を集めたのと同じように、みんなに感謝します。




All Articles