Видалення пробілів між елементами HTML при використанні розривів рядків


110

У мене сторінка з рядком близько 10 imgс. Для читабельності HTML я хочу вставити рядок між кожним imgтегом, але це робить пробіл між зображеннями, чого я не хочу. Чи можу я щось зробити, крім зламу посередині тегів, а не між ними?

Редагувати: Ось скріншот того, що я маю досі. Я хотів би, щоб зображення хребта книги відображалися у випадкових поєднаннях, використовуючи PHP. Ось чому мені потрібні окремі imgтеги.

Знімок екрана


Якщо ви використовуєте Smarty , ви можете використовувати {strip}. Інші двигуни шаблону повинні мати подібні теги.
користувач

Відповіді:


68

Ви можете використовувати CSS. Налаштування дисплея: блокувати або поплавати: ліворуч на зображеннях ви зможете визначити свій власний інтервал та відформатувати HTML, як вам завгодно, але вплине на макет способами, які можуть бути або не підходити.

Інакше ви маєте справу з вбудованим вмістом, тому важливим є форматування HTML - оскільки зображення будуть ефективно діяти як слова.


Це мій улюблений підхід. Хоча це може часом задаватись питанням, чому текст не відображається, якщо згодом я забуду визначити розмір шрифту для дочірніх елементів.
Астротим

159

Вибачте, якщо це старе, але я просто знайшов рішення.

Спробуйте встановити значення font-size0. Таким чином, пробіли між зображеннями будуть шириною 0, і на зображення це не вплине.

Не знаю, чи працює це у всіх браузерах, але я спробував це з Chromium та деякими <li>елементами display: inline-block;.


9
Я можу підтвердити це в Firefox та Safari на Mac OSX, а також у Chrome. Я не можу повірити, що це не найкраща відповідь. Яка чудова ідея, я думаю, що справді відповідає на питання / дає запитувачу те, що вони шукають.
Дуг

16
За винятком того, що це порушить макети, які використовують emодиниці.
Девіус

6
Якщо встановити font-size0, це означає, що ви не можете використовувати emпристрій для масштабованого дизайну після цієї точки. Для деяких людей ця відповідь марна.
LB--

3
Я також перевірив аналіз Кріса Койєра на його сторінці в розділі "Встановити розмір шрифту на нуль", щоб дізнатись про інші відомості про інші випадки, коли це може не працювати: css-tricks.com/fighting-the-space-bet between -inline-block-elements
Кріс Кемпен

А тепер, коли у нас є флексбокс, усе це більше не потрібно :) Нарешті гарне планування
opatut

70

Ви можете використовувати коментарі.

 <img src="..." alt="..."><!--
 --><img src="..." alt="..."><!--
 --><img src="..." alt="..."><!--
 --><img src="..." alt="...">

Я б переймався семантикою того, щоб мати ряд зображень поруч.


1
Гарна ідея. Зображення для прикраси - чи це має значення семантично?
Skilldrick

13
Декоративні малюнки належать до CSS, а не до HTML!
Конрад Рудольф

11
Це залежить, наскільки декоративні зображення. Гарний кордон? Це має бути в CSS. Серія невеликих фотографій літаків на сайті про політ? Можливо, не потрібен вміст, який не забезпечує рівноваги тексту.
Квентін

1
@ MihaiAlexandruBîrsan - font-size:0у багатьох випадках жахливо, оскільки ти втрачаєш спадщину. так, ви можете використовувати remодиниці, але все-таки ваші медіа-запити припинять функціонувати для цього елемента, і вам доведеться все змінити
vsync

1
Я щойно виявив цю маленьку хитрість, тоді побачив вашу відповідь. Трохи суворого, але йде довгий шлях, щоб HTML не був зведений в один довгий рядок.
Нік Бедфорд

26

У вас є два варіанти, не роблячи приблизних матеріалів з CSS. Перший варіант - використовувати javascript для видалення дітей, що лише пробіли, з тегів. Приємнішим варіантом є використання факту, що пробіли можуть існувати всередині тегів, не маючи сенсу. Так:

<div id="[divContainer_Id]"
    ><img src="[image1_url]" alt="img1"
    /><img src="[image2_url]" alt="img2"
    /><img src="[image3_url]" alt="img3"
    /><img src="[image4_url]" alt="img4"
    /><img src="[image5_url]" alt="img5"
    /><img src="[image6_url]" alt="img6"
/></div>

2
Я насправді віддаю перевагу цьому стилю. Так, це некрасиво, але для нього не потрібні хакі CSS, які можуть мати всілякі побічні ефекти.
Штійн де Вітт

24

Flexbox може легко усунути цю стару проблему:

.image-wrapper {
  display: flex;
}

Більше інформації про flexbox: https://css-tricks.com/snippets/css/a-guide-to-flexbox/


4
На сьогоднішній день Flexbox - це найчистіше і найпростіше рішення. Я думаю, що це має бути головною відповіддю тут. { flex-direction: row; flex-wrap: nowrap; }можна додати для більшої читабельності.
Роберт Кузнір

2
Це найкраща сучасна відповідь
Нейт

@RobertKusznier Я не згоден із зазначенням, flex-direction: rowі flex-wrap: nowrapвони все одно є типовими. Зробити це просто, як правило, найкраще! Крім того, більшість випадків користувач насправді захоче flex-wrap: wrap.
Марк.2377

13

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

У Firefox це досить просто, просто встановлений word-spacing: -1emна батьківський елемент. Чомусь Chrome ігнорує це (і наскільки я тестував, він ігнорує пробіл слів незалежно від значення). Тож крім цього я додаю letter-spacing: -.31emдо батьків і letter-spacing: normalдо дітей. Ця частка em є розміром простору ТОЛЬКО, якщо ваш розмір em стандартизований . Firefox, у свою чергу, ігнорує негативні значення для проміжків літер, тому не додасть їх до інтервалу слів.

Я перевірив це на Firefox 13 (win / ubuntu, 14 на android), Google Chrome 20 (win / ubuntu), Android Browser на ICS 4.0.4 та IE 9. І я спокусився сказати, що це також може працювати на Safari, але я насправді не знаю ...

Ось демонстрація http://jsbin.com/acucam


1
Це, на мою професійну думку, найкраще рішення. Я тестував його в Safari 5 і 6 на робочому столі, а також Mobile Safari на iPad другого покоління. Однак це спрацьовує, якщо скидати пробіли літер у дитини, вам також потрібно включити пробіл слів: нормальний; як шафарі його шанують. Чудова робота, Flatline!
hndcrftd

2
word-spacing: -1emСтиль , здається , щоб зробити слово перекриття в поточній версії Chrome.
Сем

@Sam вибачте за неймовірно тривалу затримку: PI змінив пробіл слів на 0,05, схоже, що нові версії firefox не могли менше піклуватися про цей атрибут, достатньо проміжків літер. Я зараз на Ubuntu, тому не перевіряв його на Windows. Ось оновлена ​​версія jsbin.com/acucam/14
Flatline

1
Ви пробували це з різними шрифтами? Це здається неймовірно нетрадиційним і дуже, дуже ймовірно, зламається.
dudewad

12

Я запізнився (я просто задав запитання і знайшов тонкий у відповідному розділі), але я думаю, що відображення: table-cell; є кращим рішенням

<style>
img {display:table-cell;}
</style>

<img src="img1.gif">
<img src="img2.gif">
<img src="img3.gif">

Єдина проблема полягає в тому, що він не буде працювати на IE 7 та більш ранніх версіях, але це можна виправити за допомогою хак-версії


Це добре, але лише недоліком є ​​те, що елементи втрачають здатність плавати по центру, якщо у батьків є вирівнювання тексту: центр;
Младен Яньєтович

Виходить, але у випадку, якщо ви хочете вирівняти зображення в праву сторону просто за допомогою вирівнювання тексту: праворуч (на батьківському рівні та без поплавця) - рішення не підходить сумно.
Herr_Hansen

2
Можливо, може працювати, але деякі екранізатори інтерпретують display: table-*семантично і читають так, ніби користувач пересувався по таблиці.
Тарка

5

Використовуйте таблицю стилів CSS для вирішення цієї проблеми, наприклад наступний код.

[divContainer_Id] img
{
    display:block;
    float:left;
    border:0;
}

alt текст http://rabu4g.bay.livefilestore.com/y1pWoAOBMiLumd2iQTAreYjQCDIkHImh2g_b2g9k4AnxtDNrCjvzL6bK7skG8QKMRNWkMG7N8e5Xm7pgle3tdCJNNPCNNNDCNNNNTCNNNTKNNPKNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRZAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXL)

Тестування на Firefox 3.5 Final!

PS. ваш html повинен подобатися це.

<div id="[divContainer_Id]">
    <img src="[image1_url]" alt="img1" />
    <img src="[image2_url]" alt="img2" />
    <img src="[image3_url]" alt="img3" />
    <img src="[image4_url]" alt="img4" />
    <img src="[image5_url]" alt="img5" />
    <img src="[image6_url]" alt="img6" />
</div>

Він сказав "рядок", а не "стовпець", і ваш приклад HTML недійсний.
Квентін

3
Він хоче одного ряду з кількома зображеннями у "стовпцях". Ця відповідь фактично вирішує проблему, хоча "показ: блок" є зайвим.
Боббі Джек

3

Чи можу я щось зробити, крім зламу посередині тегів, а не між ними?

Не зовсім. Оскільки <img>s - це вбудовані елементи, пробіли між цими елементами розглядаються HTML-рендерінгом як істинні пробіли в тексті - надлишкові пробіли (і розриви рядків) будуть усічені, але окремі пробіли будуть вставлені в символьні дані текстового елемента.

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


1

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

<img
src="image1.jpg"><img
src="image2.jpg"><img
src="image3.jpg"><img
src="image4.jpg">

Зауважте, що в цьому коді немає пробілів. Місця, де пробіли зазвичай використовуються в HTML, замінюються поверненнями каретки. Це менш багатослівно, ніж як використання коментарів, так і використання пробілів, як рекомендував Поль де Вріе.

Подяка tech.co за такий підхід.



0

Пробіл між елементами розміщується там редактором HTML лише для цілей візуального форматування. Ви можете використовувати jQuery для видалення пробілів:

$("div#MyImages").each(function () {

    var div = $(this);
    var children= div.children();
    children.detach();
    div.empty();
    div.append(children);

});

Це відокремлює дочірні елементи, очищує будь-який пробіл, який залишається перед тим, як знову додати дочірні елементи.

На відміну від інших відповідей на це питання, використання цього методу забезпечує збереження успадкованого css displayта font-sizeзначень. Тут також не потрібно використовувати floatта громіздкий, clearщо тоді потрібно. Звичайно, вам потрібно буде використовувати jQuery.


10
Хоча це рішення працює. Я думаю, що надмірно видаляти пробіли з JavaScript.
Lashae

1
Вибачте, але uggghhhh ... Спершу слід прагнути кодувати HTML належним чином, а не маніпулювати ним JS після факту. Останнє просто заохочує неохайну практику з думкою, що [кашельне] диво JS може виправити це пізніше.
підкреслити_28

0

Особисто мені подобається прийнята відповідь, вказуючи, що немає точного способу зробити це, не використовуючи хитрість якоїсь форми.

Для мене це дратує проблему з часом може змусити вас витрачати годину, цікаво, чому, наприклад, рядка прапорців не всі правильно вирівняні. Отже, мені довелося мати швидкий google і сам перевірити, чи було правило css що я не пам’ятав ... але здається ні :(

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

Я зазвичай розвиваю багато з PHP, і якщо я генерую сітку прапорців, вміст, створений PHP, усуває цю проблему, оскільки не вставляє пробілів / перерв.

Просто я б запропонував або мати справу з образами, які знаходяться в одній лінії разом, або використовувати сценарій на стороні сервера для створення вмісту / зображень.


0

Замість використання для видалення CR / LF між елементами я використовую інструкцію обробки SGML, тому що мініфієри часто видаляють коментарі, але не XML PI. Коли PHP PI обробляється PHP, він має додаткову перевагу - видалити PI повністю разом з CR / LF між ними, таким чином заощадивши щонайменше 8 байт. Ви можете використовувати будь-яку довільну назву інструкції, таку як зберегти два байти в ML (HT) ML.



-1

Семантично кажучи, чи не було б найкраще використовувати упорядкований або не упорядкований список, а потім стилістично його використовувати за допомогою CSS?

<ul id="[UL_ID]">
    <li><img src="[image1_url]" alt="img1" /></li>
    <li><img src="[image2_url]" alt="img2" /></li>
    <li><img src="[image3_url]" alt="img3" /></li>
    <li><img src="[image4_url]" alt="img4" /></li>
    <li><img src="[image5_url]" alt="img5" /></li>
    <li><img src="[image6_url]" alt="img6" /></li>
</ul>

Використовуючи CSS, ви зможете стилізувати це будь-яким способом і видалити пробіли між книгами.


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