рдбреЗрдЯрд╛-URI рдореЗрдВ png рдЙрддреНрдкрдиреНрди рдХрд░рдХреЗ LESS рдореЗрдВ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛

рдореИрдВрдиреЗ рдПрдХ рдмрд╛рд░ рд╕реНрдЯрд╛рдЗрд▓рд┐рдВрдЧ рд▓рд┐рдВрдХ рдХреЗ рд▓рдЪреАрд▓реЗ рддрд░реАрдХреЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдерд╛ - рд╕рд┐рд░реНрдл рдкрд╛рд░рднрд╛рд╕реА рд░реЗрдЦрд╛рдВрдХрд┐рдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреИрдЯрд░реНрди рдХреЛ рдзрд░рд╛рд╢рд╛рдпреА / рдмрд┐рдВрджреАрджрд╛рд░-рд╕реАрдорд╛ рдореЗрдВ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░реЗрдВ, рд▓рд╣рд░рджрд╛рд░ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЖрдо рддреМрд░ рдкрд░ CSS3 рдХреЗ рдЯреЗрдХреНрд╕реНрдЯ-рдбреЗрдХреЛрд░реЗрд╢рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реИрдВ рдЬреЛ рдХреЛрдИ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред



рдкрд░рд┐рдгрд╛рдо LESS рдкрд░ рдбреЗрдЯрд╛-рдпреВрдЖрд░рдЖрдИ рдореЗрдВ рдПрдХ рдкреАрдПрдирдЬреА рдЬрдирд░реЗрдЯрд░ рд╣реИред

рдбреЗрдореЛ ред





рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡рд┐рдХрд▓реНрдк


рдкрд╛рд░рднрд╛рд╕реА, рдмрд┐рдВрджреАрджрд╛рд░, рдФрд░ рдмрд┐рдВрджреАрджрд╛рд░ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХреЛ border-bottom рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ рддрдм рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдкрд╛рда рдХреЗ рдХрд░реАрдм рд░реЗрдЦрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдЖрдк рдПрдХ рджреГрд╢реНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ
 <a class="link"><span>Some link text here</span></a> 
рдФрд░ span рдПрд▓рд┐рдореЗрдВрдЯ (рдпрд╛ a ) рдХреА line-height рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░реЗрдВ, рдЗрд╕реЗ display:inline-block рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░реЗрдВ display:inline-block , рд▓реЗрдХрд┐рди рдлрд┐рд░ рдорд▓реНрдЯреА-рд▓рд╛рдЗрди рдЯреЗрдХреНрд╕реНрдЯ рдкрд░ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ: inline-block рдмреЙрд░реНрдбрд░ (рджрд╛рдИрдВ рдУрд░ рдЪрд┐рддреНрд░рдг) рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмреНрд▓реЙрдХ рдмрди рдЬрд╛рддрд╛ рд╣реИред

рдкрд░рд╛рд╡рд░реНрддрди рдФрд░ рдкреНрд░рдпреЛрдЧ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЗрд╕ рдирддреАрдЬреЗ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рдХрд┐ рд╕рдмрд╕реЗ '' рд╕рд╛рдл '' рдФрд░ рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдорд╛рдзрд╛рди line-height рдмрд░рд╛рдмрд░ рдКрдБрдЪрд╛рдИ рдХреЗ рд╕рд╛рде background рдореЗрдВ рдЕрдВрдбрд░рд▓рд╛рдЗрди рдкреИрдЯрд░реНрди рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдХреЗрд╡рд▓ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ рдХрд┐ рдпрд╣ рдкреИрдЯрд░реНрди рдХрд╣рд╛рдБ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПред

рд╕рдмрд╕реЗ рддрд╛рд░реНрдХрд┐рдХ рдмрд╛рдд рдкреАрдПрдирдЬреА рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдФрд░ рдбреЗрдЯрд╛-рдпреВрдЖрд░рдЖрдИ рдореЗрдВ рдкреЗрд╕реНрдЯ рдХрд░рдирд╛ рдерд╛ред рд╕реНрдЯреИрдХрдУрд╡рд░рдлреНрд▓реЛ рдкрд░ рдПрдХ рд╕рд╡рд╛рд▓ рд╕реЗ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдкрд┐рдХреНрд╕реЗрд▓ ( рдпрд╣рд╛рдВ ) рдореЗрдВ рдПрдХ рдЬреАрдЖрдИрдПрдл рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди, рдпрд╣ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрд╣реБрдд рд╕реАрдзрд╛ рдФрд░ рдЕрдирдореНрдп: рдЗрд╕ рдЫрд╡рд┐ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рдирд╛ рдкреВрд░реЗ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ рдХрд╛рд░реНрдп рд╣реЛрдЧрд╛ред

рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдЖ рд░рд╣рд╛ рдерд╛, рдФрд░ рдореИрдВрдиреЗ рдЖрдЦрд┐рд░рдХрд╛рд░ рд▓рд┐рдВрдХ рдХреЛ рдХрдо рдХрд░рдиреЗ рдФрд░ рдкреАрдПрдирдЬреА рдХреА рдкреАрдврд╝реА рдХреЗ рд╕рд╛рде рдШрд┐рдиреМрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдирд┐рд░рд╛рд╢рд╛ рдХреЛ рд░реЛрдХрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

PNG.js


PNG , ZLIB рдбреЗрдЯрд╛ рдлреЙрд░реНрдореЗрдЯ рдФрд░ DEFLATE рдбреЗрдЯрд╛ рдлреЙрд░реНрдореЗрдЯ рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдХрдИ рдШрдВрдЯреЛрдВ рдХреЗ рдмрд╛рдж, рдкреАрдПрдирдЬреА рдХреНрд░рдордмрджреНрдзрддрд╛ рдФрд░ рдЫреЛрдЯреЗ рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ ( рдпрд╣рд╛рдВ рдХрдЪреНрдЪреА рдкреАрдПрдирдЬреА рдкреАрдврд╝реА рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг) рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг , PNG рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ js- рдХреНрд▓рд╛рд╕ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ LESS рдореЗрдВ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рдХрд╛рдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред ред

PNG рд╡рд░реНрдЧ рдЕрдиреБрдХреНрд░рдордгрд┐рдд-рд░рдВрдЧ рдпрд╛ рдмрд┐рдЯрдореИрдк (рдЕрд▓реНрдлрд╛ рдХреЗ рд╕рд╛рде truecolor) рдХреЗ рд╕рд╛рде рдЕрд╕рдореНрдкреАрдбрд┐рдд PNG рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
PNG.js usecase
 <script src="png.js"></script> <script> var png = new PNG(); png.set({ width: w, height: h, chunks: { PLTE: plte, //palette string (sequence of colors, 3 bytes per color), eg "000000ffffff" тЗТ black, white tRNS: trns //transparency string (alpha-values according to the palette colors, 1 byte per value), eg "00ff" тЗТ 0, 1 }, data: data //string of color indexes (or bitmap), 1 byte per color index, eg "00010100" тЗТ black, white, white, black }) result = png.toDataURL() //тЗТ data:image/png;base64,iV... </script> 



рд▓реЗрд╕ рдореЗрдВ рдЬреЗрдПрд╕ рдЪрд▓ рд░рд╣рд╛ рд╣реИ


рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдЬреЗрдПрд╕ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП LESS рдмрд╣реБрдд рд▓рдЪреАрд▓рд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рдореНрди рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд╛рд░реНрдп рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:
  @test: `function(a){ return a }`; test: `(@{test})(3)`; //test: 3 


Png.js рдХреЛ рдПрдХ рдкреНрд░рд╡реЗрд╢ рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рдФрд░ рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд┐рдЦрдирд╛, рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрди рдХреЛрдб рд╣реИ:
painter.less
 //Painting functions @text: black; @red: red; @green: green; .underline(@height: 20, @color: @text, @thickness: 1){ @patternGen: `function(h, thick){ var space = "", line = ""; //make line for (var i = 0; i < thick; i++){ line += "01" } //make space for (var i = 0; i < h - thick; i++){ space += "00" } return space + line; }`; @pattern: `(@{patternGen})(@{height}, @{thickness})`; .png(@stream: @pattern, @w: 1, @h: unit(@height), @color: @color); } .underline{ .underline(); } .underline.thick{ .underline(@thickness: 2); } .underline.offset{ } .underline.transparent{ .underline(@color: fade(@text, 30%), @thickness: 1); } .waved(@height: 20, @color: @red, @thickness: 2, @width: 4){ @patternGen: `function(h, w, thick){ var space = "", wave = ""; //make wave for (var y = 0; y < thick; y++){ for (var x = 0; x < w; x++){ if (x < w/2){ if (y < thick/2) { wave += "00" } else{ wave += "01" } } else { if (y < thick/2) { wave += "01" } else{ wave += "00" } } } } //make space for (var i = 0; i < (h - thick)*w; i++){ space += "00" } return space + wave; }`; @pattern: `(@{patternGen})(@{height}, @{width}, @{thickness})`; ptrn: @pattern; .png(@stream: @pattern, @w: unit(@width), @h: unit(@height), @color: @color); } .waved{ .waved(); } .waved.alt{ .waved(@color: @green, @thickness: 2, @width: 6); } .dotted(@height: 20, @color: @text, @width: 3, @thickness: 1){ @patternGen: `function(h, thick, w){ var space = "", line = ""; //make line for (var i = 0; i < thick; i++){ for(var x = 0; x < thick; x++){ line += "01"; } for(var x = thick; x < w; x++){ line += "00"; } } //make space for (var i = 0; i < (h - thick)*w; i++){ space += "00" } return space + line; }`; @pattern: `(@{patternGen})(@{height}, @{thickness}, @{width})`; .png(@stream: @pattern, @w: unit(@width), @h: unit(@height), @color: @color); } .dotted{ .dotted; } .dotted.rare{ .dotted(@width: 6); } .dotted.thick{ .dotted(@width: 6, @thickness: 2); } .dashed(@height: 20, @color: @text, @width: 8, @thickness: 1, @length: 4){ @patternGen: `function(h, thick, w, l){ var space = "", line = ""; //make line for (var i = 0; i < thick; i++){ for(var x = 0; x < l; x++){ line += "01"; } for(var x = l; x < w; x++){ line += "00"; } } //make space for (var i = 0; i < (h - thick)*w; i++){ space += "00" } return space + line; }`; @pattern: `(@{patternGen})(@{height}, @{thickness}, @{width}, @{length})`; .png(@stream: @pattern, @w: unit(@width), @h: unit(@height), @color: @color); } .dashed{ .dashed; } .dashed.rare{ .dashed(@width: 6); } .dashed.thick{ .dashed(@width: 10, @thickness: 2, @length: 6); } .dot-dashed(@height: 20, @color: @text, @width: 10, @thickness: 1){ @patternGen: `function(h, thick, w){ var space = "", line = ""; //make line for (var i = 0; i < thick; i++){ for(var x = 0; x < w; x++){ switch (true){ case (x > w*.75): line += "00"; break; case (x > w*.375): line += "01"; break; case (x > w*.125): line += "00"; break; default: line += "01"; } } } //make space for (var i = 0; i < (h - thick)*w; i++){ space += "00" } return space + line; }`; @pattern: `(@{patternGen})(@{height}, @{thickness}, @{width})`; .png(@stream: @pattern, @w: unit(@width), @h: unit(@height), @color: @color); } .dot-dashed{ .dot-dashed; } .dot-dashed.thick{ .dot-dashed(@width: 10, @thickness: 2); } .pattern(@height: 20, @color: @text, @width: 8, @thickness: 1, @length: 4, @pattern: ". -"){ } //Mixin that generates PNG to background .png(@stream: "0001", @w: 2, @h: 2, @color: black){ @r: red(@color); @g: green(@color); @b: blue(@color); @hexColor: rgb(red(@color),green(@color),blue(@color)); @PLTE: `"ffffff" + ("@{hexColor}").substr(1)`; //Make bytes palette: first-white, rest-passed color; @a: alpha(@color); @tRNS: `"ff" + (function(){ var a = Math.round(@{a} * 255).toString(16); return (a.length == 1 ? "0" + a : a) })()`; //png.js: https://github.com/dfcreative/graphics/blob/master/src/PNG.js @initPNG: `(function(){ /*...copy-pasted png.js: https://github.com/dfcreative/graphics/blob/master/src/PNG.js */)()`; @background: `(function(){ var png = new PNG(); png.set({ width: @{w}, height: @{h}, chunks:{ PLTE: @{PLTE}, tRNS: @{tRNS} }, data: @{stream} }) return "url(" + png.toDataURL() + ")"; })()`; background-image: ~"@{background}"; } .png{ .png(); } 



рдХреИрд╕реЗ рдХрд░реЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓?


1. painter.less рдХрд░реЗрдВред less.js рдФрд░ рдХрдо less.js , рдЬреИрд╕рд╛ рдХрд┐ рдбреЗрдореЛ рдореЗрдВ рд╣реИ

 <link rel="stylesheet/less" type="text/css" href="painter.less" /> <script src="less.js" type="text/javascript"></script> 


2. рдЕрд╡рдзрд┐ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

 <span class="underline"> </span> <span class="underline thick">c </span> <span class="underline offset"> </span> <span class="underline transparent"> </span> <span class="waved"> </span> <span class="waved alt">  2</span> <span class="dotted">  </span> <span class="dotted rare">  </span> <span class="dotted thick">  </span> <span class="dashed"> </span> <span class="dashed thick">  </span> <span class="dot-dashed">- </span> 


3. рдЙрдкрд▓рдмреНрдз рдорд┐рд╢реНрд░рдг:



рдЖрдк .png(@stream: "0001", @w: 2, @h: 2, @color: black) рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реАрдзреЗ рдЕрдиреБрдХреНрд░рдорд┐рдд рд░рдВрдЧреЛрдВ рдХреЗ рдмрд┐рдЯрд╕реНрдЯреНрд░реАрдо рднреЗрдЬрддреЗ рд╣реИрдВред

рдирд┐рдЪрд▓рд╛ рд░реЗрдЦрд╛: рдбреЗрдореЛ , рдЬреАрдердм рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА ред

Source: https://habr.com/ru/post/In181746/


All Articles