Добавил изображения в выпадающий список автозаполнения в удивительном состоянии, кнопка отправки затем перемещается вниз, сбрасывает свою позицию? - PullRequest
0 голосов
/ 06 января 2019

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

Вот код, который я использую, который в основном скопирован из первого ответа по адресу: Добавление изображения в опции (единственная часть, которую я добавил, это форма, окружающая элемент ввода и его кнопку отправки )

var imgList = new Object();
imgList["Ada"] = "http://www.maglioccola.com/images/add-1.png";
imgList["Java"] = "http://www.maglioccola.com/images/add-2.png";
imgList["JavaScript"] = "http://www.maglioccola.com/images/add-3.png";
imgList["Brainfuck"] = "http://www.maglioccola.com/images/add-4.png";
imgList["LOLCODE"] = "http://www.maglioccola.com/images/add-4.png";
imgList["Node.js"] = "http://www.maglioccola.com/images/add-4.png";
imgList["Ruby on Rails"] = "http://www.maglioccola.com/images/add-4.png";

$(document).ready(function() {
  var input = document.getElementById("my-input");
  var awesomplete = new Awesomplete(input, {
    item: myItemFunc
  });;
});

function myItemFunc(text, input){
  return Awesomplete.$.create("li", {
    innerHTML: createItem(text,input),
    "aria-selected": "false"
  });
}

function createItem(text, input){
  var img = document.createElement("img");
  img.style.height = '16px';
  img.src = imgList[text.label];
  var html = img.outerHTML + " " + text.label;
  return html;
}
.awesomplete>ul {
  border-radius: .3em;
  margin: .2em 0 0;
  background: hsla(0, 0%, 100%, .9);
  background: linear-gradient(to bottom right, white, hsla(0, 0%, 100%, .8));
  border: 1px solid rgba(0, 0, 0, .3);
  box-shadow: .05em .2em .6em rgba(0, 0, 0, .2);
  text-shadow: none;
  list-style: none;
}

@supports (transform: scale(0)) {
  .awesomplete>ul {
    transition: .3s cubic-bezier(.4, .2, .5, 1.4);
    transform-origin: 1.43em -.43em;
  }
  .awesomplete>ul[hidden],
  .awesomplete>ul:empty {
    opacity: 0;
    transform: scale(0);
    display: block;
    transition-timing-function: ease;
  }
}


/* Pointer */

.awesomplete>ul:before {
  content: "";
  position: absolute;
  top: -.43em;
  left: 1em;
  width: 0;
  height: 0;
  padding: .4em;
  background: white;
  border: inherit;
  border-right: 0;
  border-bottom: 0;
  -webkit-transform: rotate(45deg);
  transform: rotate(45deg);
}

.awesomplete>ul>li {
  position: relative;
  padding: .2em .5em;
  cursor: pointer;
}

.awesomplete>ul>li:hover {
  background: hsl(200, 40%, 80%);
  color: black;
}

.awesomplete>ul>li[aria-selected="true"] {
  background: hsl(205, 40%, 40%);
  color: white;
}

.awesomplete mark {
  background: hsl(65, 100%, 50%);
}

.awesomplete li:hover mark {
  background: hsl(68, 100%, 41%);
}

.awesomplete li[aria-selected="true"] mark {
  background: hsl(86, 100%, 21%);
  color: inherit;
}
<form action="myscript.php" method="POST"><input list="mylist" id="my-input" />
<datalist id="mylist">
	<option data-link="http://www.google.com">Ada</option>
	<option data-link="http://www.yahoo.com">Java</option>
	<option data-link="http://www.bing.com">JavaScript</option>
	<option data-link="http://www.yandex.com">Brainfuck</option>
	<option data-link="http://www.php.net">LOLCODE</option>
	<option data-link="http://www.asp.net">Node.js</option>
	<option data-link="http://www.microsoft.net">Ruby on Rails</option>
</datalist><br/><button type="submit">Submit</button></form>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/awesomplete/1.1.1/awesomplete.min.js"></script>

1 Ответ

0 голосов
/ 06 января 2019

Код CSS, который вы используете для сокрытия всплывающего окна автозаполнения, просто делает визуальное скрытие, не удаляя объект из вычислений макета, как в случае display:block div все равно занимает необходимый объем пространства, как если бы он был виден, нажимая все остальные элементы в макете. Самый простой подход - использовать следующее:

.awesomplete>ul[hidden],
.awesomplete>ul:empty {
    ...
    display: none;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...