Розмір стилю списку CSS-зображення


81

Я намагаюся встановити власні піктограми SVG із CSS для <ul>елементів списку. Приклад:

<ul>
    <li style="list-style-image: url('first.svg')">This is my first item</li>
    <li style="list-style-image: url('second.svg')">And here's my second</li>
</ul>

Проблема полягає в тому, що зображення занадто великі і розтягують висоту ліній. Я не хочу змінювати розмір зображення, оскільки сенс використання SVG полягає в масштабуванні з роздільною здатністю. Чи є спосіб встановити розмір зображення за допомогою CSS без якогось background-imageзлому?

EDIT: Ось попередній перегляд (велике зображення, навмисно вибране для ілюстрації та драми): http://jsfiddle.net/tWQ65/4/
І моє поточне background-imageобхідне рішення, використовуючи CSS3 background-size: http://jsfiddle.net/kP375/1/


1
шрифти із
значками

Відповіді:


13

Можливо, ви захочете спробувати тег img замість того, щоб встановлювати властивість 'list-style-image'. Встановлення ширини та висоти за допомогою css фактично обрізає зображення. Але якщо ви використовуєте тег img, зображення буде змінено на значення ширини та висоти.


22
Проблема тегу зображення полягає в тому, що його важче змінити пізніше, якщо я повторно використовую деякі піктограми для різних рядків. Він також поєднує вміст та презентацію, чого я намагаюся уникати, коли можу. Я пам’ятаю про це, якщо ніщо інше не працює правильно.
BitLooter

75

Я б використав:

li{
   list-style: none;
}
li::before{
   content: '';
   display: inline-block;
   height: y;
   width: x;
   background-image: url();
}

3
не працював, я навіть намагавсяbackground-size:16px auto;
BillyNair

5
background-size:containце кращий варіант, але я не знаю, чому це не допомогло б вам. Всі мої зображення SVG я встановив висоту та ширину до 100%, а деякі браузери забавні, якщо ви не встановите це у SVG.
Кріс

11
.ladybug{ list-style:none; } .ladybug:before{ content:''; display:inline-block; height:1em; width:1em; background-image:url(http://www.openclipart.org/people/lemmling/lemmling_Ladybug.svg); background-size:contain; background-repeat:no-repeat; }Перевагою цього є те, що ви можете змінювати розмір і навіть анімувати його самостійно. Я знаю, що це працює для мене у Firefox та Chrome.
Кріс

1
Дякуємо за подальші дії. Існує велика ймовірність, що один із інших файлів CSS може його зіпсувати. Я вдався до
олдскульної

Працював у мене. Я використав спеціальний SVG і виявив, що він працює як із значеннями ширини та висоти, так і без них, вказаними у відсотках. Кілька додаткових приміток, поданих тут - w3.org/wiki/CSS/Properties/list-style-image
Afrowave

46

Я використовую:

li {
	margin: 0;
	padding: 36px 0 36px 84px;
	list-style: none;
	background-image: url("../../images/checked_red.svg");
	background-repeat: no-repeat;
	background-position: left center;
	background-size: 40px;
}

де розмір фону встановлює розмір фонового зображення.


23

Ви можете побачити, як механізми макетування визначають розміри зображень зі списку тут: http://www.w3.org/wiki/CSS/Properties/list-style-image

Є три способи обійти це, зберігаючи переваги CSS:

  1. Змініть розмір зображення.
  2. Замість цього використовуйте фонове зображення та відступ (найпростіший спосіб).
  3. Використовуйте SVG без визначеного розміру, використовуючи viewBoxцей розмір, який потім зменшиться до 1em при використанні як list-style-image(Похвала Джеремі).

З правил у зв'язаному документі W3C, схоже, найкращим рішенням є насправді видалити декларацію widthта heightз файлу SVG.
Джеремі

Це те, на чому я стикався з №3, хоча, як я вже сказав, я не впевнений, як це робиться точно, бачачи, як документи SVG зазвичай вимагають координат X та Y на основі заявленої висоти та ширини документа.
CourtDemone

5
Ну, якщо у вас є зображення SVG без заявленої ширини та висоти, але viewBox, я думаю, ви отримаєте бажаний ефект. Перегляд одного зображення в браузері заповнить вікно (з збереженням співвідношення сторін), тому я думаю, що list-style-imageвоно заповнює доступний простір, тобто 1em.
Jeremy

Це звучить приблизно так! Я не дуже вільно користуюся розміткою SVG, але це звучить як потрібне рішення. Я відредагую свій початковий коментар.
CourtDemone

2
З рішенням SVG, чи є спосіб вказати розмір, відмінний від 1em?
Chris Martin

4

Майже як обман, я просто зайшов у редактор зображень і зменшив розмір зображення наполовину. Для мене це працює як оберіг.


3

Завдяки Крісу за початкову точку, це вдосконалення, яке стосується зміни розміру використовуваних зображень, використання першої дитини лише означає, що ви можете використовувати різноманітні значки у списку, щоб дати вам повний контроль.

ul li:first-child:before {
    content: '';
    display: inline-block;
    height: 25px;
    width: 35px;
    background-image: url('../images/Money.png');
    background-size: contain;
    background-repeat: no-repeat;
    margin-left: -35px;
}

Здається, це добре працює у всіх сучасних браузерах, вам потрібно буде переконатися, що ширина та від’ємне поле мають однакове значення, сподіваємось, це допоможе


0

Я зробив своєрідний емулятор терміналу, Bootstrapі Javascriptоскільки мені потрібна була певна динаміка, щоб легко додавати нові елементи, я поставив запит від Javascript.

HTML:

  <div class="panel panel-default">
      <div class="panel-heading">Comandos SQL ejecutados</div>
      <div class="panel-body panel-terminal-body">
          <ul id="ulCommand"></ul>
      </div>
 </div>

Javascript:

function addCommand(command){
    //Creating the li tag   
    var li = document.createElement('li');
    //Creating  the img tag
    var prompt = document.createElement('img');
    //Setting the image 
    prompt.setAttribute('src','./lib/custom/img/terminal-prompt-white.png');
    //Setting the width (like the font)
    prompt.setAttribute('width','15px');
    //Setting height as auto
    prompt.setAttribute('height','auto');
    //Adding the prompt to the list item
    li.appendChild(prompt);
    //Creating a span tag to add the command
    //li.appendChild('el comando');   por que no es un nodo
    var span = document.createElement('span');
    //Adding the text to the span tag
    span.innerHTML = command;
    //Adding the span to the list item
    li.appendChild(span);
    //At the end, adding the list item to the list (ul)
    document.getElementById('ulCommand').appendChild(li);
}

CSS:

.panel-terminal-body {
  background-color: #423F3F;
  color: #EDEDED;
  padding-left: 50px;
  padding-right: 50px;
  padding-top: 15px;
  padding-bottom: 15px;
  height: 300px;
}

.panel-terminal-body ul {
  list-style: none;
}

Сподіваюся, це вам допоможе.


0

Я домігся цього, розмістивши тег зображення перед символом li:


HTML

<img src="https://www.pinclipart.com/picdir/big/1-17498_plain-right-white-arrow-clip-art-at-clipart.png" class="listImage">

CSS

     .listImage{
      float:left;
      margin:2px;
      width:25px
     }
     .li{
      margin-left:29px;
     }

0

Це пізня відповідь, але я розміщую це тут для нащадків

Ви можете редагувати svg та встановлювати його розмір. одна з причин, через яку мені подобається використовувати svg, полягає в тому, що ви можете редагувати її в текстовому редакторі.

Далі наведено формат 32 * 32 svg, розмір якого я внутрішньо змінив, щоб його спочатку відобразили як зображення 10 * 10. він ідеально працював, щоб замінити зображення списку

<?xml version="1.0" ?><svg width="10" height="10"  id="chevron-right" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"><path style="fill:#34a89b;" d="M12 1 L26 16 L12 31 L8 27 L18 16 L8 5 z"/></svg>

Потім я просто додав у свій css наступне

* ul {
    list-style: none;
    list-style-image: url(../images/chevron-right.svg);
}

Це list-style: none;важливо, оскільки заважає показувати зображення списку за замовчуванням під час завантаження альтернативного зображення.


0

Ось приклад гри з Inline SVG для маркера списку (браузери 2020)

list-style-image: url("data:image/svg+xml,
                      <svg width='50' height='50'
                           xmlns='http://www.w3.org/2000/svg' 
                           viewBox='0 0 72 72'>
                        <rect width='100%' height='100%' fill='pink'/>
                        <path d='M70 42a3 3 90 0 1 3 3a3 3 90 0 1-3 3h-12l-3 3l-6 15l-3
                                 l-6-3v-21v-3l15-15a3 3 90 0 1 0 0c3 0 3 0 3 3l-6 12h30
                                 m-54 24v-24h9v24z'/></svg>")
  • Грайте у SVG width&height щоб встановити розмір
  • Грайте, M70 42щоб розташувати руку
  • інша поведінка у FireFox або Chromium!
  • видалити rect

li{
  font-size:2em;
  list-style-image: url("data:image/svg+xml,<svg width='3em' height='3em'                          xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72 72'><rect width='100%' height='100%' fill='pink'/><path d='M70 42a3 3 90 0 1 3 3a3 3 90 0 1-3 3h-12l-3 3l-6 15l-3 3h-12l-6-3v-21v-3l15-15a3 3 90 0 1 0 0c3 0 3 0 3 3l-6 12h30m-54 24v-24h9v24z'/></svg>");
}

span{
  display:inline-block;
  vertical-align:top;
  margin-top:-10px;
  margin-left:-5px;
}
<ul>
  <li><span>Apples</span></li>
  <li><span>Bananas</span></li>
  <li>Oranges</li>
</ul>


0
.your_class li {
    list-style-image: url('../images/image.svg');
}

.your_class li::marker {
    font-size: 1.5rem; /* You can use px, but I think rem is more respecful */
}

Здається, це не впливає на розміри зображення.
Юваль А.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.