CSS / JQuery: позиционирование и изменение размера текста с фоновым изображением

У меня есть div с текстом, высота, ширина и положение которого (вверху и слева) указаны в процентах, чтобы его размер можно было изменять в окне браузера. Этот div также имеет фоновое изображение, соотношение сторон которого я хочу сохранить при изменении размера, и я хочу изменить размер текста так, чтобы он умещался в границах div.

Я нашел плагин jQuery, который я немного изменил, чтобы я мог изменить размер шрифта onResize, чтобы он поместился в div. Результат: http://jsfiddle.net/JMVXA/10/

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

У меня возникают трудности с этим, поскольку, если я получаю автоматическое изменение размера текста, я не поддерживаю соотношение сторон, и если я получаю правильное соотношение сторон, размер текста не изменяется.

Есть изменение размера текста, но (если вы слишком сильно сжали пчелу) изображение искажается вместо сохранения соотношения сторон: http://jsfiddle.net/JMVXA/11/

#parent{
    width: 100%;
    height: 100%;
    position: relative;
    background-image: url("Bee Image");
    //padding-top: 81.799591002%;
    background-size: 100% 100%;
}

Если я изменю #parent на это, соотношение сторон будет работать, но размер текста не изменится должным образом:

#parent{
    width: 100%;
    position: relative;
    background-image: url("Bee Image");
    padding-top: 81.799591002%;
    background-size: 100% 100%;
}

Я знаю часть проблемы. Плагин требует, чтобы width () и height () возвращали ненулевое число, но мой CSS для соотношения сторон оставляет высоту неуказанной (что возвращает 0 для высоты). Так что я не знаю, что мне делать дальше.

Есть идеи, как это сделать?

Я новичок в HTML, jQuery и CSS, но у меня есть опыт программирования на других языках.

EDIT1 Я хочу, чтобы текстовый div сохранял тот же относительный размер и положение в изображении. Это было бы так, как если бы текст был внутри самого изображения (с точки зрения расположения и размера). Так что текст всегда должен быть на крыльях пчелы. И я хочу сохранить такое же соотношение сторон при изменении размера. EDIT2 Дополнительная информация: я делаю веб-сайт с большими изображениями с текстом перед ними. Поэтому я хотел бы иметь возможность указывать размеры и позиции div, который будет содержать текст и иметь любой текст, который я помещаю в div, для изменения размера, чтобы он мог уместиться внутри границ div.


person joshuar    schedule 25.06.2013    source источник
comment
Я бы, наверное, попробовал использовать ems, rems & Media Queries, чтобы настроить его на критических моментах. Вы никогда не сможете сделать его 100% отзывчивым и широким устройством / обратной совместимостью, но вы можете довольно близко подойти к обоим.   -  person Dom    schedule 25.06.2013


Ответы (3)


Это сработало для меня: http://jsfiddle.net/JMVXA/53/

Ключ состоит в том, чтобы установить для свойства alignVert значение false:

$('#what').textFit({alignVert: false});

Это не позволяет textFit устанавливать display:table в вашем элементе для вертикального выравнивания содержимого (что в некоторых браузерах приводит к сбою процентной высоты). Это вызвало странный размер, который вы видите. К сожалению, элементы, для которых установлено значение display:table, подвержены проблемам с размером. Этот конкретный для меня в новинку. В будущей версии я обязательно заключу текст в содержащий div или найду другой метод вертикального выравнивания (вероятно, с использованием отрицательных полей).

Вы увидите, что если вы нажмете кнопку textFit () и увеличите размер текста на 1 пиксель в инспекторе, он выйдет за границы; размер правильно.

person STRML    schedule 02.07.2013
comment
О, вы автор плагина. лол, я не ожидал, что ты ответишь. Большое спасибо! - person joshuar; 03.07.2013

Хммм, вы не думали об использовании вместо этого background-size: contain? Затем он будет масштабироваться, но также будет максимально большим с правильным соотношением сторон. Для "#parent" я изменил / добавил следующие стили:

#parent{
    background-size: contain;
    background-repeat:no-repeat;
}

Вот пример JSFiddle, чтобы показать вам, что, по моему мнению, вы хотите.

Если это не предполагаемое поведение, дайте мне знать, и я буду рад помочь вам в дальнейшем. Удачи!

(Edit) После того, как я лучше понял вашу цель, я думаю, что добился желаемого поведения. Вы можете увидеть его здесь.

По сути, просто переделал CSS и структуру. Я удалил пчелу и сделал ее элементом img внутри "#parent" вместо фона, я не уверен, что вы возражаете.

Что касается CSS, вот соответствующие определения стилей, которые я изменил / добавил:

#what{
    width: 80%;   
    height: 20%;
    position:absolute;
    top:0;
    right:0;
}
#parent{
    width:100%;
    display:inline-block;
    position: relative;
}
#parent img{
    width:100%;
}

Надеюсь, это поможет!

person Serlite    schedule 25.06.2013
comment
Ну, я хотел, чтобы div, содержащий текст, изменял размер относительно div с фоновым изображением, а не относительно окна. Таким образом, это выглядит так, как будто текст встроен в изображение. Я не против, если он немного изменится, но он должен быть ограничен размерами текстового div. Спасибо за ответ. - person joshuar; 26.06.2013
comment
Хммм ... тогда вы хотите, чтобы фоновое изображение было внутри текстового div, а не его родительского элемента? Как это: jsfiddle.net/JMVXA/45 - person Serlite; 26.06.2013
comment
лол, нет. Извините, если я не совсем ясен. По сути, это будет выглядеть (при изменении размера изображения по отношению к окну), что вы увеличиваете и уменьшаете изображение. Когда изображение становится меньше, текст становится меньше, и текст сохраняет то же относительное положение и размеры. - person joshuar; 26.06.2013
comment
Я думаю, что это лучший способ объяснить это: я хочу, чтобы текстовый div сохранял тот же относительный размер и положение по отношению к изображению. Это было бы так, как если бы текст находился внутри самого изображения (с точки зрения расположения и размера). - person joshuar; 26.06.2013
comment
Другой ответ получил, но здесь JSFiddle использует ваш код, а не его. jsfiddle.net/JMVXA/46 - person Serlite; 26.06.2013

Не знаю, именно то, что вы хотите, но ... http://jsfiddle.net/euK8C/ < / а>

  1. Я изменил ваш jQuery. textFit v1.0 на FitText.js 1.1, мой стоит на первом месте в Google по «подходящему тексту» и выглядит (и работает ) отлично. (Ему не нужна фиксированная ширина текстового контейнера)
  2. Удален "#grandparent", теперь у нас есть только "#parent".
  3. Добавлен тег '‹img>' со стилем

    max-width: 100%;
    

    поэтому высота будет пропорциональна ширине.

  4. Изменен стиль "#parent" на:

    position: relative;
    top: 10%;
    left: 10%;  
    border: 1px solid #39dd9a;  
    

    нет необходимости в ширине и высоте

  5. Зачем использовать "# spanBold" ..italic "и т. Д.? Используйте "em" для выделенного текста (он все равно будет курсивом) и "strong" для сильных слов :) подробнее здесь ...

Наше изображение теперь автономное, мы (браузер) знаем его ширину, поэтому '#parent' может изменить размер, чтобы обернуть все изображение.

То же самое и с '. sandia', который теперь составляет 5% вверху и слева и имеет 90% ширины и высоты родительского элемента. (90%, потому что я хотел по 5% желоба с каждой стороны).

Вначале мы fitText () .sandia и каждый раз при изменении размера документа.


Редактировать 1.

Сейчас я понятия не имею, как делать что-то подобное с помощью div с background-image, конечно, это можно сделать с помощью JS, а чистый CSS? Может что-то с моделью флекс-бокса.

person Daniel Sitarz    schedule 25.06.2013
comment
Может быть, мне что-то не хватает, но можно ли указать div с определенными размерами и позициями и заполнить их каким-то текстом с помощью этого метода? Когда я попытался сделать коробку с 20%, я получил: jsfiddle.net/euK8C/6 И это не похоже, что текст подчиняется границам div. - person joshuar; 26.06.2013
comment
Мне в голову пришла отличная идея ... jsfiddle.net/8Wscw Это действительно неправильно, но работает, просто проверьте все размеры шрифта от 0 до 100, чтобы выбрать подходящий. Производительность, безусловно, плохая, и иногда текст выходит (исправлено, играя с шагом цикла). Может будет полезно. - person Daniel Sitarz; 26.06.2013
comment
Да, это именно то поведение, которое я искал. Собственно это то, что делает оригинальный плагин (textFit) github.com/STRML/jquery.textFit. , он просто пробует много размеров шрифта, пока не подойдет. Он использует двоичный поиск, чтобы улучшить производительность, O (log (n), performance. - person joshuar; 27.06.2013