Metni seçim kutusunda ortalamak mümkün mü?


200

Bunu denedim: http://jsfiddle.net/ilyaD/KGcC3/

HTML:

<select name="state" class="ddList">
    <option value="">(please select a state)</option>
    <option class="lt" value="--">none</option>
    <option class="lt" value="AL">Alabama</option>
    <option class="lt" value="AK">Alaska</option>
    <option class="lt" value="AZ">Arizona</option>
    <option class="lt" value="AR">Arkansas</option>
    <option class="lt" value="CA">California</option>
    <option class="lt" value="CO">Colorado</option>
</select>

CSS:

select { width: 400px; text-align: center; }
select .lt { text-align: center; }

Gördüğünüz gibi çalışmıyor. Metni seçme kutusunda ortalamanın yalnızca bir CSS yolu var mı?


5
Firefox'umda doğru çalışıyor :)
Mateusz Rogulski

10
Krom üzerinde çalışmaz.
Emmanuel

4
@Blazemonger Simetrik görünen bir tasarıma sahip olmanın, insanlar tarafından sözlükbilimsel taramayı kolaylaştırmak için sola hizalı seçeneklerden daha önemli olduğu birçok durumu hayal edebiliyorum. Örneğin, bir mobil cihazda ekranı% 100 yatay olarak dolduran bir cinsiyet seçme seçeneğine sahip olmak istersem, 'Erkek' ve 'Kadın' metinlerinin sonuna kadar itilmesi çok garip görünüyor.
Kent Munthe Caspersen

text-align-last: center'ı deneyin;
Ari

Yanıtlar:


30

Korkarım bu düz CSS ile mümkün değildir ve tamamen çapraz tarayıcı uyumlu hale getirmek mümkün olmayacaktır.

Ancak, bir jQuery eklentisi kullanarak açılır menüyü biçimlendirebilirsiniz:

https://www.filamentgroup.com/lab/jquery-ui-selectmenu-an-aria-accessible-plugin-for-styling-a-html-select.html

Bu eklenti selectöğeyi gizler ve spanözel bir açılır liste stili görüntülemek için anında öğeler vb. Oluşturur. Öğeleri ortalamak için açıklıklar vb. Stilleri değiştirebileceğinizden oldukça eminim.


web.archive.org/web/20160328192510/http://filamentgroup.com/lab/… Filamentgroup'ların artık korunmadığı geliştirilmiş versiyon. github.com/fnagel/jquery-ui
cdignam

390

Chrome için kısmi bir çözüm var :

select { width: 400px; text-align-last:center; }

Seçilen seçeneği ortalar, ancak açılır menüdeki seçenekleri ortalamaz.


18
Safari'de desteklenmiyor
Buts

1
Edge'de de desteklenmez.
mortenpi

13
Firefox'ta çalışmıyor, ancak Firefox'ta çalışan şey text-align: center.
Noitidart

3
widthgerekli değil.
Vahid Amiri

3
Lanet olsun, bu mükemmel, aynı zamanda en son Firefox'ta da çalışıyor ... + rep
w411 3

81

Bu hizalama için. Dene:

select{
    text-align-last:right;
    padding-right: 29px;
    direction: rtl;
}

text-align-lastözellik için tarayıcı desteği burada bulunabilir: https://www.w3schools.com/cssref/css3_pr_text-align-last.asp Görünüşe göre yalnızca Safari hala desteklemiyor.


7
(Değiştim rağmen bu üst cevap, benim için mükemmel çalıştı basit ve saf CSS çözüm olmalıdır text-align-last: right;için centerben ortada etiketler istediği gibi).
JVG

Bu cevap sallanıyor! Başka hiçbir yerde böyle basit bir çözüm bulamadım.
udog

Çok teşekkürler, bu cevap bu tamamen işe yaradığından seçilmelidir!
Nick

1
text-align-son: center; yalnız benim için krom ve firefox'ta çalışıyor. kenarda değil ve ben de safari bahis.
Dennis Heiden

1
Bu hiçbir mobil tarayıcıda çalışmaz. Burada öncelikle çalışmasını istiyorum.
evolross

58

CSS kuralını select sınıfına koymanız gerekir.

CSS metin girintisini kullan

Misal

<select class="day"> /* option 1 option 2 option 3 option 4 option 5 here */ </select>

CSS kodu

select { text-indent: 5px; }

2
Ya anlamadım, ya da metni hizalamak için işe yaramıyor
matanster

metin girintisi ... İlginç, o özelliği bilmiyordum. Çok teşekkürler!
Froxx

9
Bu sadece belirli bir seçenek için çalışacaktır, metin girintisi, seçim kutusunun genişliğine göre seçeneğin metnini ne kadar yatay alan aldığına bağlıdır, bu yüzden bu eksik bir cevaptır, 43 upvotes, uygun cevap aldığına şaşırdım metin girintisini kullanarak yukarıdaki Bay Smee tarafından sağlanmıştır.
Lu Roman

İlginç bir fikir, ancak yüzde ile çalışmaz, böylece her bir öğeyi nasıl ortalayabilirsiniz?
Buts

Bu doğru cevap. Metin girintisini kullanma:% 50 seçeneği sizin için seçeneği seçim içinde ortalar.
John Smith

51

Evet mümkün. Sen kullanabilirsiniz metni-align-son

text-align-last: center;

1
Bu, kapatıldığında seçimde görüntülenen değeri ortalıyor gibi görünüyor. Açılır
menüdeki

1
Evet, merkezde görüntülemek istiyorum ve doğru
Pritesh

26

2020, kullanıyorum:

select {
    text-align: center;
    text-align-last: center;
    -moz-text-align-last: center;
}

1
Ne yazık ki, bu safari için çalışmıyor ... ve Mayıs 2020'den itibaren Apple hala iOS'taki diğer tüm tarayıcıları Safari'nin render motorunu kullanmaya
zorluyor

22

sadece bunu kullanarak:

select {

text-align-last: center;
padding-right: 29px;

}

3
"Padding-right: 29px;" ifadesini eklemenize gerek yoktur. "merkez" kullanıyorsanız. Sanırım şüphelisiniz çünkü Aly-Elgarhy'nin cevabını 25 Ekim 16'dan kopyaladınız.
Jayden Lawson

Birinin cevabından kopyalarken isimlerini belirtmelisiniz.
Munim Munna

Nop, ben directely benim kodundan olduğu gibi kopyaladı, bu yüzden dolgu sağ koymak, ben başka bir çözüm benim kod içine kopyalanmış olabilir, ve sonra çözüm kodumdan stackoverflow içine kopyalanmış olabilir.
Amine_Dev

21

select {
  text-align: center;
  text-align-last: center;
}
option {
  text-align: left;
}
<select>
   <option value="">(please select a state)</option>
   <option class="lt" value="--">none</option>
   <option class="lt" value="AL">Alabama</option>
   <option class="lt" value="AK">Alaska</option>
   <option class="lt" value="AZ">Arizona</option>
   <option class="lt" value="AR">Arkansas</option>
   <option class="lt" value="CA">California</option>
   <option class="lt" value="CO">Colorado</option>
</select>


1
Bu bana yardımcı olan tek çözüm + 1

Mayıs 2020 - Bu, Safari'de (veya tüm iOS cihazlarında herhangi bir tarayıcıda)
çalışmaz

16

Bu JS işlevi sizin için çalışmalıdır

function getTextWidth(txt) {
  var $elm = $('<span class="tempforSize">'+txt+'</span>').prependTo("body");
  var elmWidth = $elm.width();
  $elm.remove();
  return elmWidth;
}
function centerSelect($elm) {
    var optionWidth = getTextWidth($elm.children(":selected").html())
    var emptySpace =   $elm.width()- optionWidth;
    $elm.css("text-indent", (emptySpace/2) - 10);// -10 for some browers to remove the right toggle control width
}
// on start 
$('.centerSelect').each(function(){
  centerSelect($(this));
});
// on change
$('.centerSelect').on('change', function(){
  centerSelect($(this));
});

Tam Codepen burada: http://codepen.io/anon/pen/NxyovL


9

Her zaman sadece css ile çalışmak için aşağıdaki kesmek ile aldık.

padding-left: 45%;
font-size: 50px;

dolgu metni ortalayacak ve metin boyutu için değiştirilebilir :)

Bu tabii ki doğrulama açısından% 100 doğru değil sanırım ama iş yapıyor :)


7

Metin uzunluğunda benzer seçeneklere sahip bir listeniz varsa alternatif "sahte" çözüm (örneğin sayfa seçimi):

padding-left: calc(50% - 1em);

Bu Chrome, Firefox ve Edge'de çalışır. Hile, metni soldan ortaya doğru itmek için, ardından uzunluğun yarısını px, em veya seçenek metninin herhangi birinden soyutlamak için burada.

resim açıklamasını buraya girin

En iyi çözüm IMO (2017'de) yine de JS ile seçimi değiştiriyor ve çapraz seçim desteği için div veya başka bir şeyle kendi sahte seçim kutunuzu oluşturuyor ve tıklama olaylarını bağlıyor.


1
Chrome'da çalışır, ancak IE'de merkezde olduğundan biraz daha sağa bakar.
user3366706

5

Tam Merkezleme değil, yukarıdaki örneği kullanarak seçim kutusunda sol kenar boşluğu yapabilirsiniz.

<style>.UName { text-indent: 5px; }</style><br>

<select  name="UserName" id="UserName" size="1">
    <option class="UName" selected value="select">Select User</option>
    <option class="UName" value="User1">User 1 Name</option>
    <option class="UName" value="User2">User 2 Name </option>
    <option class="UName" value="User3">User 3 Name</option>
</select>

Neden sadece eklemek text-indentiçin <select>@marc carreras dediğim gibi etiketinin?
Munim Munna


3

bunu dene :

select {
    padding-left: 50% !important;
    width: 100%;
}

2

Gerçekten özelleştiremez <select>veya <option>çok fazla. Tek yol (çapraz tarayıcı), benzer bir şey oluşturmak için div ve css / js ile manuel olarak bir açılır menü oluşturmaktır.


2

Herhangi bir çözüm bulamadıysanız, bu hileyi angularjs'de veya js kullanarak div üzerinde bir metinle eşleştirmek için kullanabilirsiniz, bu çözüm açısal olarak tam css uyumludur, ancak select ve div arasında bir eşlemeye ihtiyacınız vardır:

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>

Umarım bu telefon için bu çözümü bulmak bir gün sürdü biri için yararlı olabilir.


onun ortasında değil!
Qui-Gon Jinn

1

Seçenek metnini bir seçim içinde ortalayamasanız da, seçimin üstüne kesinlikle yerleştirilmiş bir div'ı aynı efekte yerleştirebilirsiniz:

#centered
{
  position: absolute;
  top: 10px;
  left: 10px;
  width: 818px;
  height: 37px;
  text-align: center;
  font: bold 24pt calibri;
  background-color: white;
  z-index: 100;
}

#selectToCenter
{
  position: absolute;
  top: 10px;
  left: 10px;
  width: 840px;
  height: 40px;
  font: bold 24pt calibri;
}

$('#selectToCenter').on('change', function () {
    $('#centered').text($(this).find('option:selected').text());
});

<select id="selectToCenter"></select>
<div id="centered"></div>

Div ve select öğelerinin belgede sabit konumlara sahip olduğundan emin olun.


0

Henüz% 100 değil, ama bu pasajı kullanabilirsiniz!

text-align-last: merkez; // Chrome metin hizalaması için: merkez; // Firefox için

Şimdilik Safari veya Edge'de çalışmıyor!


-3

seçenekler statikse, seçim kutunuzdaki değişiklik olayını dinleyebilir ve her bir öğe için dolgu ekleyebilirsiniz

$('#id').change(function() {
    var select = $('#id');
    var val = $(this).val();

    switch(val) {
        case 'ValOne':
            select.css('padding-left', '30px');
            break;
        case 'ValTwoLonger':
            select.css('padding-left', '20px');
             break;
        default:
            return;
    }
});

Her kelime için dolgu bırakan iyi bir ideia değil. Bu kelimeler de veritabanından geliyor ve dinamik?
user3645907

-5

& nbsp bunu ekle ...

    <option value="0"> &nbsp&nbsp&nbsp&nbsp&nbsp--Select Name--</option>

Ortaya hizalanmış metnin efektini elde edene kadar

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.