Я пытаюсь обернуть текст вокруг изображения, расположенного справа, и сместить изображение ниже текста, когда экран становится слишком маленьким.
С учетом этих дополнительных требований:
- Компонент Text имеет минимальную ширину для содержимого рядом со столбцом (скажем, 300 пикселей), что при превышении толкает изображение ниже текста.
- Размер компонента изображения неизвестен.
- Изображения будут отображаться с исходным размером, который может определять, отображается ли он справа от текста или под ним.
- При печати
* должны применяться те же правила1015 * Пример
Что я пробовал?
Мое текущее решение - это комбинация различных подходов.Он грязный / хакерский, поскольку использует JS для достижения части своих целей, что в итоге не соответствует требованию печати.
Он работает следующим образом:
- В html визуализируйте ИЗОБРАЖЕНИЕ послеТЕКСТ и плавающее ИЗОБРАЖЕНИЕ вправо так, чтобы изображение было справа с текстом, обернутым вокруг него.
- В JS при изменении размера окна
if windowWidth - imageWidth > 300px
(наша минимальная ширина содержимого) обновите стиль контейнера доиспользуйте flex-direction column-reverse, чтобы изображение отображалось под текстом.
Не выполняется требование печати, так как проверка минимальной ширины происходит при изменении размера окна на основе ширины в пределах окна.В идеале это должно теперь основываться на ширине в пределах формата / макета бумаги.
Это выглядит следующим образом:
HTML:
<div class="article-template-1">
<div class="article-content" ng-style="articleContentResponsiveStyle">
<div class="main-image-holder">
<div ng-repeat="imageLink in images">
<img ng-attr-src="{{imageLink.Location}}"
ng-attr-title="{{imageLink.Description}}" />
</div>
</div>
<span model="Article.Content" bind-html-compile>{{Article.Content}}</span>
</div>
</div>
CSS:
#newsArticle .article-content-holder .article-template-1 .article-content .main-image-holder {
float: right;
display: flex;
width: fit-content;
flex-direction: column;
}
#newsArticle .article-content-holder .article-template-1 .article-content .main-image-holder img {
max-width: 100%;
width: fit-content;
}
Контроллер:
var appWindow = angular.element(this.$window);
appWindow.bind("resize", this.updateArticleResponsiveStyle);
private exceedsMinContent:boolean = null;
private updateArticleResponsiveStyle = () => {
// The minimum size that inline content needs to be before images are repositioned
const minArticleWidth = 300;
let windowWidth = window.innerWidth;
let maxImageContainerWidth = windowWidth - minArticleWidth;
let imageContainerWidth = angular.element(document.getElementsByClassName('main-image-holder'))[0].getBoundingClientRect().width;
const previouslyExceedsMinContent = this.exceedsMinContent;
this.exceedsMinContent = imageContainerWidth > maxImageContainerWidth;
if (previouslyExceedsMinContent !== this.exceedsMinContent) {
this.$scope.articleContentResponsiveStyle =
this.exceedsMinContent ?
{
"display": "flex",
"flex-direction": "column-reverse"
} :
{
"display": "block"
}
this.$scope.$apply();
}
}
Да, я считаю это неполное решение неудачным и предпочел бы чистыйПодход CSS, если это возможно.