HTML
CSS
JS
Result
Skip Results Iframe
EDIT ON
Live
Live
Live
This Pen is owned by
web.dev
on
CodePen
.
See more by @web-dot-dev on CodePen
External CSS
https://codepen.io/web-dot-dev/pen/XWqWYgB.css
https://codepen.io/web-dot-dev/pen/ZExZWBQ.css
External JavaScript
https://codepen.io/web-dot-dev/pen/XWqWYgB.js
https://codepen.io/web-dot-dev/pen/ZExZWBQ.js
{"__browser":{"country":"US","device":"unknown_device","mobile":false,"name":"unknown browser","platform":"unknown_platform","version":"0"},"__constants":{},"__CPDATA":{"domain_iframe":"https://cdpn.io","environment":"production","host":"codepen.io","iframe_allow":"accelerometer *; ambient-light-sensor *; camera *; display-capture *; encrypted-media *; geolocation *; gyroscope *; microphone *; midi *; payment *; vr *; web-share *; serial *; xr-spatial-tracking *","iframe_sandbox":"allow-downloads allow-forms allow-modals allow-pointer-lock allow-popups-to-escape-sandbox allow-popups allow-presentation allow-same-origin allow-scripts allow-top-navigation-by-user-activation"},"__graphql":{"data":{"errors":[{"message":"Cannot return null for non-nullable field Query.sessionUser"}],"data":null},"url":"https://codepen.io/graphql","api":"cprails"},"__pay_stripe_public_key":"pk_live_2GndomDfiklqpSNQn8FrGuwZSMIMzha7DkLJqlYe7IR0ihKAlKdiHg68JJc5eVPt68rzAjzAAVXcUwjySHRCsgjQQ00gtRBUFNH","__pay_braintree_env":"production","__boomboom":{"serve_url":"https://cdpn.io/cpe/boomboom","store_url":"https://codepen.io/cpe/boomboom/store"},"__pageType":"embed","__item":"{\"editor_settings\":{\"auto_run\":true,\"autocomplete\":false,\"code_folding\":true,\"css_pre_processor\":\"none\",\"css_prefix\":\"neither\",\"css_starter\":\"neither\",\"emmet_active\":true,\"font_size\":14,\"font_type\":\"system\",\"format_on_save\":true,\"html_pre_processor\":\"none\",\"indent_with\":\"spaces\",\"js_pre_processor\":\"none\",\"key_bindings\":\"normal\",\"line_numbers\":true,\"line_wrapping\":true,\"match_brackets\":true,\"snippets\":{\"markupSnippets\":{},\"stylesheetSnippets\":{}},\"tab_size\":2,\"theme\":\"twilight\",\"id\":\"ZEMpBzP\",\"auto_save\":true},\"hashid\":\"ZEMpBzP\",\"itemType\":\"pen\",\"resources\":[{\"url\":\"https://codepen.io/web-dot-dev/pen/XWqWYgB.css\",\"order\":0,\"resource_type\":\"css\",\"par_content\":\"\"},{\"url\":\"https://codepen.io/web-dot-dev/pen/XWqWYgB.js\",\"order\":0,\"resource_type\":\"js\",\"par_content\":\"\"},{\"url\":\"https://codepen.io/web-dot-dev/pen/ZExZWBQ.css\",\"order\":1,\"resource_type\":\"css\",\"par_content\":\"\"},{\"url\":\"https://codepen.io/web-dot-dev/pen/ZExZWBQ.js\",\"order\":1,\"resource_type\":\"js\",\"par_content\":\"\"}],\"tags\":[],\"id\":66708901,\"user_id\":5928893,\"html\":\"<div class=\\\"controls\\\">\\n <button class=\\\"resize-handle\\\">\\n <svg xmlns=\\\"http://www.w3.org/2000/svg\\\" fill=\\\"none\\\" viewBox=\\\"0 0 24 24\\\" stroke-width=\\\"1.5\\\" stroke=\\\"currentColor\\\" class=\\\"w-6 h-6\\\">\\n <path stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" d=\\\"M19.5 19.5l-15-15m0 0v11.25m0-11.25h11.25\\\" />\\n </svg>\\n\\n </button>\\n <button class=\\\"resize-handle\\\">\\n <svg xmlns=\\\"http://www.w3.org/2000/svg\\\" fill=\\\"none\\\" viewBox=\\\"0 0 24 24\\\" stroke-width=\\\"1.5\\\" stroke=\\\"currentColor\\\" class=\\\"w-6 h-6\\\">\\n <path stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" d=\\\"M4.5 4.5l15 15m0 0V8.25m0 11.25H8.25\\\" />\\n </svg>\\n </button>\\n</div>\\n<div class=\\\"container\\\">\\n <img src=\\\"https://picsum.photos/1080/1080?random=12\\\" alt=\\\"\\\">\\n</div>\",\"css\":\"@layer demo {\\n .container {\\n position: absolute;\\n inset: anchor(--handle-1 top) anchor(--handle-2 right)\\n anchor(--handle-2 bottom) anchor(--handle-1 left);\\n }\\n\\n img {\\n height: 100%;\\n width: 100%;\\n object-fit: cover;\\n pointer-events: none;\\n user-select: none;\\n }\\n .controls {\\n position: relative;\\n }\\n .resize-handle {\\n height: 48px;\\n aspect-ratio: 1;\\n background: hsl(0 0% 100% / 0.75);\\n position: absolute;\\n z-index: 2;\\n opacity: 0.5;\\n transition: opacity 0.2s, background 0.2s;\\n }\\n .resize-handle:is(:hover, :active) {\\n opacity: 1;\\n background: hsl(0 0% 100% / 1);\\n }\\n .resize-handle:first-of-type {\\n anchor-name: --handle-1;\\n left: calc(50% - 100px);\\n top: calc(50% - 100px);\\n }\\n .resize-handle:last-of-type {\\n anchor-name: --handle-2;\\n left: calc(50% + 100px);\\n top: calc(50% + 100px);\\n }\\n svg {\\n stroke-width: 3;\\n }\\n}\\n\\n* {\\n box-sizing: border-box;\\n}\\n\\n:root {\\n}\\n\\n:where(html) {\\n background-color: transparent;\\n color-scheme: none;\\n}\\n\\nbody {\\n min-height: 100vh;\\n height: 100vh;\\n overflow: hidden;\\n display: grid;\\n place-items: center;\\n position: relative;\\n background-color: var(--surface-2);\\n}\\n\",\"js\":\"import gsap from \\\"https://cdn.skypack.dev/gsap@3.11.4\\\";\\nimport Draggable from \\\"https://cdn.skypack.dev/gsap@3.11.4/Draggable\\\";\\n\\ngsap.registerPlugin(Draggable);\\n\\nconst IMG = document.querySelector(\\\"img\\\");\\nconst HANDLES = document.querySelectorAll(\\\".resize-handle\\\");\\n\\nconst createHandle = (el, limiter) => {\\n Draggable.create(el, {\\n type: \\\"left, top\\\",\\n allowContextMenu: true,\\n onDragStart: limiter\\n });\\n};\\ncreateHandle(HANDLES[0], function () {\\n const BOUNDS = IMG.getBoundingClientRect();\\n this.applyBounds({\\n top: window.innerHeight * -0.5,\\n left: window.innerWidth * -0.5,\\n width:\\n window.innerWidth * 0.5 + BOUNDS.right - window.innerWidth * 0.5 - 48,\\n height:\\n window.innerHeight * 0.5 + BOUNDS.bottom - window.innerHeight * 0.5 - 48\\n });\\n});\\ncreateHandle(HANDLES[1], function () {\\n const BOUNDS = IMG.getBoundingClientRect();\\n this.applyBounds({\\n top: 0 - (window.innerHeight * 0.5 - BOUNDS.top) + 48,\\n left: 0 - (window.innerWidth * 0.5 - BOUNDS.left) + 48,\\n width: window.innerWidth * 0.5 + (window.innerWidth * 0.5 - BOUNDS.left),\\n height: window.innerHeight * 0.5 + (window.innerHeight * 0.5 - BOUNDS.top)\\n });\\n});\\n\",\"html_pre_processor\":\"none\",\"css_pre_processor\":\"none\",\"js_pre_processor\":\"none\",\"html_classes\":\"anchoring-support\",\"css_starter\":\"neither\",\"js_library\":null,\"created_at\":\"2023-02-24T18:25:23.456Z\",\"updated_at\":\"2023-02-28T16:11:28.928Z\",\"title\":\"Anchor Positioning resize handle\",\"description\":\"\",\"slug_hash\":\"ZEMpBzP\",\"head\":\"\",\"private\":false,\"has_animation\":true,\"team_id\":0,\"css_prefix\":\"neither\",\"template\":false,\"parent_id\":0,\"comments_count\":0,\"custom_screenshot_filename\":null,\"loves_count\":0,\"pick\":false,\"popularity_score\":0,\"views_count\":0,\"pick_visible_at\":null,\"cpid\":\"018684ac-3400-75e3-99ea-78b0b5cff707\",\"is_new_editor_pen\":false,\"protected\":false,\"access\":\"Public\",\"pen_hash\":null}","__processorsMap":{"autoprefixer":"autoprefixer-10","babel":"babel-7","coffeescript":"coffeescript-2","format-1":"format-1","flutter":"flutter-1","haml":"haml-4","less":"less-3","lint-1":"lint-1","livescript":"livescript-1","markdown":"markdown-11","postcss":"postcss-7","pug":"pug-2","sass":"sass-1","scss":"sass-1","sass-ruby-3":"sass-ruby-3","sass-ruby-compass-3":"sass-ruby-compass-3","slim":"slim-3","stylus":"stylus-0","typescript":"typescript-4","vue":"vue-2","vue3":"vue-3"},"__favicon_mask_icon":"https://cpwebassets.codepen.io/assets/favicon/logo-pin-b4b4269c16397ad2f0f7a01bcdf513a1994f4c94b8af2f191c09eb0d601762b1.svg","__favicon_shortcut_icon":"https://cpwebassets.codepen.io/assets/favicon/favicon-aec34940fbc1a6e787974dcd360f2c6b63348d4b1f4e06c77743096d55480f33.ico","__path_to_iframe_console_runner":"https://cpwebassets.codepen.io/assets/editor/iframe/iframeConsoleRunner-6d8bf8b4b479137260842506acbb12717dace0823c023e08b96360e60b0840d9.js","__path_to_iframe_refresh_css":"https://cpwebassets.codepen.io/assets/editor/iframe/iframeRefreshCSS-44fe83e49b63affec96918c9af88c0d80b209a862cf87ac46bc933074b8c557d.js","__path_to_iframe_runtime_errors":"https://cpwebassets.codepen.io/assets/editor/iframe/iframeRuntimeErrors-4f205f2c14e769b448bcf477de2938c681660d5038bc464e3700256713ebe261.js","__path_to_processor_worker":"https://cpwebassets.codepen.io/assets/packs/router.js","__path_to_stop_execution_on_timeout":"https://cpwebassets.codepen.io/assets/common/stopExecutionOnTimeout-2c7831bb44f98c1391d6a4ffda0e1fd302503391ca806e7fcc7b9b87197aec26.js","__pen_normalize_css_url":"https://cdnjs.cloudflare.com/ajax/libs/normalize/5.0.0/normalize.min.css","__pen_prefix_free_url":"https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js","__pen_reset_css_url":"https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.min.css","__path_to_infinite_loop_detection":"https://cpwebassets.codepen.io/assets/packs/js/infiniteLoopDetection-dfafc8f0a577af499f8a.js"}