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?


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.


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.


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.


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

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;

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

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;

}

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>


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


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 :)


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.


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>

Mengapa tidak menambahkan saja text-indentke <select>tag seperti yang dikatakan @marc carreras?
Munim Munna


3

coba ini :

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

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.


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.


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.


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!


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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.