Видалення пробілів між елементами 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.