Apakah mungkin untuk memusatkan teks dalam kotak pilih?

198

Saya mencoba ini: 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; }

Seperti yang Anda lihat, itu tidak berhasil. Apakah ada cara khusus CSS untuk memusatkan teks di kotak-pilih?

ilyo
sumber
5
Di Firefox saya berfungsi dengan benar :)
Mateusz Rogulski
10
Tidak berfungsi di chrome.
Emmanuel
4
@Blazemonger Saya dapat membayangkan banyak situasi di mana memiliki desain yang terlihat simetris lebih penting daripada opsi yang disejajarkan untuk memudahkan pemindaian leksikografis oleh manusia. Misalnya, jika saya ingin memiliki opsi pemilihan gender yang mengisi layar 100% secara horizontal pada perangkat seluler, terlihat sangat aneh bahwa teks 'Pria' dan 'Wanita' didorong sepenuhnya ke kiri.
Kent Munthe Caspersen
coba text-align-last: center;
Ari

Jawaban:

29

Saya khawatir ini tidak mungkin dengan CSS biasa, dan tidak akan mungkin untuk membuat browser yang sepenuhnya kompatibel.

Namun, menggunakan plugin jQuery, Anda bisa menata dropdown:

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

Plugin ini menyembunyikan selectelemen, dan membuat spanelemen dll dengan cepat untuk menampilkan gaya daftar drop down kustom. Saya cukup yakin Anda akan dapat mengubah gaya pada bentang dll untuk memusatkan item.

Singkat
sumber
web.archive.org/web/20160328192510/http://filamentgroup.com/lab/… Ini adalah versi yang disempurnakan sekarang karena filamentgroup tidak lagi dipertahankan. github.com/fnagel/jquery-ui
cdignam
386

Ada solusi parsial untuk Chrome :

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

Itu memusatkan opsi yang dipilih, tetapi bukan opsi di dalam dropdown.

Julian Cardenas
sumber
18
Tidak didukung di Safari
Buts
1
Juga tidak didukung di Edge.
mortenpi
13
Tidak berfungsi di Firefox, tetapi yang berfungsi di Firefox adalah text-align: center.
Noitidart
3
widthtidak perlu.
Vahid Amiri
3
Sial, ini sempurna, juga berfungsi pada Firefox terbaru ... + rep
w411 3
81

Itu untuk menyelaraskan ke kanan. Cobalah:

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

dukungan browser untuk text-align-lastatribut dapat ditemukan di sini: https://www.w3schools.com/cssref/css3_pr_text-align-last.asp Sepertinya hanya Safari yang masih tidak mendukungnya.

Aly-Elgarhy
sumber
7
Ini harus menjadi jawaban atas, sederhana & solusi CSS murni yang bekerja sempurna untuk saya (meskipun saya berubah text-align-last: right;untuk centeryang saya ingin label di tengah).
JVG
Jawaban ini mengguncang! Di tempat lain saya tidak menemukan solusi yang sederhana.
udog
Terima kasih banyak, jawaban ini harus dipilih karena ini benar-benar berfungsi!
Nick
1
text-align-last: center; sendiri bekerja untuk saya di chrome dan firefox. tidak takut dan saya akan bertaruh pada safari juga.
Dennis Heiden
1
Ini tidak berfungsi di browser seluler mana pun. Di situlah terutama saya ingin itu berfungsi.
Berkembang
58

Anda harus memasukkan aturan CSS ke dalam kelas pilih.

Gunakan indentasi teks CSS

Contoh

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

Kode CSS

select { text-indent: 5px; }
marc carreras
sumber
2
Entah saya tidak mendapatkannya, atau hanya tidak berfungsi untuk menyelaraskan teks
matanster
text-indent ... Menarik, saya tidak tahu tentang properti itu. Terima kasih banyak!
Froxx
9
Ini hanya akan bekerja untuk satu opsi tertentu, indentasi teks tergantung pada seberapa banyak ruang horisontal mengambil teks dari opsi sehubungan dengan lebar kotak pilih, jadi ini adalah jawaban yang tidak lengkap, saya kagum mendapat 43 upvotes, jawaban yang tepat menggunakan indentasi teks disediakan oleh Mr Smee di atas.
Lu Roman
Ide yang menarik, tetapi tidak akan berhasil dengan persentase jadi bagaimana Anda bisa memusatkan setiap item?
Buts
Ini jawaban yang benar. Menggunakan indentasi teks: 50% akan memusatkan opsi untuk Anda di dalam pilih.
John Smith
49

Ya itu mungkin. Anda dapat menggunakan text-align-last

text-align-last: center;
Manjeet Kumar Nai
sumber
1
Ini tampaknya memusatkan nilai yang ditampilkan dalam pilih ketika ditutup. Opsi dalam dropdown masih selaras ke kiri (setidaknya di Chrome pada Sep 2019)
bjg222
1
Ya saya ingin ditampilkan di tengah dan itu benar
Pritesh
24

2020, saya menggunakan:

select {
    text-align: center;
    text-align-last: center;
    -moz-text-align-last: center;
}
jzuhri
sumber
Sayangnya, ini tidak bekerja di safari ... dan pada Mei 2020, Apple masih memaksa semua browser lain di iOS untuk menggunakan mesin render Safari ...
Doomd
22

hanya menggunakan ini:

select {

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

}
Amine_Dev
sumber
3
Anda tidak perlu memasukkan "padding-right: 29px;" jika Anda menggunakan "pusat". Saya menduga Anda memilikinya karena Anda menyalin jawaban Aly-Elgarhy dari 25 Oktober 16.
Jayden Lawson
Ketika Anda menyalin dari jawaban seseorang, Anda harus menyebutkan nama mereka.
Munim Munna
Tidak, saya menyalinnya langsung dari Kode saya apa adanya, itu sebabnya saya menempatkan hak padding, mungkin saya menyalin solusi dari yang lain ke dalam kode saya, dan kemudian saya menyalin solusi dari kode saya ke stackoverflow.
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>

Jamie Hutber
sumber
1
Ini adalah satu-satunya solusi yang membantu saya memberi +1
Mei 2020 - Ini tidak berfungsi di Safari (atau browser apa pun di semua perangkat iOS)
Doomd
16

Fungsi JS ini seharusnya bekerja untuk Anda

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));
});

Codepen lengkap di sini: http://codepen.io/anon/pen/NxyovL

Tuan Smee
sumber
9

Saya selalu lolos dengan hack berikut untuk membuatnya bekerja dengan css saja.

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

padding akan memusatkan teks dan dapat di-tweak untuk ukuran teks :)

Ini jelas tidak 100% benar dari sudut pandang validasi, saya rasa tetapi ia bekerja dengan baik :)

Ben Pretorius
sumber
7

Solusi "palsu" alternatif jika Anda memiliki daftar dengan opsi yang mirip dengan panjang teks (pilih halaman misalnya):

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

Ini berfungsi di Chrome, Firefox dan Edge. Triknya adalah di sini untuk mendorong teks dari kiri ke tengah, lalu kurangi setengah panjangnya dalam px, em atau apa pun dari teks opsi.

masukkan deskripsi gambar di sini

Solusi terbaik IMO (pada 2017) masih mengganti yang terpilih melalui JS dan membangun kotak pilih palsu Anda sendiri dengan divs atau apa pun dan mengikat acara klik di atasnya untuk dukungan lintas-browser.

Dennis Heiden
sumber
1
Berfungsi di Chrome, tetapi di IE terlihat sedikit tidak benar daripada di tengah.
user3366706
5

Tidak cukup Pemusatan tetapi menggunakan contoh di atas Anda dapat membuat margin kiri di kotak pilih.

<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>
Richard
sumber
Mengapa tidak menambahkan saja text-indentke <select>tag seperti yang dikatakan @marc carreras?
Munim Munna
5

ini bekerja untuk saya:

text-align: center;
text-align-last: center;
Diego Santa Cruz Mendezú
sumber
3

coba ini :

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

Anda tidak dapat benar-benar menyesuaikan <select>atau <option>banyak. Satu-satunya cara (cross-browser) adalah secara manual membuat drop down dengan divs dan css / js untuk membuat sesuatu yang serupa.

Emmanuel
sumber
2

Jika Anda tidak menemukan solusi apa pun, Anda dapat menggunakan trik ini pada angularjs atau menggunakan js untuk memetakan nilai yang dipilih dengan teks pada div, solusi ini sesuai dengan css pada angular tetapi membutuhkan pemetaan antara select dan 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>

Semoga ini bisa bermanfaat bagi seseorang karena saya butuh satu hari untuk menemukan solusi ini di phonegap.

jup31
sumber
ini bukan di tengah!
Qui-Gon Jinn
1

Meskipun Anda tidak dapat memusatkan teks opsi di dalam pilihan, Anda dapat meletakkan div yang benar-benar diposisikan di atas pilihan untuk efek yang sama:

#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>

Pastikan kedua div dan pilih memiliki posisi tetap dalam dokumen.

szozz
sumber
0

Ini belum 100%, tetapi Anda dapat menggunakan potongan ini!

text-align-last: center; // Untuk penyelarasan teks Chrome: center; // Untuk Firefox

Tidak berfungsi di Safari atau Edge, untuk saat ini!

pengguna3645907
sumber
-3

jika opsinya statis, Anda dapat mendengarkan acara perubahan pada kotak pilih Anda dan menambahkan padding untuk setiap item individual

$('#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;
    }
});
Brian Parks
sumber
Itu bukan ide yang baik untuk menempatkan padding-kiri untuk setiap kata. Bagaimana dengan kata-kata ini yang berasal dari de database dan bersifat dinamis?
user3645907
-5

tambahkan & nbsp seperti ini ...

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

sampai Anda mendapatkan efek teks rata tengah

Ajesh Ajayan
sumber