{"id":4743,"date":"2023-05-15T04:12:46","date_gmt":"2023-05-14T19:12:46","guid":{"rendered":"https:\/\/engineering.webstudio168.jp\/?p=4743"},"modified":"2023-05-15T19:37:16","modified_gmt":"2023-05-15T10:37:16","slug":"cat-playing-tablet-app-by-web-browser","status":"publish","type":"post","link":"https:\/\/engineering.webstudio168.jp\/blog\/cat-playing-tablet-app-by-web-browser\/","title":{"rendered":"\u3010\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u4e0d\u8981\uff01\u3011\u732b\u304c\u559c\u3093\u3067\u904a\u3076\uff08\u304b\u3082\u3057\u308c\u306a\u3044\uff09\u7121\u6599\u30d6\u30e9\u30a6\u30b6\u30a2\u30d7\u30ea\u300c\u306c\u3042\u3074\u3063\u3074\u300d\uff08\u5bfe\u5fdc\uff1aPC, iPad, Android\u30bf\u30d6\u30ec\u30c3\u30c8\uff09"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_87_1 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u76ee\u6b21<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/engineering.webstudio168.jp\/blog\/cat-playing-tablet-app-by-web-browser\/#%E3%80%8C%E3%81%AC%E3%81%82%E3%81%B4%E3%81%A3%E3%81%B4%E3%80%8D%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9\" >\u300c\u306c\u3042\u3074\u3063\u3074\u300d\u306e\u4f7f\u3044\u65b9<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/engineering.webstudio168.jp\/blog\/cat-playing-tablet-app-by-web-browser\/#%E7%8C%AB%E5%B0%82%E7%94%A8%E3%80%8C%E3%81%AC%E3%81%82%E3%81%B4%E3%81%A3%E3%81%B4%E3%80%8D\" >\u732b\u5c02\u7528\u300c\u306c\u3042\u3074\u3063\u3074\u300d<\/a><\/li><\/ul><\/nav><\/div>\n\n<p class=\"wp-block-paragraph\">\u6211\u304c\u5bb6\u306b\u306f\u732b\u304c2\u5339\u304b\u308f\u3044\u3044\u5b50\u304c\u3044\u308b\u306e\u3067\u3059\u304c\u3001PC\u306b\u4e0a\u304c\u3063\u3066\u304d\u3066\u90aa\u9b54\u3070\u304b\u308a\u3057\u3066\u304d\u307e\u3059\u7b11\u3002<br>\u30ad\u30fc\u30dc\u30fc\u30c9\u306f\u8e0f\u3080\u3057\u3001\u753b\u9762\u306f\u898b\u3048\u306a\u3044\u308f\u3067\u4f5c\u696d\u306b\u306a\u308a\u307e\u305b\u3093\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u305d\u3053\u3067\u3001\u767a\u60f3\u3092\u5909\u3048\u3066\u3082\u3046\u904a\u3093\u3067\u3082\u3089\u3063\u3061\u3083\u3048\u3063\u3066\u3053\u3068\u3067JavaScript\u3067\u732b\u304c\u597d\u304d\u305d\u3046\u306a\u753b\u9762\u3092\u63cf\u753b\u3059\u308b\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u66f8\u304d\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u732b\u30e9\u30d6\u306a\u307f\u306a\u3055\u3093\u3082\u8a66\u3057\u306b\u8868\u793a\u3055\u305b\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002\u3046\u3061\u306e\u732b\u306f1\u5206\u3067\u98fd\u304d\u305f\u6a21\u69d8www<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E3%80%8C%E3%81%AC%E3%81%82%E3%81%B4%E3%81%A3%E3%81%B4%E3%80%8D%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9\"><\/span>\u300c\u306c\u3042\u3074\u3063\u3074\u300d\u306e\u4f7f\u3044\u65b9<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u3010\u63a8\u5968\u74b0\u5883\u3011<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Google Chrome<\/li>\n\n\n\n<li>19\u30a4\u30f3\u30c1\u4ee5\u4e0a\u306e\u30e2\u30cb\u30bf\u30fc<\/li>\n\n\n\n<li>\u6ce8\u610f\uff09iPhone\u3067\u306f\u4e8b\u60c5\u306b\u3088\u308a\u5bfe\u5fdc\u3057\u3066\u3044\u307e\u305b\u3093\u3001\u3001\u3001<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u2460\u30b9\u30bf\u30fc\u30c8\u30dc\u30bf\u30f3\u3092\u62bc\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2461\u773a\u3081\u307e\u3059\u3002\u904a\u3070\u305b\u3066\u307f\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2462\u30af\u30ea\u30c3\u30af\u3059\u308b\u3068\u7d42\u4e86\u3057\u307e\u3059\u3002\u307e\u305f\u3084\u3063\u3066\u307f\u305f\u3044\u6642\u306f\u30b9\u30bf\u30fc\u30c8\u3092\u62bc\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E7%8C%AB%E5%B0%82%E7%94%A8%E3%80%8C%E3%81%AC%E3%81%82%E3%81%B4%E3%81%A3%E3%81%B4%E3%80%8D\"><\/span>\u732b\u5c02\u7528\u300c\u306c\u3042\u3074\u3063\u3074\u300d<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\" id=\"startBtn\"><a class=\"wp-block-button__link wp-element-button\">\u30b9\u30bf\u30fc\u30c8\uff01\uff01(=^\u30fb^=)<\/a><\/div>\n<\/div>\n\n\n\n<style>\n.square {\n  width: 25px;\n  height: 25px;\n  background-color: blue;\n  position: fixed;\n  z-index: 9999;\n border-radius: 50%;\n  background-color: rgba(255, 0, 0, 0.7);\n  box-shadow: 0 0 10px 10px rgba(255, 0, 0, 0.7) inset;\n  animation: pulse 2s ease-out infinite;\n}\n@keyframes pulse {\n  0% {\n    box-shadow: 0 0 0 20px rgba(255, 0, 0, 0.2) inset;\n  }\n  100% {\nbox-shadow: 0 0 0 0 rgba(255, 0, 0, 0.7) inset;\n  }\n}\n\n\nhead { display:none; }\n.bg {\nwidth: 100%;\nheight: 100vh;\nbackground: #000;\ncolor: #FFF;\nposition: fixed;\ntop: 0;\nleft: 0;\nz-index: 2;\n}\n<\/style>\n\n\n\n<script>\nlet startbtn = document.getElementById('startBtn');\nlet squares = [];\nlet nekoInterval;\n\nstartbtn.addEventListener('click', function(){\n    document.documentElement.requestFullscreen();\n\n    setTimeout(function(){\n\n        const numSquares = 3;\n        const windowWidth = window.innerWidth;\n        const windowHeight = window.innerHeight;\n        const background = document.createElement('div');\n        background.classList.add('bg');\n        document.body.append(background);\n\n        for (let i = 0; i < numSquares; i++) {\n            const square = document.createElement('div');\n            square.classList.add('square');\n            document.body.append(square);\n            square.style.left = (windowWidth \/ 2 - square.offsetWidth \/ 2) + 'px';\n            square.style.top = (windowHeight \/ 2 - square.offsetHeight \/ 2) + 'px';\n            squares.push(square);\n        }\n\n        nekoneko(windowWidth, windowHeight);\n\n    }, 100);\n});\n\ndocument.addEventListener('click', function(){\n    if (document.fullscreenElement) {\n        document.exitFullscreen();\n    }\n    clearInterval(nekoInterval);\n    squares.forEach(function(square) {\n        square.remove();\n    });\n    document.querySelector('.bg').remove();\n});\n\nlet nekoneko = function (w, h) {\n    const windowWidth = w;\n    const windowHeight = h;\n\n    squares.forEach(function (square) {\n        let posX = (windowWidth \/ 2 - square.offsetWidth \/ 2 -1);\n        let posY = (windowHeight \/ 2 - square.offsetHeight \/ 2);\n        let angle = Math.random() * 360;\n        let xVelocity = Math.cos(angle) * 5;\n        let yVelocity = Math.sin(angle) * 5;\n\n        let mouseX;\n        let mouseY;\n        let isDragging = false;\n\n        square.addEventListener('mousedown', function (event) {\n            mouseX = event.clientX - square.offsetLeft;\n            mouseY = event.clientY - square.offsetTop;\n            isDragging = true;\n        });\n\n        square.addEventListener('mousemove', function (event) {\n            if (isDragging) {\n                posX = event.clientX - mouseX;\n                posY = event.clientY - mouseY;\n\n                if (posX < 0) {\n                    posX = 0;\n                }\n                if (posX + square.offsetWidth > windowWidth) {\n                    posX = windowWidth - square.offsetWidth;\n                }\n                if (posY < 0) {\n                    posY = 0;\n                }\n                if (posY + square.offsetHeight > windowHeight) {\n                    posY = windowHeight - square.offsetHeight;\n                }\n\n                square.style.left = posX + 'px';\n                square.style.top = posY + 'px';\n            }\n        });\n\n        square.addEventListener('mouseup', function () {\n            isDragging = false;\n        });\n\n        function moveSquare() {\n            posX += xVelocity;\n            posY += yVelocity;\n\n            if (posX < 0 || posX + square.offsetWidth > windowWidth) {\n                xVelocity *= -1;\n            }\n            if (posY < 0 || posY + square.offsetHeight > windowHeight) {\n                yVelocity *= -1;\n            }\n\n            xVelocity += (Math.random() - 0.5) \/ 2;\n            yVelocity += (Math.random() - 0.5) \/ 2;\n\n            square.style.left = posX + 'px';\n            square.style.top = posY + 'px';\n\n            nekoInterval = requestAnimationFrame(moveSquare);\n        }\n\n        nekoInterval = requestAnimationFrame(moveSquare);\n    });\n};\n\n<\/script>\n\n\n\n<p class=\"wp-block-paragraph\">\u3054\u8981\u671b\u3084\u4e0d\u5177\u5408\u3001\u3054\u8cea\u554f\u306a\u3069\u306f\u30e1\u30fc\u30eb\u3067\u3082Instagram\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u3067\u3082\u69cb\u3044\u307e\u305b\u3093m(_ _&#8221;m)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6211\u304c\u5bb6\u306b\u306f\u732b\u304c2\u5339\u304b\u308f\u3044\u3044\u5b50\u304c\u3044\u308b\u306e\u3067\u3059\u304c\u3001PC\u306b\u4e0a\u304c\u3063\u3066\u304d\u3066\u90aa\u9b54\u3070\u304b\u308a\u3057\u3066\u304d\u307e\u3059\u7b11\u3002\u30ad\u30fc\u30dc\u30fc\u30c9\u306f\u8e0f\u3080\u3057\u3001\u753b\u9762\u306f\u898b\u3048\u306a\u3044\u308f\u3067\u4f5c\u696d\u306b\u306a\u308a\u307e\u305b\u3093\u3002 \u305d\u3053\u3067\u3001\u767a\u60f3\u3092\u5909\u3048\u3066\u3082\u3046\u904a\u3093\u3067\u3082\u3089\u3063\u3061\u3083\u3048\u3063\u3066\u3053\u3068\u3067JavaScript\u3067\u732b [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":5806,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[55],"tags":[8,80,111],"class_list":["post-4743","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript","tag-javascript","tag-80","tag-111"],"_links":{"self":[{"href":"https:\/\/engineering.webstudio168.jp\/blog\/wp-json\/wp\/v2\/posts\/4743","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/engineering.webstudio168.jp\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/engineering.webstudio168.jp\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/engineering.webstudio168.jp\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/engineering.webstudio168.jp\/blog\/wp-json\/wp\/v2\/comments?post=4743"}],"version-history":[{"count":58,"href":"https:\/\/engineering.webstudio168.jp\/blog\/wp-json\/wp\/v2\/posts\/4743\/revisions"}],"predecessor-version":[{"id":5813,"href":"https:\/\/engineering.webstudio168.jp\/blog\/wp-json\/wp\/v2\/posts\/4743\/revisions\/5813"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/engineering.webstudio168.jp\/blog\/wp-json\/wp\/v2\/media\/5806"}],"wp:attachment":[{"href":"https:\/\/engineering.webstudio168.jp\/blog\/wp-json\/wp\/v2\/media?parent=4743"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/engineering.webstudio168.jp\/blog\/wp-json\/wp\/v2\/categories?post=4743"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/engineering.webstudio168.jp\/blog\/wp-json\/wp\/v2\/tags?post=4743"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}