Я попытался выровнять текст в элементе <select>
вправо или по центру в сафари. Но ничего не сработало. text-align:center;
работало во всех браузерах, кроме сафари. direction:rtl;
и dir="rtl"
ничего не сделали. список всегда выравнивается по левому краю в Safari. -webkit-appearance: none;
тоже не помогает. Пожалуйста, мне нужно решение.
выравнивание текста не работает в сафари ‹select›
Ответы (7)
Для сафари
text-align: -webkit-center;
Однако лучший способ проанализировать работу HTML/CSS — это Web-Inspector в Safari.
<select style="text-align:center;width:300px;"> <option value="1">1</option> </select>
- person syrkull; 25.06.2012
Если вы не нашли никакого решения, вы можете использовать этот трюк для angularjs или использовать js для сопоставления выбранного значения с текстом в div, это решение полностью совместимо с css для angular, но требует сопоставления между select и div:
var myApp = angular.module('myApp', []);
myApp.controller('selectCtrl', ['$scope',
function($scope) {
$scope.value = '';
}]);
.ghostSelect {
opacity: 0.1;
/* Should be 0 to avoid the select visibility but not visibility:hidden*/
display: block;
width: 200px;
position: absolute;
}
.select {
border: 1px solid black;
height: 20px;
width: 200px;
text-align: center;
border-radius: 5px;
display: block;
}
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Example - example-guide-concepts-1-production</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
</head>
<body ng-app="myApp">
<div ng-app ng-controller="selectCtrl">
<div class=select>
<select ng-model="value" class="ghostSelect">
<option value="Option 1">Option 1</option>
<option value="Option 2">Option 2</option>
<option value="Option 3">Option 3</option>
</select>
<div>{{value}}
</div>
</div>
</div>
</body>
Надеюсь, это может быть полезно для кого-то, так как мне потребовался один день, чтобы найти это решение на телефонной связи.
Это ошибка в сафари.
Ошибка 40216: выравнивание текста не работает для выбранных тегов
https://bugs.webkit.org/show_bug.cgi?id=40216
Подано 2010 ????
Я столкнулся с очень похожей проблемой. Моя проблема заключалась в том, чтобы выровнять текст внутри элемента <select>
на основе стиля text-align
. Это было необходимо для правильной обработки стилей на основе media
.
В Chrome я использовал стиль text-align-last
, однако в Safari этот стиль не поддерживается (согласно MDN).
Вот почему я придумал следующую функцию JavaScript (с использованием text-indent
), которая выполняет выравнивание текста left
и right
(не center
, как это OP вопрос, но в свою защиту я думаю, что этот код можно изменить, чтобы правильно вычислить text-indent
для центрирования):
function SELECT_applyTextAlign(element) {
let styles = document.defaultView.getComputedStyle(element, "");
if ( styles.textAlign == 'left'
|| (styles.direction === 'ltr' && styles.textAlign === 'start')) {
// Left alignment doesn't require any kind of calculations.
element.style.textIndent = 0;
return;
}
if ( styles.textAlign == 'right'
|| (styles.direction === 'ltr' && styles.textAlign === 'end')) {
// Right alignment requires a proper width calculations.
let option = element.querySelector('option[value=\'' + element.value + '\']');
if (!option) {
return;
}
// Get original element width
let width = element.getBoundingClientRect().width;
// Create temporary <select> and <option> elements
let sz_select = document.createElement('select');
let sz_option = document.createElement('option');
// This should ensure both <select> have the same styles and <option> have the same text
sz_select.style.cssText = styles.cssText;
sz_select.style.width = 'auto';
sz_select.value = option.value;
sz_option.value = option.value;
sz_option.text = option.text;
// Append <option>
sz_select.appendChild(sz_option);
// Append <select>
element.parentNode.insertBefore(sz_select, element.nextSibling);
// Copy calculated width
let sz_width = sz_select.getBoundingClientRect().width;
element.style.textIndent = (width - sz_width) + 'px'
// Remove unnecessary element
sz_select.remove();
}
}
Затем я прикрепил обработчики событий load
и resize
, чтобы обеспечить обработку всех элементов <select>
при загрузке страницы и изменении размера окна:
window.addEventListener('load', function() {
let selects = document.getElementsByTagName('select');
Array.prototype.filter.call(selects, function(element) {
SELECT_applyTextAlign(element);
element.addEventListener('change', function () {
SELECT_applyTextAlign(element);
}, false);
});
}, false);
window.addEventListener('resize', function () {
let selects = document.getElementsByTagName('select');
Array.prototype.filter.call(selects, function(element) {
SELECT_applyTextAlign(element);
});
}, false);
Надеюсь, это может кому-то помочь (проверено в chrome, iOS и сафари)
Как я уже сказал в своем комментарии выше, я знаю, что на самом деле это не решение css, но если это важно для вас, это работает как обходной путь, если вы хотите использовать jquery.... он НЕ работает в хроме правильно, но если вы проверите браузер, вы можете просто загрузить его для сафари:
Это полный рабочий пример с использованием только CSS, не требующего Js для выравнивания метки выбора по центру для Safari. он работает во всех браузерах.
.select-wrap {
border: 1px solid #777;
border-radius: 4px;
width:200px;
background-color:#fff;
position:relative;
}
.select-wrap label{
font-size: 20px;
text-transform: uppercase;
color: #777;
width: 100%;
text-align: center;
display: block;
position: absolute;
tex-align: center;
margin: 10px auto;
pointer-events: none;
}
select{
background-color: #fff;
border:0px;
height:50px;
font-size: 16px;
}
<div class="select-wrap">
<label>Color</label>
<select name="color" style="width: 100%;">
<option value=""></option>
<option value="yellow">Yellow</option>
<option value="red">Red</option>
<option value="green">Green</option>
</select>
</div>
Это сработало для меня.
select {
text-align:-moz-center;
text-align:-webkit-center;
}