Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Нормальный HTML листбох?

1297  1 2 все
AlexNek патриот22.03.23 20:30
AlexNek
NEW 22.03.23 20:30 

В принципе есть, НО в

edge

а в Chrome и FF

Неизвестно что на маке

https://jsfiddle.net/8ajm0r4w/

В принципе, если убрать серый цвет в едге, то всё нормально. Проблема в том как? Говорят что низзя.

Советуют енто но что то пока не пошло

https://select2.org/

#1 
alex445 коренной житель22.03.23 22:50
22.03.23 22:50 
в ответ AlexNek 22.03.23 20:30, Последний раз изменено 22.03.23 22:52 (alex445)

Там, где говорят, что этот элемент рендерится OS-dependent, там же вроде и альтернативы предлагают - заменить select на похожий элемент.

https://stackoverflow.com/questions/68626310/can-you-chang...


У меня эта портянка работает на Эдже

https://jsfiddle.net/1nsy9far/

#2 
AlexNek патриот22.03.23 23:16
AlexNek
NEW 22.03.23 23:16 
в ответ alex445 22.03.23 22:50
заменить select на похожий элемент

на какой? Можно и на дивах сделать, но это же сколько нужно пилить?

И фокус нужен и мыша и клава и мультиселект и пр.


У меня эта портянка работает на Эдже

Что то я там листбоха не увидел хммм

#3 
alex445 коренной житель23.03.23 00:57
NEW 23.03.23 00:57 
в ответ AlexNek 22.03.23 23:16, Последний раз изменено 23.03.23 01:39 (alex445)

Похоже любой option не стайлится в по большинству всойствам.

#4 
AlexNek патриот23.03.23 18:39
AlexNek
NEW 23.03.23 18:39 
в ответ alex445 23.03.23 00:57

кое что работает, но не в edge зло

Опять фигню намутили, а была надежда смущ


пока дев ехпресс взяли, пришлось правда клаву прикрутить

#5 
uscheswoi_82 коренной житель25.03.23 18:27
uscheswoi_82
NEW 25.03.23 18:27 
в ответ AlexNek 22.03.23 20:30

Можно листбокс сделать на div-ах, наружний div, и внутри дивы.

кто как обзывается, тот так сам называется... маску ношу чтобы не заразить антиваксеров... Дневник тяжелобольного инвалида
#6 
uscheswoi_82 коренной житель25.03.23 18:51
uscheswoi_82
NEW 25.03.23 18:51 
в ответ uscheswoi_82 25.03.23 18:27

Вот небольшой пример, я сделал на ul-li:

<!DOCTYPE html>
<html>
  <head>
    <title>ListBox Demo</title>
    <style>
      #listbox { width:150px; height:100px; border:1px solid #eee; overflow-y:scroll; padding:1px 1px; }
      #listbox li { width:100%; list-style:none; cursor:pointer;}
      #listbox .selected { background-color:blue; color:white; }
    </style>
    <script>
     // Очистка выделения
     function clear() {
       document.querySelector('li').style.backgroundColor = 'white';
       document.querySelector('li').style.color = 'black';
     }
    </script>
  </head>
  <body>
    <ul id="listbox">
      <li onclick="clear(); this.setAttribute('class', 'selected');">a1</li>
      <li onclick="clear(); this.setAttribute('class', 'selected');">a2</li>
      <li onclick="clear(); this.setAttribute('class', 'selected');">a3</li>
    </ul>
  </body>
</html>
кто как обзывается, тот так сам называется... маску ношу чтобы не заразить антиваксеров... Дневник тяжелобольного инвалида
#7 
uscheswoi_82 коренной житель25.03.23 19:04
uscheswoi_82
NEW 25.03.23 19:04 
в ответ uscheswoi_82 25.03.23 18:51

Вот так работает:

CSS:

#listbox .unselected { background-color:white; color:black; }


Javascript:

<script>
function _clear() {
  var el = document.getElementById('listbox');
  for(c of el.children)
    c.setAttribute('class', 'unselected');
}
</script>


HTML:

  <ul id="listbox">
    <li onclick="_clear(); this.setAttribute('class', 'selected')">a</li>
    <li onclick="_clear(); this.setAttribute('class', 'selected')">b</li>
    <li onclick="_clear(); this.setAttribute('class', 'selected')">c</li>
  </ul>
кто как обзывается, тот так сам называется... маску ношу чтобы не заразить антиваксеров... Дневник тяжелобольного инвалида
#8 
AlexNek патриот26.03.23 11:49
AlexNek
NEW 26.03.23 11:49 
в ответ uscheswoi_82 25.03.23 19:04

никаких скриптов - нужно для блазор. Скрипты, только если уж совсем никак.

Это поначалу просто.

А после нужно еще скроллинг, чек бох и пр.

#9 
alex445 коренной житель26.03.23 14:51
NEW 26.03.23 14:51 
в ответ AlexNek 26.03.23 11:49, Последний раз изменено 26.03.23 14:58 (alex445)

Если Блейзор, то в Радзене вот такой листбокс есть. Там берём первый пример, жмакаем "Edit Source", правим код и жмём "Run". Я пока добился лишь ховер сделать жёлтым с пунктами, просто переписав частично их стили. Как красный пока не понял - там для выделенного элемента другой стиль, но у меня он не переписывается. Можете скопировать код внизу польностью и заменить им код примера - это и есть код примера, но с добавленными мной стилями. Суть в том, чтобы просто сделать флекс-контейнер и растянуть его коллекцию предметов без отступов. Поиграйтесь - может, получится у вас.


Код удалил, заменил новым - смотрите ниже.

#10 
alex445 коренной житель26.03.23 14:52
NEW 26.03.23 14:52 
в ответ alex445 26.03.23 14:51

Template там типа RenderFragment, так что можно любую свою разметку вставлять.

#11 
alex445 коренной житель26.03.23 14:57
NEW 26.03.23 14:57 
в ответ alex445 26.03.23 14:52

Вот получилось. И очистил от мусора. Checked убрал - просто переписал стиль выделенного элемента самого Радзена.


@using RadzenBlazorDemos.Models.Northwind

@inherits DbContextPage

<style>

.rz-listbox-list

{

align-items: stretch;

}

.rz-multiselect-item{

height: 100%;

width: 100%;

}

.rz-state-highlight{

height: 100%;

width: 100%;

background-color: red!important;

border-style: dotted;

}

.rz-multiselect-item:hover {

background-color: yellow!important;

border-style: dotted;

}

</style>

<div class="rz-p-sm-12 rz-text-align-center">

<RadzenListBox @bind-Value=@value Data=@customers TextProperty="CompanyName" ValueProperty="CustomerID" Style="width: 100%; max-width: 400px; height: 200px">

<Template>

Company: @((context as Customer).CompanyName)

</Template>

</RadzenListBox>

</div>

@code {

string value = "AROUT";

IEnumerable<Customer> customers;

protected override async Task OnInitializedAsync()

{

await base.OnInitializedAsync();

customers = dbContext.Customers;

}

}

#12 
alex445 коренной житель26.03.23 14:59
NEW 26.03.23 14:59 
в ответ alex445 26.03.23 14:57, Последний раз изменено 26.03.23 15:00 (alex445)

По дефолту класс rz-listbox-list это флекс контейнер.

Когда элемент выбран, он в Радзене получает класс rz-state-highlight - вот его и переписал. Как там с checked сделать - не знаю.

#13 
AlexNek патриот26.03.23 16:40
AlexNek
NEW 26.03.23 16:40 
в ответ alex445 26.03.23 14:59

Спасибо, но есть еще одна проблема - никаких дополнительных библиотек.

Так что пока дев. ехпресс. Контрол правда, тоже не без проблемный, однако пока удается бороться.

Похоже что у них блазором совсем другая команда занимается, всё хуже чем раньше или просто еще мало времени прошло.

#14 
alex445 коренной житель26.03.23 18:14
NEW 26.03.23 18:14 
в ответ AlexNek 26.03.23 16:40

Может, тот же принцип - посмотрите, какие там стили в компонентах этого Девэкспресса, как они меняются при манипуляциях с компонентами, и перепишите часть под себя. Тем более с изоляцией стилей в Блейзоре это должно быть достаточно легко - добавил файл стилей в компонент и больше нигде, кроме этого компонента, этот стиль не применяется. За подробностями в МСДН.

#15 
alex445 коренной житель26.03.23 18:15
NEW 26.03.23 18:15 
в ответ AlexNek 26.03.23 16:40, Последний раз изменено 26.03.23 18:23 (alex445)

Ещё вариант - глянуть, как они в Радзене это сделали, и скопировать код. Стили там, разметку. Можно в инструментах разработчика браузера, можно в ихнем Гите.


Вообще, я в этом фронтэнд вебе плохо разбираюсь, но у меня догадка, что всё основное я сделал сам - просто переписал нужные мне свойства стилей. Своего рода хак. Да, листбокс рендерится ОС (в смысле элементы option), но я внутренний элемент списка растянул, так что рендеринг ОС перекрылся моим элементом. Просто попробуйте не на option напрямую вешать красящие бэкграунд стили, а на его содержимое (если в option можно запихать какую-нибудь разметку, конечно).

#16 
AlexNek патриот26.03.23 18:47
AlexNek
NEW 26.03.23 18:47 
в ответ alex445 26.03.23 18:14
с изоляцией стилей в Блейзоре

Есть один маленький нюанс - для дев эксперсса это не работает. Тикет по этому поводу даже есть.

Но потихоньку проблемы решаются.


Что фигово сделано:

  • Отрисовка "большого" листбоха медленная
  • Для показа текста используется имя проперти, вместо актион
  • Высота задается в пикселях, а не в "строках листбокса"


Ну и клаву гады не прилепили. Теперь получается, что один элемент в фокусе который принимает события от клавы содержит другой элемент листбох. И не всегда передача фокуса срабатывает нормально.

#17 
AlexNek патриот26.03.23 18:51
AlexNek
NEW 26.03.23 18:51 
в ответ alex445 26.03.23 18:15
Ещё вариант - глянуть, как они в Радзене это сделали

фигвам - без базовых компонентов/классов ничего не работает.


Да, листбокс рендерится ОС

Если бы это было действительно так, то от браузера не зависело бы


Просто попробуйте не на option

Ну ссылку, на попробовать я давал в самом начале.

#18 
alex445 коренной житель26.03.23 20:16
NEW 26.03.23 20:16 
в ответ AlexNek 26.03.23 18:47

  • Отрисовка "большого" листбоха медленная

Без виртуализации?


Они хвалятся, что у них всё хорошо оптимизировано. Правда, там постраничный дата грид, или если непрерывным списком, то с виртуализацией.

#19 
AlexNek патриот26.03.23 20:27
AlexNek
NEW 26.03.23 20:27 
в ответ alex445 26.03.23 20:16
Без виртуализации?

Это же listbox. Да и большой = 15 элементов

Справа появляется какой то странный символ во время отрисовки и при старом коде он вообще в ступор уходил - обнова была через секунд 20

Но в старом коде было быстрое обновление страницы раз 10 подряд, как это убралось, обновление стало незаметно. (И строму листбоху было до лампочки)

#20 
1 2 все