Изображение вложенное в Button; таинственная разница в высоте 7px [дубликат]

Вставка с определенным индексом (а не, скажем, при первом символе пробела) должна использовать строковое срез / подстрока:

var txt2 = txt1.slice(0, 3) + "bar" + txt1.slice(3);
374
задан web-tiki 22 January 2016 в 18:54
поделиться

9 ответов

По умолчанию изображение отображается inline, как буква.

Он сидит в той же строке, на которой сидят a, b, c и d.

Существует пространство ниже этой строки для descenders, которые вы найдете на таких буквах, как f, j, p и q.

Вы можете отрегулировать vertical-align изображения, чтобы разместить его в другом месте (например, middle) или изменить display, чтобы он не был встроен.

444
ответ дан Quentin 22 August 2018 в 03:37
поделиться
  • 1
    Спасибо за объяснение обоснования. После некоторых экспериментов я понял, что превращение изображения в элемент блока фиксировало мою небольшую проблему с дополнительными интервалами, но я понятия не имел, почему ... это объясняет это совершенно. Благодаря! – Mark G. 18 August 2013 в 04:18
  • 2
    Чтобы быть более точным, это происходит, когда b / c встроенные элементы занимают пространство их текущего line-height. Установка line-height в нужный размер также позволит преодолеть нежелательные пробелы. – Kevin Boucher 15 May 2015 в 19:20
  • 3
    «& Quot; f & quot; квалифицироваться как descender? – j08691 17 February 2016 в 21:50
  • 4
  • 5
    @MeV - Нет. Если у вас был промежуток под изображением, который вы решили с вертикальным выравниванием и зазорами рядом ... тогда у вас было 2 разных вопроса, а у вас еще есть не тот, который описан в этом вопросе. – Quentin 24 June 2016 в 11:33

Я просто добавил float:left в div, и он работал

2
ответ дан Abhishek Pandey 22 August 2018 в 03:37
поделиться
  • 1
    Это связано с тем, что установка float:left вызывает display:block – Kevin Boucher 15 May 2015 в 20:53

Все, что вам нужно сделать, это назначить это свойство:

img {
    display: block;
}

У изображений по умолчанию есть это свойство:

img {
    display: inline;
}
7
ответ дан Daniel Díaz 22 August 2018 в 03:37
поделиться

Вы можете использовать несколько методов для этой проблемы, например

  1. Использование line-height
    #wrapper {  line-height: 0px;  }
    
  2. Использование display: flex
    #wrapper {  display: flex;         }
    #wrapper {  display: inline-flex;  }
    
  3. Используя display: block, table, flex и inherit
    #wrapper img {  display: block;    }
    #wrapper img {  display: table;    }
    #wrapper img {  display: flex;     }
    #wrapper img {  display: inherit;  }
    
4
ответ дан Matheus Avellar 22 August 2018 в 03:37
поделиться

Можно также аннулировать высоту строки родителя:

#wrapper {
  line-height: 0;
}

Все исправления: http://jsfiddle.net/FaPFv/

34
ответ дан Pavlo 22 August 2018 в 03:37
поделиться
  • 1
    ПРЕДУПРЕЖДЕНИЕ! это также убьет любые текстовые узлы в #wrapper. поскольку он будет унаследован. Но бонусные баллы за этого потрясающего скрипача! здесь он обновляется текстовыми узлами. jsfiddle.net/FaPFv/30 – gcb 9 January 2014 в 03:19
  • 2
    @gcb, ты прав, нет серебряной пули, я считаю. – Pavlo 9 January 2014 в 11:03

Другой вариант, предложенный здесь здесь , устанавливает стиль изображения как style="display: block;"

116
ответ дан Thea 22 August 2018 в 03:37
поделиться
  • 1
    Благодарю. Это также фиксировало аналогичную проблему с пространством под флеш-фильмом. (добавлено отображение: блок для вставки / тегов объектов) – jessieloo 18 December 2012 в 20:17
  • 2
    или inline-block, если вы все еще хотите, чтобы он отображался в строке как обычно. – Ian 11 August 2014 в 02:26
  • 3
    Это + комментарий Яна должен был быть принятым ответом. – Imperative 22 June 2015 в 20:00
  • 4
    @Ian @Imperative inline-block, похоже, не работает. – p.matsinopoulos 15 November 2015 в 22:59

Я нашел, что он отлично работает, используя display: block; на изображении и вертикально-выровнять: верх; на текст.

.imagebox {
    width:200px;
    float:left;
    height:88px;
    position:relative;
    background-color: #999;
}
.container {
    width:600px;
    height:176px;
    background-color: #666;
    position:relative;
    overflow:hidden;
}
.text {
    color: #000;
    font-size: 11px;
    font-family: robotomeduim, sans-serif;
    vertical-align:top;
    
}

.imagebox img{ display:block;}
<div class="container">
    <div class="imagebox">
        <img src="http://machdiamonds.com/n69xvs.jpg" /> <span class="text">Image title</span>
    </div>
    <div class="imagebox">
        <img src="http://machdiamonds.com/n69xvs.jpg" /> <span class="text">Image title</span>
    </div>
    <div class="imagebox">
        <img src="http://machdiamonds.com/n69xvs.jpg" /> <span class="text">Image title</span>
    </div>
    <div class="imagebox">
        <img src="http://machdiamonds.com/n69xvs.jpg" /> <span class="text">Image title</span>
    </div>
    <div class="imagebox">
        <img src="http://machdiamonds.com/n69xvs.jpg" /> <span class="text">Image title</span>
    </div>
    <div class="imagebox">
        <img src="http://machdiamonds.com/n69xvs.jpg" /> <span class="text">Image title</span>
    </div>
</div>

или вы можете отредактировать код a JS FIDDLE

3
ответ дан Timothy 22 August 2018 в 03:37
поделиться

Быстрое исправление:

Чтобы удалить зазор под изображением, вы можете:

  • Установить свойство vertical-align изображения на vertical-align: bottom; vertical-align: top; или vertical-align: middle;
  • Установите для свойства отображения изображения значение display:block;

См. следующий код для живой демонстрации:

#vAlign img {
  vertical-align :bottom;
}
#block img{
  display:block;
}

div {border: 1px solid red;width:100px;}
img {width:100px;}
<p>No fix:</p>
<div><img src="http://i.imgur.com/RECDV24.jpg" /></div>

<p>With vertical-align:bottom; on image:</p>
<div id="vAlign"><img src="http://i.imgur.com/RECDV24.jpg" /></div>

<p>With display:block; on image:</p>
<div id="block"><img src="http://i.imgur.com/RECDV24.jpg" /></div>


Объяснение: почему существует пробел под изображением?

Разрыв или дополнительное пространство под изображением не является ошибкой или проблемой, это поведение по умолчанию. Основная причина заключается в том, что изображения заменяются элементами ( см. MDN и W3C ). Это позволяет им «действовать как изображение» и иметь собственные собственные размеры, соотношение сторон ... Браузеры вычисляют свое свойство отображения inline, но они придают им особое поведение, которое приближает их к элементам inline-block (так как вы

Это также означает, что:

[...] когда изображения используются во встроенном контексте форматирования с выравниванием по вертикали: базовая линия, нижняя часть изображения будет отображаться на базовой линии контейнера. ( source: MDN , focus mine )

Поскольку браузеры по умолчанию вычисляют свойство vertical-align для базовой линии, это значение по умолчанию поведение. На следующем изображении показано, где базовая линия находится по тексту:

Location of the baseline on text [/g15]

Элементы, выровненные по базовой линии, должны содержать место для дескрипторов которые простираются ниже базовой линии (например, j, p, g ...), как вы можете видеть на приведенном выше изображении. В этой конфигурации нижняя часть изображения выравнивается по базовой линии, как вы можете видеть в этом примере:

div{border:1px solid red;}
img{width:100px;height:auto;}
<div>
  <img src="http://i.imgur.com/RECDV24.jpg" />jpq are letters with descender
</div>


Вот почему поведение по умолчанию тега <img> создает пробел в нижней части его контейнера и почему изменение свойства вертикального выравнивания или свойства отображения удаляет его, как в следующей демонстрации:

div {width: 100px;border: 1px solid red;}
img {width: 100px;height: auto;}

.block img{
  display:block;
}
.bottom img{
  vertical-align:bottom;
}
<p>Default:</p>
<div>
  <img src="http://i.imgur.com/RECDV24.jpg" />
</div>
<p>With display:block;</p>
<div class="block">
  <img src="http://i.imgur.com/RECDV24.jpg" />
</div>
<p>With vertical-align:bottom;</p>
<div class="bottom">
  <img src="http://i.imgur.com/RECDV24.jpg" />
</div>

69
ответ дан web-tiki 22 August 2018 в 03:37
поделиться
  • 1
    Вот почему установка размера шрифта в 0 не работает. или не так ли? – Persijn 22 January 2016 в 19:12
  • 2
    @Persijn это делает. Подобно настройке line-height:0;, но я не считаю это хорошим решением по сравнению с изменением свойств вертикального выравнивания или отображения – web-tiki 22 January 2016 в 19:14
  • 3
    Обратите внимание, однако, что некоторые браузеры не уважают font-size:0: они устанавливают размер шрифта минимальным размером в пользовательских настройках. – Mr Lister 6 December 2017 в 18:12
  • 4
    Да, это кажется белым пространством. – HQtunes.com 23 January 2018 в 13:56
  • 5
    ну, я думаю, что позиция middle text-top sub super на картинке неверна. – xianshenglu 19 May 2018 в 02:10
2
ответ дан Abhishek Pandey 5 November 2018 в 02:55
поделиться