Как идеально центрировать квадратный SVG внутри квадратной кнопки?

ПРИМЕЧАНИЕ. этот вопрос был закрыт как дубликат этого вопроса о центрировании текста внутри блока div. Мой вопрос касается центрирования SVG внутри кнопки. Кнопки, по-видимому, имеют множество скрытых свойств, которые делают это намного сложнее, чем центрирование внутри простого элемента div.

Я попробовал использовать это решение, чтобы центрировать квадратный SVG внутри квадратной кнопки (конечно, по горизонтали и вертикали). Основное отличие заключается в том, что в решении система координат viewBox SVG другая (но все еще квадратная). Кроме того, я указываю ширину и высоту кнопки (хотя она все еще квадратная). Решение продемонстрировало, что оформление кнопки поиска с помощью padding: 0 устранило проблему.

Однако для меня SVG явно ближе к верху, чем к низу, как показывает красный контур. (Он также может быть ближе к левому, чем к правому, но это может быть оптической иллюзией.)

Я постарался исключить из этого примера все несущественные стили. Что нужно, чтобы SVG был идеально центрирован внутри кнопки?

#search-button {
    align-items: center;
    width: 3em;
    height: 3em;
    padding: 0; /* one solution used this */
}
#search-button-svg {
    outline: 1px dotted red;
    width: 2em;
    height: 2em;
}
<button type = "submit" id = "search-button">
   <svg id = "search-button-svg"
        xmlns = "http://www.w3.org/2000/svg" 
        viewBox = "0 0 512 512">
     <path d = "M416 208c0 45.9-14.9 88.3-40
         122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 
         45.3s-32.8 12.5-45.3
         0L330.7 376c-34.4 25.2-76.8 40-122.7 
         40C93.1 416 0 322.9 0
         208S93.1 0 208 0S416 93.1 416 208zM208 
         352a144 144 0 1 0
         0-288 144 144 0 1 0 0 288z"/>
   </svg>
</button>

Используйте гибкую настройку кнопки или calc(size - x) x = отступы границы (px), поля...

NINE 04.09.2024 05:31

Какой браузер вы используете? Safari на IOS еще менее централизован. Разные браузеры оформляют кнопки по-разному, поэтому вам может потребоваться удалить все потенциальные стили, прежде чем начинать заново.

A Haworth 04.09.2024 07:01

Это не должно быть связано с центрированием текста в элементе div. Для кнопок с SVG вы хотите иметь возможность установить размер кнопки и отступ: 0, то есть 3 строки CSS для кнопки, а SVG будет 100%, что по умолчанию, поэтому CSS на кнопке нет. SVG требуется, когда вы устанавливаете атрибут inert в SVG jsfiddle.net/WebComponents/9143afeL (я не знаю, делает ли Сарари это по-другому, тогда это должна быть ошибка) Размер/дополнение SVG с помощью SVG, а не CSS

Danny '365CSI' Engelman 04.09.2024 10:22

@Danny'365CSI'Engelman Я не понимаю, что вы имеете в виду, говоря о ссылке на центрированный текст в div.

Chap 04.09.2024 20:29

Ваш вопрос закрыт Поли ссылкой на другой вопрос SO о центрировании текста в div.

Danny '365CSI' Engelman 05.09.2024 11:49

@Danny'365CSI'Энгельман Согласен. Как вы говорите, речь идет о кнопках с SVG, а не о тексте в div.

Chap 05.09.2024 16:48
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
6
68
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Мне не удалось заставить работать предложенный гибкий интерфейс, и я заметил, что ваши элементы align-items не влияют на приведенный вами код.

Вместо этого этот фрагмент прибегает к старомодному позиционированию с помощью перевода, устанавливая svg в положение: абсолютное, чтобы оно не влияло на кнопку.

#search-button {
  width: 3em;
  height: 3em;
  padding: 0;
  /* one solution used this */
  position: relative;
}

#search-button-svg {
  outline: 1px dotted red;
  width: 2em;
  height: 2em;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
<button type = "submit" id = "search-button">
   <svg id = "search-button-svg"
        xmlns = "http://www.w3.org/2000/svg" 
        viewBox = "0 0 512 512">
     <path d = "M416 208c0 45.9-14.9 88.3-40
         122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 
         45.3s-32.8 12.5-45.3
         0L330.7 376c-34.4 25.2-76.8 40-122.7 
         40C93.1 416 0 322.9 0
         208S93.1 0 208 0S416 93.1 416 208zM208 
         352a144 144 0 1 0
         0-288 144 144 0 1 0 0 288z"/>
   </svg>
</button>

Просто хочу отметить, что это был единственный метод, который я смог найти, который давал разумный вид в Safari IOS, где стиль кнопки по умолчанию отличается от стиля Chrome/Edge, например. Окна.

A Haworth 04.09.2024 08:01

Убедитесь, что line-height внутри кнопки также равен нулю.

#search-button {
    width: 3em;
    height: 3em;
    line-height: 0;
    padding: 0;
}
#search-button > svg {
    outline: 1px dotted red;
    width: 2em;
    height: 2em;
}
<button type = "submit" id = "search-button">
   <svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 512 512"><path d = "M416 208c0 46-15 88-40 123l127 126a32 32 0 0 1-46 46L331 376a208 208 0 1 1 85-168zM208 352a144 144 0 1 0 0-288 144 144 0 1 0 0 288z"/></svg>
</button>

Кажется, это нормально для Edge/Chrome, но в Safari IOS svg находится немного за пределами кнопки.

A Haworth 04.09.2024 07:59
Ответ принят как подходящий

Настройте SVG для отображения блока, а затем замените ширину и высоту кнопки на поле в SVG.

#search-button {
  padding: 0;
  margin: 0;
}

#search-button-svg {
  outline: 1px dotted red;
  width: 2em;
  height: 2em;
  display: block;
  margin: calc(.5em - 2px); /* subtract the width of the border of the button */
}
<button type = "submit" id = "search-button">
   <svg id = "search-button-svg"
        xmlns = "http://www.w3.org/2000/svg" 
        viewBox = "0 0 512 512">
     <path d = "M416 208c0 45.9-14.9 88.3-40
         122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 
         45.3s-32.8 12.5-45.3
         0L330.7 376c-34.4 25.2-76.8 40-122.7 
         40C93.1 416 0 322.9 0
         208S93.1 0 208 0S416 93.1 416 208zM208 
         352a144 144 0 1 0
         0-288 144 144 0 1 0 0 288z"/>
   </svg>
</button>

Кажется, это нормально для Edge/Chrome, но в IOS Safari кнопка оказывается шире своей высоты.

A Haworth 04.09.2024 07:58

Ошибка... Кнопка уже отображает встроенный блок по умолчанию - помогает ли установка поля на ноль? @AHaworth

chrwahl 04.09.2024 08:18

@chrwahl: Вы можете исправить эту проблему с сафари iOS, добавив к кнопке свойство -webkit-appearance:none. Описанное дополнение относится к стилям кнопок Safari по умолчанию.

herrstrietzel 04.09.2024 21:35

@chrwahl Вышеупомянутое предложение -webkit-appearance: none, кажется, решает проблему iOS Safari. Что такого особенного в вашем решении, из-за которого ваша кнопка отображается немного больше, чем в других решениях (в настольных браузерах)?

Chap 04.09.2024 23:58

@Chap, разница заключается в границе кнопки. В этом примере я теперь вычитаю 2 пикселя от границы SVG, так что в итоге кнопка будет иметь ширину и высоту 2 пикселя.

chrwahl 05.09.2024 12:39

Другие вопросы по теме