указатель от ввода к элементу списка - PullRequest
1 голос
/ 28 февраля 2020

У меня есть небольшой фрагмент кода, в котором неупорядоченный список находится в одном элементе div, а вход внизу - в элементе div внизу, что создает несколько похожий на табуляцию интерфейс для элементов списка. Это то, что я хочу, но я пытаюсь выяснить, как создать указатель из верхней части ввода, который указывает на соответствующий элемент списка.

Если я нажму на элемент publi c, я бы нужна стрелка, указывающая от входа на «Publi c» и то же самое для внутреннего.

Примерно так:

pointer

Я пробовал некоторые методы границ, но ничто не помогает мне приблизиться, так как я хочу, чтобы оно создавалось по существу на границе ввода.

Как я могу это сделать?

 .tabs{
  margin-top: 30px;
  user-select: none;
  -webkit-box-align: stretch;
  -ms-flex-align: stretch;
  align-items: stretch;
  display: flex;
  font-size: 1rem;
  -webkit-box-pack: justify;
  justify-content: space-between;
  overflow: hidden;
  overflow-x: auto;
  white-space: nowrap;
}

.tabs ul{
  -webkit-box-align: center;
  align-items: center;
  border-bottom: 1px solid #dbdbdb;
  display: flex;
  -webkit-box-flex: 1;
 flex-grow: 1;
  flex-shrink: 0;
  -webkit-box-pack: start;
  justify-content: flex-start;
  list-style: none;
  padding:0px !important;
}

.tabs li{
  display:block;
  text-align:center !important;
  margin-left:15px;
  margin-bottom:-.15em;
}

.tabs li.is-active a{
 border-bottom: 2px solid black;
 color:black;
}

.tabs a.is-active {
border-bottom:2px solid black;
}

.tabs a:hover{
border-bottom: 2px solid black;
}
<div class="row notesInput">
  <div class="col-lg-12">
    <div class="tabs">
      <ul style="border-bottom:none !important; text-decoration:none">
        <li>Public</li>
        <li>Internal</li>
      </ul>
    </div>
    <div>
      <input type="text" name="public">
    </div>
  </div>
</div>

Что я пробовал:

.tabs {
  margin-top: 30px;
  user-select: none;
  -webkit-box-align: stretch;
  -ms-flex-align: stretch;
  align-items: stretch;
  display: flex;
  font-size: 1rem;
  -webkit-box-pack: justify;
  justify-content: space-between;
  overflow: hidden;
  overflow-x: auto;
  white-space: nowrap;
}

.tabs ul {
  -webkit-box-align: center;
  align-items: center;
  border-bottom: 1px solid #dbdbdb;
  display: flex;
  -webkit-box-flex: 1;
  flex-grow: 1;
  flex-shrink: 0;
  -webkit-box-pack: start;
  justify-content: flex-start;
  list-style: none;
  padding: 0px !important;
}

.tabs li {
  display: block;
  text-align: center !important;
  margin-left: 15px;
  margin-bottom: -.15em;
}

.tabs li.is-active a {
  border-bottom: 2px solid black;
  color: black;
}

.tabs a.is-active {
  border-bottom: 2px solid black;
}

.tabs a:hover {
  border-bottom: 2px solid black;
}

input {
  clip-path: polygon(50% 0, 0 100%, 100% 100%);
}
<div class="row notesInput">
  <div class="col-lg-12">
    <div class="tabs">
      <ul style="border-bottom:none !important; text-decoration:none">
        <li>Public</li>
        <li>Internal</li>
      </ul>
    </div>
    <div>
      <input type="text" name="public">
    </div>
  </div>
</div>

1 Ответ

1 голос
/ 28 февраля 2020

Вы можете использовать псевдоэлемент, например :before, для каждого <li>. Таким образом, вы можете применить границы, фон и повернуть этот псевдоэлемент, используя transform: rotate(), чтобы создать желаемую форму треугольника. Наконец, вы устанавливаете его так, чтобы он находился рядом со входом.

Некоторые изменения были внесены в CSS, например, применение границы на входе и overflow and overflow-x были удалены. Класс .active используется для переключения выбранного li, изменяя свойство content псевдоэлемента с '' на none.

document.querySelectorAll('.tabs ul li').forEach(function(li) {
  li.addEventListener('click', function() {
    if (this.classList.contains('active')) {
      return;
    };
    document.querySelector('.tabs .active').classList.remove('active');
    this.classList.add('active');
  })
})
 .tabs{
  margin-top: 30px;
  user-select: none;
  -webkit-box-align: stretch;
  -ms-flex-align: stretch;
  align-items: stretch;
  display: flex;
  font-size: 1rem;
  -webkit-box-pack: justify;
  justify-content: space-between;
  white-space: nowrap;
}

.tabs ul{
  -webkit-box-align: center;
  align-items: center;
  border-bottom: 1px solid #dbdbdb;
  display: flex;
  -webkit-box-flex: 1;
 flex-grow: 1;
  flex-shrink: 0;
  -webkit-box-pack: start;
  justify-content: flex-start;
  list-style: none;
  padding:0px !important;
}

.tabs li {
  display:block;
  text-align:center !important;
  margin-left:15px;
  margin-bottom:-.15em;
  position: relative;
}

.tabs li:before {
  content: none;
  position: absolute;
  height: 8px;
  width: 8px;
  background-color: #ffffff;
  transform: rotate(45deg);
  border-left: 1px solid #8c8c8c;
  border-top: 1px solid #8c8c8c;
  bottom: -18px;
  left: calc(50% - 3px);
}

.tabs li.active:before {
  content: '';
}

.tabs li.is-active a{
 border-bottom: 2px solid black;
 color:black;
}

.tabs a.is-active {
border-bottom:2px solid black;
}

.tabs a:hover{
border-bottom: 2px solid black;
}

.input input {
  border: 1px solid #8c8c8c;
}
<div class="row notesInput">
  <div class="col-lg-12">
    <div class="tabs">
      <ul style="border-bottom:none !important; text-decoration:none">
        <li class="active">Public</li>
        <li>Internal</li>
      </ul>
    </div>
    <div class="input">
      <input type="text" name="public">
    </div>
  </div>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...