Неразрывные непробелы в HTML

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

o o o o
 o o o
  o o
   o

Изображения используются для обозначения контактов. Итак, для заднего ряда у меня есть 4 тега img, затем тег br. Отлично работает ... в основном. Проблема в небольших браузерах, таких как IEMobile. В этом случае, когда в таблице может быть 10 или 11 столбцов, и в каждом столбце может быть стойка с выводами, IE попытается уменьшить размер столбца, чтобы он поместился на экране, и я получаю что-то вроде этого :

o o o
  o
o o o
 o o
  o

или же

o o
o o
o o
 o
o o
 o

Состав такой:

<tr>
    <td>
        <!-- some whitespace -->
        <div class = "..."><img .../><img .../><img .../><img .../><br/>...</div>
        <!-- some whitespace -->
    </td>
</tr>

Внутри внутреннего div нет пробелов. Если вы посмотрите на эта страница в обычном браузере, он должен отображаться нормально. Если вы посмотрите на это в IEMobile, это не так.

Есть подсказки или предложения? Может быть какая-то & nbsp; что на самом деле не добавляет пробела?


Последующие действия / Резюме

Я получил и попробовал несколько хороших предложений, в том числе:

  • Динамически генерировать все изображение на сервере. Хорошее решение, но мне не совсем подходит (размещено на GAE) и немного больше кода, чем я бы хотел написать. Эти изображения также можно было кэшировать после первого поколения.
  • Используйте объявление пустого пространства CSS. Хорошее решение, основанное на стандартах, с треском проваливается в представлении IEMobile.

Что я в итоге сделал

опускает голову и что-то бормочет

Да, верно, прозрачный gif в верхней части div, размер которого соответствует нужной мне ширине. Конечный код (упрощенный) выглядит так:

<table class = "game">
    <tr class = "analysis leave">
        <!-- ... -->
        <td> <div class = "smallpins"><img class = "spacer" src = "http://seasrc.th.net/gif/cleardot.gif" /><br/><img src = "/img/pinsmall.gif"/><img src = "/img/nopinsmall.gif"/><img src = "/img/nopinsmall.gif"/><img src = "/img/nopinsmall.gif"/><br/><img src = "/img/pinsmall.gif"/><img src = "/img/pinsmall.gif"/><img src = "/img/nopinsmall.gif"/><br/><img src = "/img/nopinsmall.gif"/><img src = "/img/nopinsmall.gif"/><br/><img src = "/img/nopinsmall.gif"/></div> </td>
        <!-- ... -->
    </tr>
</table>

И CSS:

div.smallpins {
    background: url(/img/lane.gif) repeat;
    text-align: center;
    padding:0;
    white-space: nowrap;
}
div.smallpins img {
    width:1em;
    height:1em;
}
div.smallpins img.spacer {
    width:4.5em;
    height:0px;
}
table.game tr.leave td{
    padding:0;
    margin:0;
}
table.game tr.leave .smallpins {
    min-width:4em;
    white-space: nowrap;
    background: none;
}

p.s. Нет, я не буду ссылаться на чью-то четкую точку в своем окончательном решении :)

Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
10
0
15 008
18
Перейти к ответу Данный вопрос помечен как решенный

Ответы 18

Почему бы не создать изображение для всех возможных результатов для булавок? Никаких проблем с макетами для браузеров изображение - это изображение

Создавайте их на лету, кэшируя созданные изображения для повторного использования.

Глядя на страницу, можно увидеть много изображений.

Matthew Rapati 18.09.2008 18:47

2 ^ 10 = 1024 изображения? Это много, но управляемо. Пропускная способность, возможно, вызывает беспокойство, особенно на мобильных устройствах.

Daniel Papasian 18.09.2008 18:55

Действительно было бы. Их 10! возможные комбинации, хотя некоторые из них технически невозможны. На самом деле, это было бы больше, потому что другое изображение используется, если запасной, а не пропущенный.

Chris Marasti-Georg 18.09.2008 18:56

Вам может понадобиться фактический пробел сразу после точки с запятой в  .

Раньше я обходил этот тип проблемы, динамически создавая все изображение (с соответствующим расположением контактов) как единое изображение. Если вы используете ASP.NET, это довольно просто сделать с помощью вызовов GDI. Вы просто динамически создаете изображение с размещением булавки, а затем подаете на страницу как одно изображение. Устраняет все проблемы с выравниванием (каламбур).

Это построено с использованием GAE, и меня беспокоит использование квоты процессора ... Я полагаю, я мог бы кэшировать каждое изображение после генерации ... Что-то, о чем нужно подумать

Chris Marasti-Georg 18.09.2008 18:57

Так как вы все равно используете изображения, почему бы не сгенерировать изображение, представляющее весь макет на лету? Вы можете использовать что-то вроде GD или ImageMagick, чтобы добиться цели.

Попробуйте использовать тег <div> в той же строке, что и <td>...</td>.

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

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

Я не думаю, что это поможет мне сделать столбец достаточно широким, чтобы отображать все 4 изображения ... не так ли? Я попробую

Chris Marasti-Georg 18.09.2008 19:58

О, чтобы он оставался достаточно широким, вам нужно, чтобы родительский div имел ... style = "width: Xpx;", что заставит его иметь определенную ширину.

Teifion 18.09.2008 20:15

Не будет ли проще, если вы сделаете это так?

<div id = "container">
  <div id = "row1">
    <img/><img/><img/><img/>
  </div>
  <div id = "row2">
    <img/><img/><img/>
  </div>
  <div id = "row3">
    <img/><img/>
  </div>
  <div id = "row4">
    <img/>
  </div>
</div>

Каким образом ваш CSS будет обрабатывать выравнивание?

.container div{
  text-align:center;
}

Но помешает ли это браузеру вставить разрыв строки внутри одного из div?

Chris Marasti-Georg 18.09.2008 18:58
Ответ принят как подходящий

Вы можете попробовать опцию css "nowrap" в содержащем div.

{white-space: nowrap;}

Не уверен, насколько широко это поддерживается.

Согласно Qurksmode, он поддерживается всеми браузерами, кроме IE 5 quirksmode.org/css/whitespace.html.

JacquesB 18.09.2008 19:19

Пометить это как принятое, с оговоркой, что это не работает для IEMobile :(

Chris Marasti-Georg 24.08.2009 20:22

есть опечатка, его следует читать: {white-space: nowrap} (без тире)

Sam Watkins 30.09.2010 11:15

Что будет иметь наибольший смысл, так это изменить, какое изображение будет отображаться на лету:

<div id = "pin-images">
    <img src = "fivepins.jpg" />
    <img src = "fourpins.jpg" />
    <img src = "threepins.jpg" />
    <img src = "twopins.jpg" />
    <img src = "onepin.jpg" />
</div>

Добавьте "nowrap" в свой тег td ...

Используйте символ соединения слов, U + 2060 (т. Е. &#x2060;).

Он вставляет квадратный символ в эмулятор WM 6.1, который я использую.

Chris Marasti-Georg 18.09.2008 19:26

Возможно, это всего лишь один случай, когда вы могли бы использовать таблицы для обеспечения макета. Это не оптимально, и я знаю, что вы не должны использовать таблицы для вещей, которые не являются табличными, но вы можете сделать что-то вроде этого.

<table>
<tr>
<td><img src = "Pin.jpg"></td>
<td>&nbsp;</td>
<td><img src = "Pin.jpg"></td>
<td>&nbsp;></td>
<td><img src = "Pin.jpg"></td>
<td>&nbsp;</td>
<td><img src = "Pin.jpg"></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><img src = "Pin.jpg"></td>
<td>&nbsp;</td>
<td><img src = "Pin.jpg"></td>
<td>&nbsp;</td>
<td><img src = "Pin.jpg"></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><img src = "Pin.jpg"></td>
<td>&nbsp;</td>
<td><img src = "Pin.jpg"></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><img src = "Pin.jpg"></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</table>

Используйте таблицу - тогда у вас есть две проблемы :-) Этот подход заставляет пространство между изображениями быть таким же широким, как сами изображения, что, вероятно, не то, что он хочет.

JacquesB 18.09.2008 19:44

Поскольку вы стремитесь к максимальной совместимости, рассматривали ли вы возможность создания одного изображения, представляющего фрейм?

Если вы используете PHP, вы можете использовать GD для динамического создания изображений, представляющих фреймы, на основе того же ввода, который вы использовали бы для создания HTML в вашем вопросе. Самым большим преимуществом этого является то, что любой браузер, который может отображать PNG или GIF, сможет отображать ваш фрейм.

Вы пробовали определить ширину столбца? Как <td width = "123px"> или <td style = "width:123px">. А может еще и для div?

да, они оба имеют ширину: 4em, минимальную ширину: 4em. Для каждого изображения задана максимальная ширина: 1em; размер их.

Chris Marasti-Georg 18.09.2008 19:56

Вы можете заменить img на span и использовать фоновое изображение для каждого диапазона, в зависимости от класса css:

<p class = "..."><span class = "pin"></span><span>&nbsp;</span><span class = "pin"></span>...
<p class = "..."><span class = "pin"></span><span>&nbsp;</span><span class = "pin"></span>...
<p class = "..."><span class = "pin"></span><span>&nbsp;</span><span class = "pin"></span>...
<p class = "..."><span class = "pin"></span><span>&nbsp;</span><span class = "pin"></span>...

(лично я думаю, что лучше иметь 4 строки с тегом p вместо одного div с br)

В CSS у вас может быть что-то вроде этого:

p.smallpins {
    margin: 0;
    padding: 0;
    height: 11px;
    font-size: 1px;
}
p.smallpins span {
    width: 11px;
    background-image: url(nopinsmall.gif);
    background-repeat: ...
    background-position: ...
}
p.smallpins span.pin {
    background-image: url(pinsmall.gif);
}

Это хороший подход, но он не ухудшается изящно, если, например, у пользователя отключен CSS.

Chris Marasti-Georg 18.09.2008 20:21
  • Есть HTML-тег nobr; не уверен, насколько хорошо это поддерживается.
  • Вы можете использовать css переполнение: видимое и неразрывные пробелы между вашими элементами (изображениями), но не использовать другие пробелы в html для этих строк.

Имейте отдельные изображения для каждого возможного расположения каждой строки.

Для этого потребуется всего 30 изображений (16 + 8 + 4 + 2)

На самом деле для каждой кегли возможны 3 состояния - сбит на первом шаре, сбит на втором шаре и не сбит. Это увеличивает количество изображений, которые нужно предварительно рассчитать, на хороший бит.

Chris Marasti-Georg 19.09.2008 20:23

Это было здесь какое-то время, но я просто просматривал это и нашел этот пост. Что бы я ни делал, я не мог заставить изображения идти подряд. Что бы ни случилось, они бы завернули. Все перепробовала.

Затем я понял, что на клиенте есть настройка, в которой они могут выбрать вид: 1) Один столбец, 2) Вид рабочего стола и 3) Подогнать окно. Согласно MSDN, значение по умолчанию должно соответствовать окну. Но мобильный телефон IE моей жены по умолчанию работал с одним столбцом. ТАК НЕ ВАЖНО ЧТО, все будет заключено в один столбец. Если я переключился на любой из двух других вариантов, все выглядело нормально.

Ну, вы можете установить это с помощью метатега:

<meta name = "MobileOptimized" content = "320">

установит ширину страницы 320 пикселей. Не знаю, как заставить его перейти в автоматический режим, если кто-нибудь знает, напишите, пожалуйста.

Это НЕ работает на Blackberry до версии 4.6 - вы застряли с одним столбцом, если пользователь вручную не перейдет в режим рабочего стола. С 4.6 или новее должно работать следующее, но я не тестировал:

<meta name = "viewport" content = "width=320">

Замечательно, спасибо большое. Для поддержки iPhone / iPod touch я сейчас использую этот параметр: <meta name = "viewport" content = "width = device-width">. Знаете ли вы, есть ли другой способ заставить ежевику действовать правильно? Если нет, я могу оставить свое текущее решение, что должно быть нормально.

Chris Marasti-Georg 02.01.2009 04:27

Другие вопросы по теме