About this snippet

Replace the default browser select with this fully customizable dropdown. It features a sleek SVG caret that animates on toggle, and the options list appears smoothly, providing a premium user experience for your forms.

Size
2.9 KB
Uses
HTML, CSS, JavaScript
Loads
Nothing external
Views
503
<div class="select-wrapper">
  <div class="select-btn">
    <span class="btn-text">Select an option</span>
    <svg class="arrow-icon" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"></polyline></svg>
  </div>
  <ul class="list-items">
    <li class="item">
      <span class="item-text">Google Chrome</span>
    </li>
    <li class="item">
      <span class="item-text">Mozilla Firefox</span>
    </li>
    <li class="item">
      <span class="item-text">Safari</span>
    </li>
    <li class="item">
      <span class="item-text">Microsoft Edge</span>
    </li>
  </ul>
</div>
* {
  box-sizing: border-box;
}
.select-wrapper {
  font-family: system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
  position: relative;
  width: 100%;
  max-width: 350px;
  margin: 0 auto;
}
.select-btn {
  display: flex;
  height: 50px;
  align-items: center;
  justify-content: space-between;
  padding: 0 16px;
  border-radius: 8px;
  cursor: pointer;
  background-color: #fff;
  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.1);
  border: 1px solid #e5e7eb;
  transition: border-color 0.3s;
}
.select-btn:hover {
  border-color: #3b82f6;
}
.btn-text {
  font-size: 1rem;
  font-weight: 500;
  color: #333;
}
.arrow-icon {
  transition: transform 0.3s ease;
  color: #6b7280;
}
.select-wrapper.open .arrow-icon {
  transform: rotate(180deg);
}
.list-items {
  position: absolute;
  top: 40px;
  width: 100%;
  border-radius: 8px;
  padding: 10px;
  background-color: #fff;
  box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
  display: none;
  z-index: 10;
  border: 1px solid #e5e7eb;
}
.select-wrapper.open .list-items {
  display: block;
  animation: fadeIn 0.2s ease;
}
@keyframes fadeIn {
  from { opacity: 0; transform: translateY(-10px); }
  to { opacity: 1; transform: translateY(0); }
}
.item {
  display: flex;
  align-items: center;
  list-style: none;
  height: 40px;
  cursor: pointer;
  transition: 0.3s;
  padding: 0 15px;
  border-radius: 8px;
}
.item:hover {
  background-color: #eff6ff;
  color: #2563eb;
}
const selectBtn = document.querySelector(".select-btn");
const items = document.querySelectorAll(".item");
const wrapper = document.querySelector(".select-wrapper");
const btnText = document.querySelector(".btn-text");

selectBtn.addEventListener("click", () => {
  wrapper.classList.toggle("open");
});

items.forEach(item => {
  item.addEventListener("click", () => {
    items.forEach(i => i.classList.remove("checked"));
    item.classList.add("checked");
    btnText.innerText = item.querySelector(".item-text").innerText;
    wrapper.classList.remove("open");
  });
});

// Close dropdown when clicking outside
document.addEventListener("click", (e) => {
  if (!wrapper.contains(e.target)) {
    wrapper.classList.remove("open");
  }
});
Esc
↑↓ moveEnter select

Start from a template

Open an .html file, or HTML, CSS, JS, Markdown, Less or TypeScript files. You can also drop them here. Styles and scripts go into their panes.

Share

Source

Keyboard shortcuts

Save