рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЪреИрдореНрдкрд┐рдпрдирд╢рд┐рдк рдореЗрдВ рдореЗрд░реА рднрд╛рдЧреАрджрд╛рд░реА рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИред рдореИрдВрдиреЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ 6 рдореЗрдВ рд╕реЗ 4 рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдФрд░ 20 рд╡реЗрдВ рд╕реНрдерд╛рди рдкрд░ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЙрдореНрдореАрджреЗрдВ рдереАрдВ рдХрд┐ рд╢реАрд░реНрд╖ 20 рднреА рдлрд╛рдЗрдирд▓ рдореЗрдВ рд╣реЛрдВрдЧреЗред
рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЯреЙрдк 100 рдореЗрдВ рднреА рдирд╣реАрдВ рдЖ рдкрд╛рдпрд╛ред рд▓рдбрд╝рд╛рдИ рдХреЗ рдмрд╛рдж, рд╡реЗ рдЕрдкрдиреА рдореБрдЯреНрдареА рдирд╣реАрдВ рд╣рд┐рд▓рд╛рддреЗ, рд▓реЗрдХрд┐рди рдореИрдВ рдХрдИ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдП рдЧрдП рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдореИрдВ рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдореЗрдВ рд▓рд╛рддрд╛ рд╣реВрдВред
рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдорджрдж рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдзрдиреНрдпрд╡рд╛рдж:
рдЪрдорддреНрдХрд╛рд░ toster.ru/user/miraageprofesor08 toster.ru/user/profesor08SmthTo toster.ru/user/SmthToRAX7 toster.ru/user/RAX7dimoff66 toster.ru/user/dimoff66vk.com/vladilen.mininрдлрд╛рдЗрдирд▓ рд░рд╛рдЙрдВрдб
A. рд╕рдорд╛рдВрддрд░ рдмреНрд░рд╣реНрдорд╛рдВрдб рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдПрдкреАрдЖрдИред (15 рдЕрдВрдХ)
рд╕реНрдерд┐рддрд┐редрдЖрдкрдХреЗ рд╕рд╛рдереА рд╕рдорд╛рдирд╛рдВрддрд░ рдмреНрд░рд╣реНрдорд╛рдВрдб рдбреЗрд╡рд▓рдкрд░ рдиреЗ рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдирдпрд╛ рдЕрдВрддрд░рд┐рдХреНрд╖ рдпрд╛рди рдирд┐рдпрдВрддреНрд░рдг рдкреБрд╕реНрддрдХрд╛рд▓рдп рднреЗрдЬрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдЕрдВрддрд░рд┐рдХреНрд╖ рдпрд╛рди рдПрдХ рдЬрдЯрд┐рд▓ рдЪреАрдЬ рд╣реИ, рдлрд┐рд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдПрдкреАрдЖрдИ "рд╡рдЬрдирджрд╛рд░" рд╣реИ, рддрд░реАрдХреЛрдВ рдХреА рд╕рдЯреАрдХ рд╕рдВрдЦреНрдпрд╛ рдЕрдЬреНрдЮрд╛рдд рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреЛрдИ рдкреНрд░рд▓реЗрдЦрди рдирд╣реАрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рдмреНрд░рд╣реНрдорд╛рдВрдб рдореЗрдВ, рд▓реЛрдЧ рдЫрдд рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ, рджрд┐рди рдореЗрдВ рд╕реЛрддреЗ рд╣реИрдВ, рд░рд╛рдд рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдореЗрд╢рд╛ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЕрдЬреАрдм рд▓реЛрдЧ! рдпрд╣рд╛рдВ рдкреГрдереНрд╡реА рдкрд░, рд▓рдВрдмреЗ рд╕рдордп рддрдХ, рд╣рд░ рдХреЛрдИ рд╡рд╛рджреЛрдВ рдкрд░ рд▓рд┐рдЦрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд░реИрдкрд░ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рдЬреЛ рд╕рдорд╛рди рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╡рд╛рджреЛрдВ рдкрд░ред
рдЗрдирдкреБрдЯ рдкреНрд░рд╛рд░реВрдк
рдЙрджрд╛рд╣рд░рдг рд╕реНрд░реЛрдд API:
const api = { a: { b: { c: callback => setTimeout(() => callback(null, 'hello'), 100) } }, aa: { bb: (callback, x, y) => setTimeout(() => callback(null, x + y), 200) } };
рдЖрдЙрдЯрдкреБрдЯ рд╕реНрд╡рд░реВрдк
рдЕрдкрдирд╛ рд╕рдорд╛рдзрд╛рди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВ:
module.exports = function promisify(api) {
рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
const promisedApi = promisify(api); promisedApi.abc() .then(res => console.log(res));
рдиреЛрдЯ
рд╕реНрд░реЛрдд рдПрдкреАрдЖрдИ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд░реИрдкрд░ рдХреЛ рдПрдХ рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреЙрд▓рдмреИрдХ рд╣рдореЗрд╢рд╛ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ:
callback(error, data)
рдореВрд▓ API рдореЗрдВ, рд╕реНрдерд┐рд░рд╛рдВрдХ (рд╕рдВрдЦреНрдпрд╛рдПрдБ, рддрд╛рд░ рдФрд░ рдмреВрд▓рд┐рдпрди) рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рд▓реМрдЯрд╛рдирд╛ рд╣реЛрдЧрд╛:
api.foo.myConst = 1; promisedApi.foo.myConst === 1;
рдЖрд╡рд░рдг рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдХреЛ "рдЖрд▓рд╕реА" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: рд╕реНрд░реЛрдд рдПрдкреАрдЖрдИ рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдирд╛рдо рд╕реНрдерд╛рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЬреИрд╕реЗ рд╣реА рдЖрдк рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдирд┐рд░реНрдгрдпрдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдореЗрдВ рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдФрд░ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП 15 рдореЗрдВ рд╕реЗ 12.86 рдЕрдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдПред рдореИрдВрдиреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рднреА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рддреЛ рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрдВред
рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрдВрдд рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдкреНрд░реЙрдХреНрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджрд┐рдпрд╛ред рдХреЗрд╡рд▓ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдиреЗ рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ред рдиреАрдЪреЗ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдЦрд╛рддреЗ рдореЗрдВ рд╕реБрдзрд╛рд░ рд▓реЗ рд░рд╣рд╛ рд╣реИред
function promisify (obj) { const cache = {} return new Proxy(obj, { get (target, prop) { const value = target[prop] const type = Object.prototype.toString.call(value) if (type === '[object Object]') { cache[prop] = promisify(value)
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдиреЛрдб js рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рддрд░рд╣ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИ
рдиреЛрдбрдЬреНрд╕.org /
dist /
latest-v8.x /
docs /
api /
util.html#util_util_promisify_original , рдХреЗрд╡рд▓ рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдХреЙрд▓рдмреИрдХ рдЕрдВрддрд┐рдо рддрд░реНрдХ рд╣реИ, рдФрд░ рдкрд╣рд▓рд╛ рдирд╣реАрдВ рд╣реИред
рд╕рднреА рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ:
learn.javascript.ru/proxywww.youtube.com/watch?v=np08WdS9OXgB. рд╕рд╛рдкреНрддрд╛рд╣рд┐рдХ рдЗрдВрдЯрд░реНрди (15 рдЕрдВрдХ)
рд╕реНрдерд┐рддрд┐редрдпрд╛рдВрдбреЗрдХреНрд╕ рдЯреАрдо рдореЗрдВ рдПрдХ рдкреНрд░рд╢рд┐рдХреНрд╖реБ рд╕реНрдЯреАрдлрди рд╣реИред рд╕рдордп рдкрд╣рд▓реЗ рд╣реА рд╕рдорд╛рдкреНрдд рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕рдХреЗ рдкрд╛рд╕ рдкреЗрдЬ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рд╕рдордп рдирд╣реАрдВ рд╣реИред рд╕реНрдЯреАрдлрди рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓реЗрдЖрдЙрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВред
рдкреГрд╖реНрда рдХреЗ рдмрд╛рдПрдВ рдФрд░ рдКрдкрд░реА рдХрд┐рдирд╛рд░реЛрдВ рд╕реЗ рд▓реЗрдЖрдЙрдЯ рдкрд░ рдХреЛрдИ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рд▓реЗрдЖрдЙрдЯ рд╣реИ:

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рджреЛ рдЖрдХрд╛рд░ рдХреА рдЯрд╛рдЗрд▓реЗрдВ рд╣реИрдВ: рдорд╛рдирдХ рдФрд░ рдбрдмрд▓ред рдорд╛рдирдХ рдЯрд╛рдЗрд▓ рд╕реНрдХреНрд░реАрди рдЪреМрдбрд╝рд╛рдИ рдХреЗ 1/3 рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддреА рд╣реИ, рдбрдмрд▓ - 2/3ред рдирд┐рд╢реНрдЪрд┐рдд рдЯрд╛рдЗрд▓ рдХреА рдКрдБрдЪрд╛рдИ - 200pxред рдЯрд╛рдЗрд▓реНрд╕ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА 20 рдкрд┐рдХреНрд╕реЗрд▓ рд╣реИред
рдорд╛рдирдХ рдЯрд╛рдЗрд▓ рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛ рд░рдВрдЧ # 8a2be2 рд╣реИ, рджреЛрд╣рд░реЗ рдХрд╛ рд░рдВрдЧ # 000 рд╣реИред
рдирддреАрдЬрддрди, рдЖрдкрдХреЛ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдПрдХ HTML рдкреГрд╖реНрда рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреГрд╖реНрда рдХрд╛ рдЖрдХрд╛рд░ 10 рдХреЗрдмреА рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ:
рдХреЗрд╡рд▓ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдФрд░ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ;
рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд HTML рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХреА рдЧрдИ рдереА:
github.com/vito2005/YandexCompetition/blob/master/final-2019/B/original.htmlрдирд┐рд░реНрдгрдпрд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЖрдк рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдлрд┐рд░ рднреА рдЗрд╕реЗ рдПрдХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ред
рдлрд╝рд╛рдЗрд▓ рд╡рдЬрди рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдХрдЕрдк рд╕реЗ рдлреЛрдВрдЯ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ред
рдлрд┐рд░ рдЙрд╕рдиреЗ 6 рдбрд┐рд╡ рдЬреЛрдбрд╝реЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд░реИрдкрд░ рдореЗрдВ рд▓рдкреЗрдЯ рджрд┐рдпрд╛ред
рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореЗрдХрдЕрдк: рдЧреНрд░рд┐рдб
рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ:
<html> <head> <meta charset="utf-8"/> <meta http-equiv="X-UA-Compatible" content="IE=edge"/> <style> body { margin: 0; padding: 0; } .wrapper { display: grid; grid-template-columns: repeat(3, 1fr); grid-gap: 20px; } .banner1, .banner2, .banner3, .banner4, .banner7 { background: #8a2be2; height: 200px; } .banner5 { background: #000; grid-column: 2 / 4; } .banner6 { background: #000; grid-column: 1 / 3; } </style> </head> <body> <div class="wrapper"> <div class="banner1"></div> <div class="banner2"></div> <div class="banner3"></div> <div class="banner4"></div> <div class="banner5"></div> <div class="banner6"></div> <div class="banner7"></div> </div> </body> </html>
C. рд╕рд╣реА рдЖрдпрдд (40 рдЕрдВрдХ)
рд╕реНрдерд┐рддрд┐редрдмреЙрдм рдПрдХ тАЛтАЛрдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рд╡рд╛рджреА рдХрд▓рд╛рдХрд╛рд░ рд╣реИрдВред рдЙрдирдХреЗ рд╕рднреА рдХрд╛рдо рдПрдХ рд╕рдлреЗрдж рдкреГрд╖реНрдарднреВрдорд┐ рдкрд░ рд╕рдЦреНрддреА рд╕реЗ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдЖрдпрддреЛрдВ рдХреЗ рд░рдВрдЧ рдХреЗ рд╣реИрдВред
рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдЙрдирдХрд╛ рдХрд╛рдо рдкреНрд░рд╕рд┐рджреНрдз рдкрддреНрд░рд┐рдХрд╛ рдЯреЙрдк рдЖрд░реНрдЯ рдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реБрдЖред рдмреЙрдм рдиреЗ рдЕрдкрдиреЗ рдХреИрдирд╡рд╕ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдкреГрд╖реНрда рдкрд░ рдЬрд╝реВрдо рдХрд┐рдпрд╛ рдФрд░ рдЕрдкрдиреЗ рд╕рд╣реА рдЖрдпрддреЛрдВ рдХреЗ рдзреБрдВрдзрд▓реЗ рдХреЛрдиреЛрдВ рдФрд░ рдлрд╝рдЬрд╝реА рдХрд┐рдирд╛рд░реЛрдВ рд╕реЗ рднрдпрднреАрдд рдерд╛ред
рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрджрдореА рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ, рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рдФрд░ рдЕрдкрдиреА рдЙрддреНрдХреГрд╖реНрдЯ рдХреГрддрд┐рдпреЛрдВ рдХреЛ HTML рдореЗрдВ рдмрджрд▓рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рддрд╛рдХрд┐ рд▓рд╛рдЗрдиреЗрдВ рдХрд┐рд╕реА рднреА рдХреЛрдг рдФрд░ рдХрд┐рд╕реА рднреА рдкреИрдорд╛рдиреЗ рдкрд░ рдкрд░рд┐рдкреВрд░реНрдг рд░рд╣реЗрдВред рдЕрдкрдиреА рдпреЛрдЬрдирд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЛрдВрдиреЗ рдЖрдкрдХреЛ рдЪреБрдирд╛ред
рдЙрд╕рдХреЗ рд▓рд┐рдП рдРрд╕реА рд╕реЗрд╡рд╛ рд▓рд┐рдЦреЗрдВ рдЬреЛ рдЪрд┐рддреНрд░реЛрдВ рд╕реЗ html рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХреЗред
рдЗрдирдкреБрдЯ рдкреНрд░рд╛рд░реВрдк
рдЗрдирдкреБрдЯ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмреЗрд╕ 64 рдореЗрдВ рдПрдХ рдЪрд┐рддреНрд░ рд╣реЛрддрд╛ рд╣реИ
рдЖрдЙрдЯрдкреБрдЯ рд╕реНрд╡рд░реВрдк
рдЯреНрд░реЗрд╕рдЗрдореЗрдЬ рдлрд╝рдВрдХреНрд╢рди рд▓реМрдЯрд╛рдПрдВ, рдЬреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рддреНрд░ рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рд╡рд╛рджрд╛ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рд▓рд╛рдЗрди рдореЗрдВ рдПрдХ рд▓реЗрдЖрдЙрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЗрд╕ рддрд╕реНрд╡реАрд░ рдХреЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИред
рдЕрдкрдирд╛ рд╕рдорд╛рдзрд╛рди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВ:
function traceImage(imageSrc) {
рдиреЛрдЯ
рдЪрд┐рддреНрд░ рдХрд┐рд╕реА рднреА рдЖрдХрд╛рд░ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рддрд╕реНрд╡реАрд░ рдкрд╛рд░рджрд░реНрд╢реА рдирд╣реАрдВ рд╣реИ
рдЦрд╛рд▓реА рдкрд┐рдХреНрд╕реЗрд▓ рд░рдВрдЧ - рд╕рдлреЗрдж (рдЖрд░, рдЬреА, рдмреА): (255, 255, 255)
рдЫрд╡рд┐ 1 рд░рдВрдЧреАрди рдЕрдкрд╛рд░рджрд░реНрд╢реА рдЖрдпрдд рджрд┐рдЦрд╛рддреА рд╣реИ
рд╕рднреА рд▓рд╛рдЗрдиреЗрдВ рдХреНрд╖реИрддрд┐рдЬ рдпрд╛ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╣реИрдВред
рдХреЛрдб рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ
рдЙрджрд╛рд╣рд░рдг
рдЪрд┐рддреНрд░ рдХреЛ рдмреЗрд╕ 64 рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЬрд┐рд╕ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛):
gist.github.com/senaev/50460323558db543256cb7f196e7d81d
рдРрд╕реА рддрд╕реНрд╡реАрд░ рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рд▓рд╛рдЗрди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
<div> <div style=" position: absolute; width: 11px; height: 15px; top: 135px; left: 109px; background-color: rgb(255, 255, 0); "></div> </div>
рдирд┐рд░реНрдгрдпрд╕рдорд╛рдзрд╛рди рдХрд╛ рд╕рд╛рд░ рдЫрд╡рд┐ рдХреЛ рдлрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреИрдирд╡рд╛рд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рд╡рд╣рд╛рдВ рдПрдХ рдЪрд┐рддреНрд░ рдмрдирд╛рдПрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд░рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП getImageData рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рдлрд┐рд░ рдпрд╣ рдКрдкрд░реА рдмрд╛рдПрдБ рдХрд┐рдирд╛рд░реЗ рд╕реЗ рдкрд┐рдХреНрд╕реЗрд▓ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдЬрдм рддрдХ рдЖрдкрдХреЛ рдПрдХ рд╕рдлреЗрдж рдкрд┐рдХреНрд╕реЗрд▓ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ред рдЕрдЧрд▓рд╛, рдХреНрд╖реИрддрд┐рдЬ рдФрд░ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдХреБрд▓реНрд╣рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЙрд░реНрдЯ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВ рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдлрд┐рд░ рд╕реЗ рдПрдХ рд╕рдлреЗрдж рдкрд┐рдХреНрд╕реЗрд▓ рдХрд╛ рд╕рд╛рдордирд╛ рди рдХрд░реЗрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЖрдпрдд рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рдорд┐рд▓рддреА рд╣реИред
рдпрд╣ рдЖрд▓реЗрдЦ рдХреИрдирд╡рд╛рд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ getImageData рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рд╡рд░рдг рджреЗрддрд╛ рд╣реИред
code.tutsplus.com/ru/tutorials/canvas-from-scratch-pixel-manipulation--net-20573рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореЗрд░реЗ рдХреЛрдб рдиреЗ рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдФрд░ 40 рдореЗрдВ рд╕реЗ 30 рдЕрдВрдХ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдП, рдФрд░ рдореИрдВ рдЕрднреА рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдирд╣реАрдВ рд╕рдордЭ рд╕рдХрд╛, рдпрджрд┐ рдЖрдк рдХрдорд┐рдпреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдореИрдВ рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛:
function traceImage (imgSrc) { function loadImg (src) { return new Promise((resolve, reject) => { if (typeof src !== 'string') reject('wrong data') const img = new Image() img.addEventListener('load', () => resolve(img)) img.addEventListener('error', err => reject(err)) img.src = src }) } function calcElementFromImage (img) { const TRANSPARENT_COLOR = [255, 255, 255, 1] const colorFromData = (data, i) => { return [data[i], data[i + 1], data[i + 2], data[i + 3] / 255] } const w = img.naturalWidth const h = img.naturalHeight const canvas = document.createElement('canvas') canvas.width = w canvas.height = h const ctx = canvas.getContext('2d') ctx.drawImage(img, 0, 0, w, h) const data = ctx.getImageData(0, 0, w, h).data let top, left, bgColor let lastIndex = 0 for (let i = lastIndex; i < data.length; i += 4) { const color = colorFromData(data, i) if (!color.every((c, i) => c === TRANSPARENT_COLOR[i])) { const px = i / 4 left = px % w top = px / w | 0 bgColor = color lastIndex = i break } } let width const maxLeftIndex = (w - left) * 4 + lastIndex for (let i = lastIndex; i < maxLeftIndex; i += 4) { const color = colorFromData(data, i) if (color.every((c, i) => c === TRANSPARENT_COLOR[i])) { const x = i / 4 % w width = x - left break } } let height const maxTopIndex = (h - top - 1) * w * 4 + lastIndex const hStep = w * 4 for (let i = lastIndex; i < maxTopIndex; i += hStep) { const color = colorFromData(data, i) if (color.every((c, i) => c === TRANSPARENT_COLOR[i])) { const y = i / 4 / w | 0 height = y - top break } } bgColor = Object.values(bgColor).join(',') return { parentWidth: w, parentHeight: h, top, left, width, height, bgColor } } return loadImg(imgSrc).then(img => { const data = calcElementFromImage(img) const { parentWidth, parentHeight, top, left, width, height, bgColor } = data const div = `<div style=" position: relative; width: ${parentWidth}px; height: ${parentHeight}px;"> <div style=" position: absolute; top: ${top}px; left: ${left}px; width: ${width}px; height: ${height}px; background-color: rgba(${bgColor})"></div> </div>` return Promise.resolve(div) }) }
рдбреАред рд╣реЙрд░реНрд╕рдмреИрдХ рд░рд╛рдЗрдбрд┐рдВрдЧ (40 рдЕрдВрдХ)ред
рд╕реНрдерд┐рддрд┐редрдЧреЗрдиреНрдиреЗрдбреА рдПрдХ рдмреБрджреНрдзрд┐рдЬреАрд╡реА рд╣реИрдВред рдЙрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд▓реЛрдЧреЛрдВ рд╕реЗ рдорд┐рд▓рдирд╛ рдкрд╕рдВрдж рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рд╡рд┐рд╡реЗрдХрдкреВрд░реНрдг рдФрд░ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╡реНрдпрдХреНрддрд┐ рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ, рд╡рд╣ рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓ рд╣реА рдореЗрдВ, Gennady рдиреЗ рдкрд╛рдпрд╛ рдХрд┐ IQ рдореЗрдВ рддреБрд▓рдиреАрдп рдЗрдВрдЯрд░рдХреЛрдХреНрдпреВрдЯрд░реНрд╕ рд╢рддрд░рдВрдЬ рдордВрдЪ рдкрд░ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрд░реЗрд╢рд╛рдиреА рдпрд╣ рд╣реИ рдХрд┐ Gennady рд╢рддрд░рдВрдЬ рдЦреЗрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╕рднреА рд╢рд┐рдХреНрд╖рдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ, рдЬреЛ Gennady рд╡рд╛рдпрд░рд╕ рдХреЛ рд▓реЗрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдирдореНрд░рддрд╛рдкреВрд░реНрд╡рдХ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред
рдЧреЗрдиреНрдиреЗрдбреА рдХреА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдмрд┐рдирд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╢рддрд░рдВрдЬ рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рдЬрд┐рд╕рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдШреЛрдбрд╝рд╛ рдХреИрд╕реЗ рдЪрд▓рддрд╛ рд╣реИред рд╢рд┐рдХреНрд╖рдХ рдХреЛ рд╢рддрд░рдВрдЬ рдХреА рдмрд┐рд╕рд╛рдд рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдПред рдЖрдк рдкрд┐рдВрдЬрд░реЗ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ - рд╡реЗ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдШреЛрдбрд╝рд╛ рдЗрд╕ рдкрд┐рдВрдЬрд░реЗ рд╕реЗ рдХрд╣рд╛рдБ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрдирдкреБрдЯ рдкреНрд░рд╛рд░реВрдк
html- рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдЬрдм рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдПрдХ рд╢рддрд░рдВрдЬ рдХреА рдмрд┐рд╕рд╛рдд рд╣реИ
рдЖрдЙрдЯрдкреБрдЯ рд╕реНрд╡рд░реВрдк
рдХрд╛рд░реНрдп рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ (Chrome 77) рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЖрдкрдХрд╛ html рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд▓реЛрдб рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд░реЛрдмреЛрдЯ рд╢рддрд░рдВрдЬ рдХреНрд╖реЗрддреНрд░ рдХреА рд╡рд┐рднрд┐рдиреНрди рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреНрд▓рд┐рдХ рдХреЗ рдмрд╛рдж рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд▓реЗрддрд╛ рд╣реИред
рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреЛ рд╕рдВрджрд░реНрдн рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
рдЙрджрд╛рд╣рд░рдг

рдиреЛрдЯ
- рд╕реАрдПрд╕рдПрд╕ рдФрд░ HTML рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- рдкреВрд░реЗ рд▓реЗрдЖрдЙрдЯ рдХреЛ рдЪреМрдХреЛрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрд┐рдирд╛ рдЫрд╛рдпрд╛, рдЧреНрд░реЗрдбрд┐рдПрдВрдЯреНрд╕, рдлрд╝рд┐рд▓реЗрд▓реЗрдЯреНрд╕ рдЖрджрд┐ред
- рд╕реЗрд▓ рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдБрдЪрд╛рдИ - 30 рдкрд┐рдХреНрд╕реЗрд▓
- рд╢рддрд░рдВрдЬ рдХреНрд╖реЗрддреНрд░ рдкреГрд╖реНрда рдкрд░ рдмрд╛рдИрдВ рдУрд░ рд╢реАрд░реНрд╖ рдкрд░ рд╣реИ, рдмрд┐рдирд╛ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдХреЗ
- рдЪрдпрдирд┐рдд рд╕реЗрд▓ рд░рдВрдЧ # .0000
- рд╕реЗрд▓ рдХрд╛ рд░рдВрдЧ рдЬреЛ # 0000ямА рдХрд╛ рдЖрдВрдХрдбрд╝рд╛ рджреЗрддрд╛ рд╣реИ рд╡рд╣ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
- рд▓рд╛рдЗрдЯ рд╕реЗрд▓ рдХрд▓рд░ # f4cd8d
- рдбрд╛рд░реНрдХ рд╕реЗрд▓ рд░рдВрдЧред # 745853
- рдКрдкрд░реА рд╕реЗрд▓ рдкреНрд░рдХрд╛рд╢ рдЫреЛрдбрд╝ рджрд┐рдпрд╛
- рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ рдХреЛрдИ рд╕реЗрд▓ рдЪрдпрдирд┐рдд рдирд╣реАрдВ рд╣реИ
рдЪрдпрди рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реЗрд▓ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЕрдЧрд▓реЗ рдХреНрд▓рд┐рдХ рддрдХ рд░рд╣рддрд╛ рд╣реИ
рдирд┐рд░реНрдгрдпрджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд 4 рдШрдВрдЯреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдерд╛, рдореИрдВ рд▓реЗрдЖрдЙрдЯ рдмрдирд╛рдиреЗ рдФрд░ рд╕реЗрд▓ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рдФрд░ рдЯреВрд░реНрдирд╛рдореЗрдВрдЯ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА, рдордВрдЪреЛрдВ рд╕реЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдХреА рдорджрдж рдХреЗ рдмрд┐рдирд╛, рдореИрдВрдиреЗ рдлрд┐рд░ рднреА рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ред
рддреЛ, рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдкреНрд░рдХрд╛рд░ = рд░реЗрдбрд┐рдпреЛ рдХреЛ рдЬрдЧрд╣ рджреА рдЧрдИ рдереА, рдЙрдиреНрд╣реЗрдВ рдПрдХ рд▓реЗрдмрд▓ рдмрд╛рдВрдзреЗрдВ, рд▓реЗрдЖрдЙрдЯ рдХреЛ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЗрдЯ рдХрд░реЗрдВ: рдЧреНрд░рд┐рдб рдФрд░ рдЧреНрд░рд┐рдб-рдЯреЗрдореНрдкрд▓реЗрдЯ-рдХреЙрд▓рдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕реЗ 8 рдХреЙрд▓рдо рдореЗрдВ рддреЛрдбрд╝рдирд╛: рджреЛрд╣рд░рд╛рдирд╛ (8, 30 рдкреАрдПрдХреНрд╕)ред рдореИрдВрдиреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдШреЛрдбрд╝реЗ рдХреА рдЪрд╛рд▓ рдХреЗ рд▓рд┐рдП рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╕рдордп рдмрд┐рддрд╛рдпрд╛ред
рдХрдард┐рдирд╛рдИ рдпрд╣ рдереА рдХрд┐ рд╕реАрдПрд╕рдПрд╕ рдореЗрдВ рдЖрдк рдкрд┐рдЫрд▓реЗ рддрддреНрд╡реЛрдВ рдХреЛ рд╕реНрдЯрд╛рдЗрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
рдФрд░ рдпрд╣ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рд▓ рдирд╣реАрдВ рд╣реИ (рдЬрдм рд╕реНрдЯрд╛рдЗрд▓ рдХреЛ рдкрд┐рдЫрд▓реЗ рдФрд░ рдмрд╛рдж рджреЛрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ)ред
рдЗрд╕рд▓рд┐рдП, рдорд╛рд░реНрдХрдЕрдк рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЫрджреНрдо рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЬреЛ рдХрд┐ рдкреВрд░реНрдг рдФрд░ рдкреЛрд╕реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд░реИрдЦрд┐рдХ рдврд╛рд▓ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рдореБрдЭреЗ рдмрд╣реБрдд рд╕рдордп рд▓рдЧ рдЧрдпрд╛ рдФрд░ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рдХреА рд╕рд▓рд╛рд╣ рджреА рдЧрдИ рдереА: рдЪрдпрдирд┐рдд рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдиреАрд▓реЗ рд░рдВрдЧ рдХреЗ 8 рд╢реЗрдб рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдЙрд╕реА рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗрдВред
рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style>.white { background: #f4cd8d; } .black { background: #746864; } body { margin: 0; display: flex } div { display: grid; grid-template-columns: repeat(8, 30px); overflow: hidden; } input { display: none; } label { width: 30px; height: 30px; background: #f4cd8d; display: block; position: relative; } input[type="radio"]:checked + label { background: #FF0000; box-shadow: -30px -60px 0 0 #0000FF, -60px -30px 0 0 #0000FF, 30px -60px 0 0 #0000FF, 60px -30px 0 0 #0000FF, -30px 60px 0 0 #0000FF, -60px 30px 0 0 #0000FF, 30px 60px 0 0 #0000FF, 60px 30px 0 0 #0000FF; z-index: 100; position: relative; } </style> </head> <body> <div> <input type="radio" name="tag" id="a1"> <label class="white a1" for="a1"></label> <input type="radio" name="tag" id="b1"> <label class="black b1" for="b1"></label> <input type="radio" name="tag" id="c1"> <label class="white c1" for="c1"></label> <input type="radio" name="tag" id="d1"> <label class="black d1" for="d1"></label> <input type="radio" name="tag" id="e1"> <label class="white e1" for="e1"></label> <input type="radio" name="tag" id="f1"> <label class="black f1" for="f1"></label> <input type="radio" name="tag" id="g1"> <label class="white g1" for="g1"></label> <input type="radio" name="tag" id="h1"> <label class="black h1" for="h1"></label> ........... ........... <input type="radio" name="tag" id="a8"> <label class="black a8" for="a8"></label> <input type="radio" name="tag" id="b8"> <label class="white b8" for="b8"></label> <input type="radio" name="tag" id="c8"> <label class="black c8" for="c8"></label> <input type="radio" name="tag" id="d8"> <label class="white d8" for="d8"></label> <input type="radio" name="tag" id="e8"> <label class="black e8" for="e8"></label> <input type="radio" name="tag" id="f8"> <label class="white f8" for="f8"></label> <input type="radio" name="tag" id="g8"> <label class="black g8" for="g8"></label> <input type="radio" name="tag" id="h8"> <label class="white h8" for="h8"></label> </div> </body> </html>
рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХрдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП ...