{"id":1451,"date":"2023-05-15T10:12:58","date_gmt":"2023-05-15T07:12:58","guid":{"rendered":"https:\/\/notes.profidev.online\/?p=1451"},"modified":"2023-05-15T10:12:58","modified_gmt":"2023-05-15T07:12:58","slug":"dropdown-menu-2","status":"publish","type":"post","link":"https:\/\/notes.profidev.online\/ru\/accordion\/1451\/","title":{"rendered":"Dropdown Menu"},"content":{"rendered":"\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe title=\"Dropdown Menu\" width=\"640\" height=\"360\" src=\"https:\/\/www.youtube.com\/embed\/Lp3Yvft9t-w?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;htmlmixed&quot;,&quot;mime&quot;:&quot;text\/html&quot;,&quot;theme&quot;:&quot;cobalt&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:true,&quot;lineWrapping&quot;:true,&quot;readOnly&quot;:false,&quot;fileName&quot;:&quot;&quot;,&quot;TrpContentRestriction&quot;:{&quot;restriction_type&quot;:&quot;exclude&quot;,&quot;selected_languages&quot;:[],&quot;panel_open&quot;:true},&quot;language&quot;:&quot;HTML&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;html&quot;}\">  &lt;div class=&quot;dropdown-container&quot;&gt;\n    &lt;button class=&quot;dropdown-button main-button&quot;&gt;\n      &lt;span class=&quot;dropdown-title-icon&quot;&gt;\n        &lt;svg xmlns=&quot;http:\/\/www.w3.org\/2000\/svg&quot; viewBox=&quot;0 0 16 16&quot;&gt;\n          &lt;path d=&quot;M16 8.049c0-4.446-3.582-8.05-8-8.05C3.58 0-.002 3.603-.002 8.05c0 4.017 2.926 7.347 6.75 7.951v-5.625h-2.03V8.05H6.75V6.275c0-2.017 1.195-3.131 3.022-3.131.876 0 1.791.157 1.791.157v1.98h-1.009c-.993 0-1.303.621-1.303 1.258v1.51h2.218l-.354 2.326H9.25V16c3.824-.604 6.75-3.934 6.75-7.951z&quot; \/&gt;\n        &lt;\/svg&gt;\n      &lt;\/span&gt;\n      &lt;span class=&quot;dropdown-title text-truncate&quot;&gt;Facebook&lt;\/span&gt;\n      &lt;span class=&quot;dropdown-arrow&quot;&gt;\n        &lt;svg xmlns=&quot;http:\/\/www.w3.org\/2000\/svg&quot; viewBox=&quot;0 0 16 16&quot;&gt;\n          &lt;path d=&quot;M7.247 11.14 2.451 5.658C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z&quot; \/&gt;\n        &lt;\/svg&gt;\n      &lt;\/span&gt;\n    &lt;\/button&gt;\n    &lt;div class=&quot;dropdown-list-container&quot;&gt;\n      &lt;div class=&quot;dropdown-list-wrapper&quot;&gt;\n        &lt;ul class=&quot;dropdown-list&quot;&gt;&lt;\/ul&gt;\n        &lt;div class=&quot;floating-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;\/div&gt;\n      &lt;\/div&gt;\n    &lt;\/div&gt;\n  &lt;\/div&gt;\n<\/pre><\/div>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;css&quot;,&quot;mime&quot;:&quot;text\/css&quot;,&quot;theme&quot;:&quot;cobalt&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:true,&quot;lineWrapping&quot;:true,&quot;readOnly&quot;:false,&quot;fileName&quot;:&quot;&quot;,&quot;TrpContentRestriction&quot;:{&quot;restriction_type&quot;:&quot;exclude&quot;,&quot;selected_languages&quot;:[],&quot;panel_open&quot;:true},&quot;language&quot;:&quot;CSS&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;css&quot;}\">@import url(&quot;https:\/\/fonts.googleapis.com\/css2?family=Roboto&amp;display=swap&quot;);\n\n*,\n*::before,\n*::after {\n  margin: 0;\n  padding: 0;\n  box-sizing: border-box;\n}\n\n:root {\n  --bg-color: #222429;\n  --primary-bg-color: #333740;\n  --primary-color: #2c62f6;\n  --text-color: #b1b8ca;\n  --text-active: #ffffff;\n  --button-hover-bg-color: #2b2e34;\n  --border-color: #494d59;\n  --dropdown-height: 0;\n  --rotate-arrow: 0;\n  --translate-value: 0;\n  --list-opacity: 0;\n  --transition-time: 0.4s;\n  --transition-timing: cubic-bezier(0.25, 0.46, 0.45, 0.94);\n  --border-radius: 1.4rem;\n  --list-button-height: 4.6rem;\n  --floating-icon-size: 26;\n  --floating-icon-top: 0;\n  --floating-icon-left: 0;\n}\n\nhtml {\n  font-size: 62.5%;\n}\n\nhtml,\nbody {\n  height: 100%;\n}\n\nbody {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  background-color: var(--bg-color);\n  padding: 1.5rem;\n  line-height: 1.4;\n}\n\nbutton {\n  border: none;\n  cursor: pointer;\n  background-color: transparent;\n  outline: none;\n}\n\nsvg {\n  height: 1.6rem;\n  width: 1.6rem;\n}\n\n.text-truncate {\n  text-overflow: ellipsis;\n  overflow: hidden;\n  white-space: nowrap;\n}\n\n.dropdown-container {\n  margin-top: 30vh;\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  max-width: 34rem;\n}\n\n.dropdown-title-icon,\n.dropdown-arrow {\n  display: inline-flex;\n}\n\n.dropdown-title {\n  margin: 0 auto 0 1.8rem;\n  text-transform: capitalize;\n}\n\n.dropdown-button {\n  font-family: &quot;Roboto&quot;, sans-serif;\n  font-weight: 400;\n  font-size: 1.7rem;\n  display: flex;\n  align-items: center;\n  padding: 0 1.8rem;\n}\n\n.dropdown-button svg {\n  transition: all var(--transition-time) var(--transition-timing);\n  fill: var(--text-color);\n}\n\n.dropdown-button svg,\n.dropdown-button span {\n  pointer-events: none;\n}\n\n.dropdown-button:hover,\n.dropdown-button:focus {\n  color: var(--text-active);\n}\n\n.dropdown-button:hover svg,\n.dropdown-button:focus svg {\n  fill: var(--text-active);\n}\n\n.main-button {\n  height: 5.2rem;\n  border-radius: var(--border-radius);\n  color: var(--text-color);\n  background-color: var(--primary-bg-color);\n  border: 0.1rem solid var(--border-color);\n  transition: all var(--transition-time) var(--transition-timing);\n}\n\n.main-button:focus {\n  border: 0.1rem solid var(--primary-color);\n  box-shadow: 0 0 0 0.2rem rgba(44, 98, 246, 0.4);\n}\n\n.main-button .dropdown-arrow {\n  transition: transform var(--transition-time) var(--transition-timing);\n  transform: rotate(var(--rotate-arrow));\n  margin-left: 1.8rem;\n}\n\n.list-button {\n  height: var(--list-button-height);\n  transition: color var(--transition-time) var(--transition-timing);\n  color: var(--text-color);\n  overflow: hidden;\n  cursor: none;\n}\n\n.dropdown-list-container {\n  overflow: hidden;\n  max-height: var(--dropdown-height);\n  transition: max-height var(--transition-time) var(--transition-timing);\n}\n\n.dropdown-list-wrapper {\n  margin-top: 1rem;\n  padding: 1rem;\n  background-color: var(--primary-bg-color);\n  border-radius: var(--border-radius);\n  border: 0.1rem solid var(--border-color);\n  position: relative;\n}\n\nul.dropdown-list {\n  position: relative;\n  list-style-type: none;\n}\n\nul.dropdown-list::before {\n  content: &quot;&quot;;\n  position: absolute;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: 0;\n  opacity: 0;\n  height: var(--list-button-height);\n  background-color: var(--button-hover-bg-color);\n  transition: all var(--transition-time) linear;\n  transform: translateY(var(--translate-value));\n  border-radius: var(--border-radius);\n  pointer-events: none;\n}\nul.dropdown-list:hover::before,\nul.dropdown-list:hover ~ .floating-icon {\n  opacity: 1;\n}\n\nli.dropdown-list-item {\n  display: flex;\n  flex-direction: column;\n  position: relative;\n  z-index: 1;\n  opacity: var(--list-opacity);\n  transition: opacity 0.8s var(--transition-timing);\n}\n\n.floating-icon {\n  height: calc(var(--floating-icon-size) * 1px);\n  width: calc(var(--floating-icon-size) * 1px);\n  position: absolute;\n  top: var(--floating-icon-top);\n  left: var(--floating-icon-left);\n  background-color: var(--border-color);\n  border-radius: 1rem;\n  pointer-events: none;\n  opacity: 0;\n  transition: opacity var(--transition-time) var(--transition-timing);\n  z-index: 2;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.floating-icon svg {\n  fill: var(--text-active);\n}\n<\/pre><\/div>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;javascript&quot;,&quot;mime&quot;:&quot;text\/javascript&quot;,&quot;theme&quot;:&quot;cobalt&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:true,&quot;lineWrapping&quot;:true,&quot;readOnly&quot;:false,&quot;fileName&quot;:&quot;&quot;,&quot;TrpContentRestriction&quot;:{&quot;restriction_type&quot;:&quot;exclude&quot;,&quot;selected_languages&quot;:[],&quot;panel_open&quot;:true},&quot;language&quot;:&quot;JavaScript&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;js&quot;}\">const root = document.documentElement;\nconst dropdownTitleIcon = document.querySelector(&quot;.dropdown-title-icon&quot;);\nconst dropdownTitle = document.querySelector(&quot;.dropdown-title&quot;);\nconst dropdownList = document.querySelector(&quot;.dropdown-list&quot;);\nconst mainButton = document.querySelector(&quot;.main-button&quot;);\nconst floatingIcon = document.querySelector(&quot;.floating-icon&quot;);\n\nconst icons = {\n  linkedin:\n    &quot;M0 1.146C0 .513.526 0 1.175 0h13.65C15.474 0 16 .513 16 1.146v13.708c0 .633-.526 1.146-1.175 1.146H1.175C.526 16 0 15.487 0 14.854V1.146zm4.943 12.248V6.169H2.542v7.225h2.401zm-1.2-8.212c.837 0 1.358-.554 1.358-1.248-.015-.709-.52-1.248-1.342-1.248-.822 0-1.359.54-1.359 1.248 0 .694.521 1.248 1.327 1.248h.016zm4.908 8.212V9.359c0-.216.016-.432.08-.586.173-.431.568-.878 1.232-.878.869 0 1.216.662 1.216 1.634v3.865h2.401V9.25c0-2.22-1.184-3.252-2.764-3.252-1.274 0-1.845.7-2.165 1.193v.025h-.016a5.54 5.54 0 0 1 .016-.025V6.169h-2.4c.03.678 0 7.225 0 7.225h2.4z&quot;,\n  instagram:\n    &quot;M8 0C5.829 0 5.556.01 4.703.048 3.85.088 3.269.222 2.76.42a3.917 3.917 0 0 0-1.417.923A3.927 3.927 0 0 0 .42 2.76C.222 3.268.087 3.85.048 4.7.01 5.555 0 5.827 0 8.001c0 2.172.01 2.444.048 3.297.04.852.174 1.433.372 1.942.205.526.478.972.923 1.417.444.445.89.719 1.416.923.51.198 1.09.333 1.942.372C5.555 15.99 5.827 16 8 16s2.444-.01 3.298-.048c.851-.04 1.434-.174 1.943-.372a3.916 3.916 0 0 0 1.416-.923c.445-.445.718-.891.923-1.417.197-.509.332-1.09.372-1.942C15.99 10.445 16 10.173 16 8s-.01-2.445-.048-3.299c-.04-.851-.175-1.433-.372-1.941a3.926 3.926 0 0 0-.923-1.417A3.911 3.911 0 0 0 13.24.42c-.51-.198-1.092-.333-1.943-.372C10.443.01 10.172 0 7.998 0h.003zm-.717 1.442h.718c2.136 0 2.389.007 3.232.046.78.035 1.204.166 1.486.275.373.145.64.319.92.599.28.28.453.546.598.92.11.281.24.705.275 1.485.039.843.047 1.096.047 3.231s-.008 2.389-.047 3.232c-.035.78-.166 1.203-.275 1.485a2.47 2.47 0 0 1-.599.919c-.28.28-.546.453-.92.598-.28.11-.704.24-1.485.276-.843.038-1.096.047-3.232.047s-2.39-.009-3.233-.047c-.78-.036-1.203-.166-1.485-.276a2.478 2.478 0 0 1-.92-.598 2.48 2.48 0 0 1-.6-.92c-.109-.281-.24-.705-.275-1.485-.038-.843-.046-1.096-.046-3.233 0-2.136.008-2.388.046-3.231.036-.78.166-1.204.276-1.486.145-.373.319-.64.599-.92.28-.28.546-.453.92-.598.282-.11.705-.24 1.485-.276.738-.034 1.024-.044 2.515-.045v.002zm4.988 1.328a.96.96 0 1 0 0 1.92.96.96 0 0 0 0-1.92zm-4.27 1.122a4.109 4.109 0 1 0 0 8.217 4.109 4.109 0 0 0 0-8.217zm0 1.441a2.667 2.667 0 1 1 0 5.334 2.667 2.667 0 0 1 0-5.334z&quot;,\n  facebook:\n    &quot;M16 8.049c0-4.446-3.582-8.05-8-8.05C3.58 0-.002 3.603-.002 8.05c0 4.017 2.926 7.347 6.75 7.951v-5.625h-2.03V8.05H6.75V6.275c0-2.017 1.195-3.131 3.022-3.131.876 0 1.791.157 1.791.157v1.98h-1.009c-.993 0-1.303.621-1.303 1.258v1.51h2.218l-.354 2.326H9.25V16c3.824-.604 6.75-3.934 6.75-7.951z&quot;,\n  twitter:\n    &quot;M5.026 15c6.038 0 9.341-5.003 9.341-9.334 0-.14 0-.282-.006-.422A6.685 6.685 0 0 0 16 3.542a6.658 6.658 0 0 1-1.889.518 3.301 3.301 0 0 0 1.447-1.817 6.533 6.533 0 0 1-2.087.793A3.286 3.286 0 0 0 7.875 6.03a9.325 9.325 0 0 1-6.767-3.429 3.289 3.289 0 0 0 1.018 4.382A3.323 3.323 0 0 1 .64 6.575v.045a3.288 3.288 0 0 0 2.632 3.218 3.203 3.203 0 0 1-.865.115 3.23 3.23 0 0 1-.614-.057 3.283 3.283 0 0 0 3.067 2.277A6.588 6.588 0 0 1 .78 13.58a6.32 6.32 0 0 1-.78-.045A9.344 9.344 0 0 0 5.026 15z&quot;,\n  youtube:\n    &quot;M8.051 1.999h.089c.822.003 4.987.033 6.11.335a2.01 2.01 0 0 1 1.415 1.42c.101.38.172.883.22 1.402l.01.104.022.26.008.104c.065.914.073 1.77.074 1.957v.075c-.001.194-.01 1.108-.082 2.06l-.008.105-.009.104c-.05.572-.124 1.14-.235 1.558a2.007 2.007 0 0 1-1.415 1.42c-1.16.312-5.569.334-6.18.335h-.142c-.309 0-1.587-.006-2.927-.052l-.17-.006-.087-.004-.171-.007-.171-.007c-1.11-.049-2.167-.128-2.654-.26a2.007 2.007 0 0 1-1.415-1.419c-.111-.417-.185-.986-.235-1.558L.09 9.82l-.008-.104A31.4 31.4 0 0 1 0 7.68v-.123c.002-.215.01-.958.064-1.778l.007-.103.003-.052.008-.104.022-.26.01-.104c.048-.519.119-1.023.22-1.402a2.007 2.007 0 0 1 1.415-1.42c.487-.13 1.544-.21 2.654-.26l.17-.007.172-.006.086-.003.171-.007A99.788 99.788 0 0 1 7.858 2h.193zM6.4 5.209v4.818l4.157-2.408L6.4 5.209z&quot;\n};\n\nconst listItems = [&quot;Linkedin&quot;, &quot;Instagram&quot;, &quot;Facebook&quot;, &quot;Twitter&quot;, &quot;Youtube&quot;];\n\nconst iconTemplate = (path) =&gt; {\n  return `\n    &lt;svg xmlns=&quot;http:\/\/www.w3.org\/2000\/svg&quot; viewBox=&quot;0 0 16 16&quot;&gt;\n      &lt;path d=&quot;${path}&quot; \/&gt;\n    &lt;\/svg&gt;\n  `;\n};\n\nconst listItemTemplate = (text, translateValue) =&gt; {\n  return `\n    &lt;li class=&quot;dropdown-list-item&quot;&gt;\n      &lt;button class=&quot;dropdown-button list-button&quot; data-translate-value=&quot;${translateValue}%&quot;&gt;\n        &lt;span class=&quot;text-truncate&quot;&gt;${text}&lt;\/span&gt;\n      &lt;\/button&gt;\n    &lt;\/li&gt;\n  `;\n};\n\nconst renderListItems = () =&gt; {\n  dropdownList.innerHTML += listItems\n    .map((item, index) =&gt; {\n      return listItemTemplate(item, 100 * index);\n    })\n    .join(&quot;&quot;);\n};\n\nwindow.addEventListener(&quot;load&quot;, () =&gt; {\n  renderListItems();\n});\n\nconst setDropdownProps = (deg, ht, opacity) =&gt; {\n  root.style.setProperty(&quot;--rotate-arrow&quot;, deg !== 0 ? deg + &quot;deg&quot; : 0);\n  root.style.setProperty(&quot;--dropdown-height&quot;, ht !== 0 ? ht + &quot;rem&quot; : 0);\n  root.style.setProperty(&quot;--list-opacity&quot;, opacity);\n};\n\nmainButton.addEventListener(&quot;click&quot;, () =&gt; {\n  const listWrapperSizes = 3.5; \/\/ margins, paddings &amp; borders\n  const dropdownOpenHeight = 4.6 * listItems.length + listWrapperSizes;\n  const currDropdownHeight =\n    root.style.getPropertyValue(&quot;--dropdown-height&quot;) || &quot;0&quot;;\n\n  currDropdownHeight === &quot;0&quot;\n    ? setDropdownProps(180, dropdownOpenHeight, 1)\n    : setDropdownProps(0, 0, 0);\n});\n\ndropdownList.addEventListener(&quot;mouseover&quot;, (e) =&gt; {\n  const translateValue = e.target.dataset.translateValue;\n  root.style.setProperty(&quot;--translate-value&quot;, translateValue);\n});\n\ndropdownList.addEventListener(&quot;click&quot;, (e) =&gt; {\n  const clickedItemText = e.target.innerText.toLowerCase().trim();\n  const clickedItemIcon = icons[clickedItemText];\n\n  dropdownTitleIcon.innerHTML = iconTemplate(clickedItemIcon);\n  dropdownTitle.innerHTML = clickedItemText;\n  setDropdownProps(0, 0, 0);\n});\n\ndropdownList.addEventListener(&quot;mousemove&quot;, (e) =&gt; {\n  const iconSize = root.style.getPropertyValue(&quot;--floating-icon-size&quot;) || 0;\n  const x = e.clientX - dropdownList.getBoundingClientRect().x;\n  const y = e.clientY - dropdownList.getBoundingClientRect().y;\n  const targetText = e.target.innerText.toLowerCase().trim();\n  const hoverItemText = icons[targetText];\n\n  floatingIcon.innerHTML = iconTemplate(hoverItemText);\n  root.style.setProperty(&quot;--floating-icon-left&quot;, x - iconSize \/ 2 + &quot;px&quot;);\n  root.style.setProperty(&quot;--floating-icon-top&quot;, y - iconSize \/ 2 + &quot;px&quot;);\n});<\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":1452,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[61],"tags":[],"class_list":["post-1451","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-accordion"],"_links":{"self":[{"href":"https:\/\/notes.profidev.online\/ru\/wp-json\/wp\/v2\/posts\/1451","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/notes.profidev.online\/ru\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/notes.profidev.online\/ru\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/notes.profidev.online\/ru\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/notes.profidev.online\/ru\/wp-json\/wp\/v2\/comments?post=1451"}],"version-history":[{"count":1,"href":"https:\/\/notes.profidev.online\/ru\/wp-json\/wp\/v2\/posts\/1451\/revisions"}],"predecessor-version":[{"id":1453,"href":"https:\/\/notes.profidev.online\/ru\/wp-json\/wp\/v2\/posts\/1451\/revisions\/1453"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/notes.profidev.online\/ru\/wp-json\/wp\/v2\/media\/1452"}],"wp:attachment":[{"href":"https:\/\/notes.profidev.online\/ru\/wp-json\/wp\/v2\/media?parent=1451"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/notes.profidev.online\/ru\/wp-json\/wp\/v2\/categories?post=1451"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/notes.profidev.online\/ru\/wp-json\/wp\/v2\/tags?post=1451"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}