Я знаю, что этот пост старый. Но у меня было другое решение, которое отлично сработало для меня, и я хотел поделиться им.
Я построил на решении @John Knott использовать текстовое поле mdl с выбором в качестве решения mdl-textfield__input + @user2255242 для меню, но без участия js.
Вот скрипка, иллюстрирующая решение.
JS-скрипт для окна выбора MDL
HTML - я использовал текстовое поле + меню (ul + li), чтобы действовать как выбор, css делает все остальное.
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.indigo-pink.min.css">
<script defer src="https://code.getmdl.io/1.3.0/material.min.js"></script>
<div id="app">
<div class="sorter-holder">
<!-- the textfield, notice the readonly on input -->
<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
<input class="mdl-textfield__input" type="text" v-model="sortBy" id="sorterHolder" readonly>
<label class="mdl-textfield__label" for="sorterHolder">Sort by</label>
</div>
<!-- menu which will act as the options of select. The menu is for the input, and not the div which has mdl-textfield class -->
<ul class="mdl-menu mdl-menu--bottom-left mdl-js-menu mdl-js-ripple-effect sorter-menu" for="sorterHolder">
<li class="mdl-menu__item" v-for="srtr in sortables" @click="update(srtr)">{{ srtr }}</li>
</ul>
</div>
</div>
CSS - основная часть это css
/*
The menu is positioned absolute, and it's positions are calculated dynamically (I think). I wanted it to extend for the entire width of input, and for that needed a relative parent.
Also, the display inline-block was not required in where I actually implemented it. Over there, it was block. So, this might need to change according to layout. */
.sorter-holder {
position: relative;
display: inline-block;
}
/* just giving them a width of 100% to extend for the entire textfield */
.sorter-holder .mdl-menu__outline,
.sorter-holder .mdl-menu__container,
.sorter-menu {
width: 100% !important;
}
VueJS — пример на Vue JS, но легко реплицируется в любом другом фреймворке, т.к. основное выполняется HTML + CSS
new Vue({
el: "#app",
data: {
sortables: [
'Name (A-Z)',
'Name (Z-A)',
'Newest First',
'Oldest First'
],
sortBy: null
},
methods: {
update: function (sortBy) {
this.sortBy = sortBy;
}
}
})
Почему я поступил именно так?
Меню выглядело визуально лучше, чем поле выбора браузера по умолчанию. Но не хотел делать какую-то магию css для опции выбора. И это казалось проще, чем это.
Это можно сделать множеством других способов. Я нашел его лучше и реализовал в одном из своих проектов. Надеюсь, поможет! :)
person
Jeevan MB
schedule
18.08.2018