Как выровнять значок по центру внутри заголовка таблицы по вертикали

#html #css

#HTML #css

Вопрос:

У меня есть динамическая таблица с динамическим номером столбца и строк… В заголовке таблицы мне нужно исправить значок сортировки по вертикали по центру.. Даже размер текста заголовка таблицы является динамическим, и ни одна строка не продолжает увеличиваться… как выровнять значок сортировки по вертикали при увеличении размера текста?

jsfiddle

 <table style="width:100%">
  <tr>
    <th><div class='filter-container header-container'> <div class='header-text'>  Firstname Firstname Firstnam eFirstnam eFirstname Firstname Firstname Firstname Firstname</div><div class='icon-right'> <span    class= "fa fa-sort-asc fa-lg sort-icon "></span><span   class= "fa fa-sort-desc fa-lg sort-icon  "></span></div></div></th>
    <th>Lastname</th> 
    <th>Age</th>
  </tr>
  <tr>
    <td>Jill</td>
    <td>Smith</td>
    <td>50</td>
  </tr>
  <tr>
    <td>Eve</td>
    <td>Jackson</td>
    <td>94</td>
  </tr>
  <tr>
    <td>John</td>
    <td>Doe</td>
    <td>80</td>
  </tr>
</table>
  

CSS:

 table, th, td {
  border: 1px solid black;
  border-collapse: collapse;
}

th, td {
  padding: 5px;
}

.filter-container {
  width: 100%;
  height: 100%;
  position: relative;
  padding: 0px !important;
  margin: 0px !important;
}

.header-container {
  height: 100%;
  vertical-align: middle;
  text-align: center;
}

.header-text {
  font-size: 22px;
  line-height: 24px;
  color: #000000;
  font-weight: normal;
  width: 90%;
  float: left;
  letter-spacing: 0;
  text-align: left;
}

.sort-icon {
  float: right !important;
  clear: right;
  height: 1px !important;
}
  

Комментарии:

1. какой .header-text класс css на самом деле имеет отношение к вашему коду? по какой-либо конкретной причине вы не можете объединить их вместе?

2. Есть ли решение для таблицы css для этого без использования flexbox?

Ответ №1:

Используйте оболочку для всего содержимого ячейки заголовка таблицы. Внутри него используйте два элемента. Текст и значок:

 <th>
  <div class="aligner">
    <div class="text">any text here can be as long as you want</div>
    <div class="icon">your icon here</div>
  </div>
</th>
  

и использовать:

 th .aligner {
  display: flex;
  align-items: center;
}
  

Очевидно, что оба выровненных элемента должны иметь равные вертикальные padding , border и margin s.


Используя только что добавленный вами пример, вот начало:https://jsfiddle.net/websiter/h94yen82 /

Я удалил ваши стили для сортировщика и добавил:

 .header-container {
  justify-content: space-between;
}
.sort-icon {
  display: flex;
  flex-direction: column;
  justify-content: center;
  height: 0;
}
  

Комментарии:

1. Это хорошее решение, но, к сожалению, не приводит к созданию чистого семантического HTML

2. @josh, мы не знаем семантику этого HTML (значок может отображать текущий порядок или это может быть элемент управления для изменения текущего порядка). Вот почему я использовал элементы, лишенные семантики HTML. Не стесняйтесь написать эссе о том, как должна выглядеть HTML-структура заголовка таблицы.

3. Вы правы, здесь очень сложно сделать содержательные комментарии по семантике, поскольку мы не знаем содержимого. Лично меня отпугнула .aligner оболочка, поскольку это по определению кажется несемантическим элементом.

4. Поскольку вы не можете изменить display свойство ячейки таблицы (оно предназначено для ее роли в таблице), оболочки ячеек очень распространены в HTML. Я не вижу лучшего варианта для такой обертки, чем <div> . А вы? <span> Был бы моим следующим вариантом, но для этого потребовался бы некоторый дополнительный CSS, чтобы убедиться, что он всегда покрывает всю ширину ячейки.

5. Кроме того, вы, похоже, считаете, что использование <div> s не является чистым с точки зрения семантики HTML. Это неправильно. A <div> — это деление . Другими словами, часть. Это может быть что угодно. Семантически это означает: неизвестная семантика. Это правильная семантика, когда вы создаете динамический контент и не знаете, для чего он будет использоваться.

Ответ №2:

Быстро / просто исправить, добавить это в .icon-right :

 .icon-right {
    ...
    top: calc(50% - 8px);
    position: relative;
}
  

Редактировать

Поскольку вы хотите применить это ко всем столбцам, попробуйте следующее:

 .icon-right {/* Add this new class */
    top: calc(50% - 8px);
    position: absolute;
    right: 5px;
}

th {/* Add this new class */
    position: relative;
}

.filter-container {
    ...
    /*position: relative;*/ /* remove this line */
    ...
}
  

Попробуйте jsfiddle.

Комментарии:

1. у меня это работает .. но почему мы вычитаем 8 пикселей? можете ли вы объяснить этот фрагмент кода

2. jsfiddle.net/KrishnaAnanthi/6gqn1Lxp/18 когда я добавляю во все столбцы, это прерывается

3. @user2900572 calc() позволяет задать динамическое значение. Таким образом, в основном устанавливается значение top равным 50% (так что оно будет посередине, но это означает, что верхняя часть стрелок находится посередине), затем — 8px (поэтому немного увеличьте его, чтобы оно было идеально посередине). -8 пикселей — это половина высоты значка.

Ответ №3:

Как насчет этого?

 .header-container {
  height: 100%;
  vertical-align: middle;
  text-align: center;
  overflow: hidden;
}

.icon-right {
  position: absolute;
  top: 50%;
  right: 0;
  margin-top:-10px;
}
  

https://jsfiddle.net/56y4wmkz/

Ответ №4:

попробуйте это

  .header-container {
        height: 100%;
        display: flex;
        align-items: center;
        justify-content: space-between;
    }
  

Комментарии:

1. добавьте ссылку на js fiddle.

2. его нет в центре.. посмотрите на разрыв сверху и снизу

3. на самом деле они находятся в центральном положении, когда вы проверяете, вы замечаете, что промежутки расположены точно по центру, стрелки расположены после и перед элементами sudo span, поэтому появляется разница в промежутках… я надеюсь, вы это понимаете…

4. да, он не выровнен по центру по вертикали

Ответ №5:

Попробуйте эти свойства, я думаю, это полезно для вас.

 .header-container {
  display: flex;
  align-items: center;
  justify-content: space-between;
}

.icon-right {
  margin-top: -15px;
}
  

 table, th, td {
  border: 1px solid black;
  border-collapse: collapse;
}
th, td {
  padding: 5px;
}

.filter-container {
	width: 100%;
	height: 100%;
	position: relative;
	padding: 0px !important;
	margin: 0px !important;
}
.header-container {
	height: 100%;
	vertical-align: middle;
	text-align: center;
}

.header-text {
    font-size: 22px;
    line-height: 24px;
}
.header-text {
    color: #000000;
    font-weight: normal;
}

.header-text {
	width: 90%;
	float: left;
	text-align: start;
	letter-spacing: 0;
	text-align: left;
}
.sort-icon {
	float: right !important;
	clear: right;
  height: 1px !important;
}

 .header-container {
        display: flex;
        align-items: center;
        justify-content: space-between;
    }

.icon-right {
    margin-top: -15px;
}  
 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<table style="width:100%">
  <tr>
    <th><div class='filter-container header-container'> <div class='header-text'>  Firstname Firstname Firstnam eFirstnam eFirstname Firstname Firstname Firstname Firstname</div>
      <div class='icon-right'> <span    class= "fa fa-sort-asc fa-lg sort-icon "></span><span   class= "fa fa-sort-desc fa-lg sort-icon  "></span></div></div></th>
    <th>Lastname</th> 
    <th>Age</th>
  </tr>
  <tr>
    <td>Jill</td>
    <td>Smith</td>
    <td>50</td>
  </tr>
  <tr>
    <td>Eve</td>
    <td>Jackson</td>
    <td>94</td>
  </tr>
  <tr>
    <td>John</td>
    <td>Doe</td>
    <td>80</td>
  </tr>
</table>  

это моя ссылка code pen

https://codepen.io/arshiyakhanam_786/pen/JzyvKe

Ответ №6:

вы можете использовать преобразование, чтобы выровнять div по вертикали

 .icon-right{
  top: 40%;
  transform: translateY(-40%);
  position: relative;
  line-height: 1.8em;
}
  

Ответ №7:

Почти ответ: установите высоту двух значков равной 0px или 1px, чтобы сделать две иконки почти, поэтому нельзя щелкнуть для сортировки. Я думаю, вам следует использовать другое рациональное расстояние ширины значка (или изображения) до верха и низа (например fa-caret ). Как насчет этого?

https://jsfiddle.net/2merngco/

Ответ №8:

Я не знаю, как, но использование абсолютной позиции сработало для меня!

 <th>
 Title <span class="sort-icon"><i class="fa fa-sort"></i></span>
</th>
  
 .sort-icon {
    position: absolute;
}