Jump to content
  • 0

Многа букаф, а блок то маленький...


Zippovich
 Share

Question

В общем никак не могу определиться как мне реализовать следующее:

Есть супер длинный текст и есть супер маленький блок div фиксированной ширины и высоты. Текст может быть разного размера, но одного шрифта (например Arial).

Нужно с любой позиции в тексте найти сколько текста после этой позиции вместится в блок, т.е. найти то кол-во текста, которое будет видно в блоке (блок overflow: hidden).

Пожалуйста, высказывайтесь по вариантам реализации.

Что было придумано мной:

Вариант 1:

используя функцию imagefttext библиотеки GD2 можно находить координаты углов написанного на картинке текста, т.е. фактически можно выводить по слову в картинку, постоянно считая координаты где мы находимся и когда превысим высоту блока, то текст будет найден. Но сдается мне это будет мега медленно и рессурсоемко.

Вариант 2:

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

Есть какие-либо еще варианты решения данной проблемы?

Link to comment
Share on other sites

8 answers to this question

Recommended Posts

  • 0

Там же ещё переносы могут быть.....

То есть если создавать функцию зависимости количества текста от размеров блока и размеров шрифта, то она ещё будет зависеть от размера наибольшего слова в тексте. При чём на выходе будет не точное значение, а верхний и нижний предел.

Любопытная задачка. Если бы на работе не надо было работать, то занялся бы ею.

Link to comment
Share on other sites

  • 0

По мне (если моя телепательная машинка не врет и это для обрезки текста для анонса) обрезать примерно с двукратным запасом для худшего случая (замерить эмпирически), а остальное убирать на клиенте, тем самым overflow:hidden + вариации на тему text-overflow:ellipsis. Кроме прочего, это еще и проблему изменения размера шрифта (в разумных пределах) решит. И для поисковиков больше зацепок останется...

Link to comment
Share on other sites

  • 0
А в чем задача-то? Для чего все это?

Задачка для одной web-страницы.

Там же ещё переносы могут быть.....

То есть если создавать функцию зависимости количества текста от размеров блока и размеров шрифта, то она ещё будет зависеть от размера наибольшего слова в тексте. При чём на выходе будет не точное значение, а верхний и нижний предел.

Любопытная задачка. Если бы на работе не надо было работать, то занялся бы ею.

да переносы - это как раз все решаемо, мне интересуют варианты, как сделать что бы это быстро работало.

В общем это будет пагинатор, только блок фиксированный! и надо высчитать на 2-3 страницы наперед текст для кеширования пользователю и пр. Короче объяснять долго и сложно. В общем текст занимает от 1 до 10 Мб и отдавать его клиенту весь - бред, а еще блок фиксированный, вот. Я то уже представил как это сделать на основе функции imagefttext, но думаю это будет большая нагрузка на сервер, а надо быстро.

Т.е. шрифт например Arial, где ширина букв разная, например line-height мне известен, как мне узнавать ширину в пикселях буквы? Есть ли быстрый способ, может я что-то не знаю? Или представить написание букв и пр. например задать фиксированное расстояние между буквами или что-то еще, что бы это стало легко высчитываемо расстояние слова и пр.

Link to comment
Share on other sites

  • 0

Может сделать на сервере perl или c++ скрипт, которому будет передаваться шрифт, текст, маркер начала текста в блоке, форматирование и размеры блока и который будет выдергивать нужное колво форматированного текста.

Ребята, подскажите, неужели проблема не решаема...

Link to comment
Share on other sites

  • 0

Была когда-то у нас такая задача. Решили с помощью javascript. Циклически по одному слову вставляли текст в блок и высчитывали высоту блока, если на определенной итерации высота превышала критическую, фиксировали текст предыдущей итерации.

Правда блок у нас был небольшой, поэтому работало всё достаточно быстро. Само собой, если текста в блоке много, метод может быть неприемлемым.

Link to comment
Share on other sites

  • 0
Была когда-то у нас такая задача. Решили с помощью javascript. Циклически по одному слову вставляли текст в блок и высчитывали высоту блока, если на определенной итерации высота превышала критическую, фиксировали текст предыдущей итерации.

Правда блок у нас был небольшой, поэтому работало всё достаточно быстро. Само собой, если текста в блоке много, метод может быть неприемлемым.

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

Link to comment
Share on other sites

  • 0

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-utf8">
<title>bukafky</title>
<?php
$txt = "Это мы не проходили, это нам не задавали...Тили тили, трали-вали, ля-ля, ля-ля....А ЕЩЕ МЫ ХОЧЕМ, ЧТОБЫ ЧТО-ТО ПОЛУЧИЛОСЬТили тили, трали-вали, ля-ля, ля-ля....А ЕЩЕ МЫ ХОЧЕМ, ЧТОБЫ ЧТО-ТО ПОЛУЧИЛОСЬА ЕЩЕ МЫ ХОЧЕМ, ЧТОБЫ ЧТО-ТО ПОЛУЧИЛОСЬТили тили, трали-вали, ля-ля, ля-ля....А ЕЩЕ МЫ ХОЧЕМ, ЧТОБЫ ЧТО-ТО ПОЛУЧИЛОСЬ";
?>
</head>
<body>
<div id="txt" style="width:300px;" >
<?php echo $txt?>
</div>
<script>
var div = document.getElementById('txt');
var txt = '<?php echo $txt?>';
var kf = 130/div.offsetHeight; // Коэффициент
var len = Math.floor(txt.length * kf);
alert("Промежуточная высота = "+div.offsetHeight);
alert("Полученная длина текста - "+len);
div.innerHTML = txt.substr(0,len);
alert("конечная высота = "+div.offsetHeight);
</script>

</body>
</html>

Либо коэффициент аяксом отправить на сервер и оттуда вернуть строку нужной длины.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy