Значение по умолчанию для центра css в выпадающем меню выбора
Я использую select
и ng-options
в angularjs, чтобы показать список лет, которые я сам создаю. Я передаю текущий год в качестве значения по умолчанию для выбора.
здесь ссылка plunker.
Мой вопрос:
Как центрировать список по умолчанию?
Мой плукер не завершен, потому что моя реальная ситуация похожа на ту, что нашла здесь
http://www.cliptheme.com/demo/clip-two/AngularJs-Admin/STANDARD/#/app/form/wizard
Перейдите в Forms/ Мастер форм/ Шаг 3 Биллингс
как вы можете видеть, выбрав год, а затем снова щелкнув по нему, меню будет сосредоточено на выбранном году.
Но моя проблема в том, что когда я передаю ему значение года по умолчанию, как если бы я уже выбрал, а затем я нажимаю на список, я должен увидеть, что оно сосредоточено на этом значении по умолчанию, но это не так. Когда я снова нажму на этот год и снова нажму на список, я вижу, что он центрирован.
Другими словами, передача года в качестве значения по умолчанию не играет ту же роль, что и если я впервые выбрал его, щелкнув, потому что, когда я снова нажимаю повторно, он не центрируется. Как мы можем исправить эту проблему?
Вот файл CSS для используемого вами селектора: ссылка css, это не включено в плункер или фрагмент, потому что я не мог правильно воспроизвести этот CSS на плунтере, если можно, сделайте это.
var app = angular.module('app', []);
app.controller('MyCtrl', function($scope) {
$scope.dates = {};
$scope.years = [{value: 'Year', disabled: true}];
var current_year = new Date().getFullYear();
for(var i = current_year - 20; i <= current_year + 20; i++){
$scope.years.push({value: i + ''});
}
var d = new Date();
var n = d.getFullYear();
$scope.dates.startYear = n;
});
<link href="//netdna.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet">
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.11/angular.min.js"></script>
<body ng-app="app">
<div ng-controller="MyCtrl">
<label class="control-label">Year</label>
<select name="startYear" ng-model="dates.startYear" id="startYear"
ng-options="year.value as year.value disable when year.disabled for year in years"
required>
<option value="" disabled >Choose one</option>
</select>
</div>
</body>
Ответы
Ответ 1
Сначала я должен сказать, что тег <select>
не является стандартным тегом, так как рендеринг этого тега частично выполняется ОС, а не браузером, поэтому он ведет себя немного иначе, чем другие элементы, t действительно примените css ко всему, что вам нужно там.
Сказав это - есть (почти) всегда хаки, которые можно сделать, и я собираюсь показать этот пример как один из хаков:
function selectfocus() {
el = event.target;
sizeWhenOpen = 5;
el.size=sizeWhenOpen;
totalHeight = el.getBoundingClientRect().height;
heightPerOption = el.scrollHeight/el.options.length;
currentIndex = el.selectedIndex;
el.scrollTop = heightPerOption * (currentIndex - Math.floor(sizeWhenOpen/2));
}
<select
onfocus="selectfocus()"
onblur="this.size=1;"
onchange="this.size=1; this.blur();">
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
<option>6</option>
<option>7</option>
<option>8</option>
<option>9</option>
<option>10</option>
<option>11</option>
<option>12</option>
<option>13</option>
<option>14</option>
<option>15</option>
<option>16</option>
<option>17</option>
<option>18</option>
<option>19</option>
<option>20</option>
<option>21</option>
</select>
Ответ 2
Почему бы просто написать некоторый CSS для таргетинга тега span?
span { text-align: center; }
или еще лучше.... пометьте его идентификатору или классу
.className { text-align: center; }
#idName { text-align: center; }
Ниже представлен функциональный плункер.
Пример плунжера
Ответ 3
Что касается вашей ссылки на 2 обновления, вам просто нужно обновить свой CSS. Укажите ширину (независимо от того, что вы хотите) вашей области, в которой вы должны поместить поле выбора. Это, безусловно, устранит вашу проблему:)
.myctrl {
position: absolute;
vertical-align: top;
margin-left: 50px;
width: 200px;
}
Ответ 4
Дело в том, что ваш пример на cliptheme.com не прокручивается вообще. Он просто остается центрированным, потому что div сохраняет его положение прокрутки.
Итак, чтобы решить вашу проблему, вам просто нужно вычислить правильную позицию и установить ее в div .cs-options
. Одно событие, которое может быть использовано, - _toggleSelect
.
Рабочий пример (см. строку 370-372):
https://plnkr.co/edit/XgoeU8igSSeu044EFBCV
Это всего лишь намек, и ваше окончательное решение должно быть более сложным (например, не запрашивать элементы при каждом открытии списка).
Ответ 5
Вы можете применить стиль к идентификатору окна выбора, как показано ниже
<!DOCTYPE html>
<html ng-app="app">
<head>
<link href="#" onclick="location.href='https://netdna.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css'; return false;" rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.11/angular.min.js"></script>
<script src="script.js"></script>
</head>
<style>
#startYear{
padding:0 1% 0 10%;
}
</style>
<body>
<div ng-controller="MyCtrl">
<label class="control-label">Year</label>
<select name="startYear" ng-model="dates.startYear" id="startYear"
ng-options="year.value as year.value disable when year.disabled for year in years"
required>
<option value="" disabled >Choose one</option>
</select>
</div>
</body>
</html>