подключить образ и статью HTML, CSS [дублировать]

Чтобы размер шрифта соответствовал его контейнеру, а не окно, см. функцию resizeFont(), которую я поделил в этом вопросе (комбинация других ответов, большинство из которых уже связаны здесь).

Vanilla JS: Изменить размер шрифта - удивительный, чтобы соответствовать контейнеру

JS:

function resizeFont() {
  var elements  = document.getElementsByClassName('resize');
  console.log(elements);
  if (elements.length < 0) {
    return;
  }
  _len = elements.length;
  for (_i = 0; _i < _len; _i++) {
    var el = elements[_i];
    el.style.fontSize = "100%";
    for (var size = 100; el.scrollHeight > el.clientHeight; size -= 10) {
      el.style.fontSize = size + '%';
    }
  }
}

] Возможно, вы можете использовать vw / vh как резерв, поэтому вы динамически назначаете блоки em или rem с помощью javascript, гарантируя, что шрифты будут масштабироваться до окна, если javascript отключен.

Применить .resize для всех элементов, содержащих текст, который вы хотите масштабировать.

Запустите функцию перед добавлением слушателя событий изменения размера окна. Затем любой текст, который не соответствует его контейнеру, будет уменьшен при загрузке страницы, а также при изменении размера.

ПРИМЕЧАНИЕ. Значение по умолчанию font-size должно быть установлено как em , rem или % для достижения правильных результатов ... и если стиль ваших элементов слишком сложный, браузер может упасть, если вы начнете отчаянно изменять размер окна.

372
задан web-tiki 22 January 2016 в 18:54
поделиться

10 ответов

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

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

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

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

443
ответ дан Quentin 17 August 2018 в 20:53
поделиться
  • 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 17 August 2018 в 20:53
поделиться
  • 1
    Это связано с тем, что установка float:left вызывает display:block – Kevin Boucher 15 May 2015 в 20:53

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

img {
    display: block;
}

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

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

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

  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 17 August 2018 в 20:53
поделиться

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

#wrapper {
  line-height: 0;
}

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

33
ответ дан Pavlo 17 August 2018 в 20:53
поделиться
  • 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 17 August 2018 в 20:53
поделиться
  • 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 17 August 2018 в 20:53
поделиться

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

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

  • Установить свойство 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 17 August 2018 в 20:53
поделиться
  • 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 6 September 2018 в 13:27
поделиться
2
ответ дан Abhishek Pandey 29 October 2018 в 19:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: