У меня есть экран с двумя элементами div: верхняя панель навигации (высота 80 пикселей) и компонент div под панелью навигации (оставшаяся высота экрана).
Поскольку я использую форматирование попутного ветра, это выглядит примерно так:
<div className = "w-screen h-[80px]"> //navbar
</div>
<div className = "w-screen h-screen"> //bottom content div
</div>
Проблема: панель навигации имеет размер 80 пикселей, а нижний контент динамический, но внизу появляется белый пробел. Белый зазор исчезнет при использовании h-экрана (100% vw).
Из-за высоты панели навигации 80 пикселей я должен динамически вычитать нижний div (h-screen-80px), иначе появится вертикальная полоса прокрутки, которую я не хочу. Итак, у меня есть слушатель для обновления высоты окна в зависимости от текущего размера окна (включая события изменения размера окна). Затем я вычитаю эту высоту на 80, составляю строку для попутного ветра и обновляю className. Хотя он работает нормально, и инспектор показывает, что он динамически обновляет высоту div, визуально она не регулируется должным образом.
Новая попытка с прослушивателем событий окна и вычислением. Обратите внимание, что вычисленный heightMinusNavbar корректно обновляется при изменении размера окна, но визуально не
import React from "react";
import Gallery from "../components/gallery/Gallery";
import Navbar from "../components/navbars/Dapp";
class dashboard extends React.Component {
constructor(props) {
super(props);
this.state = { width: 0, height: 0 };
this.updateWindowDimensions = this.updateWindowDimensions.bind(this);
}
componentDidMount() {
this.updateWindowDimensions();
window.addEventListener("resize", this.updateWindowDimensions);
}
componentWillUnmount() {
window.removeEventListener("resize", this.updateWindowDimensions);
}
updateWindowDimensions() {
this.setState({ width: window.innerWidth, height: window.innerHeight });
}
// todo: change height to be full screen subtracted by nav height
render() {
const heightMinusNavbar = `h-[${(this.state.height - 80).toString()}px]`;
console.info("heightMinusNavbar " + heightMinusNavbar);
return (
<>
<Navbar />
<div
className = {`w-screen text-gray-300 y-full bg-gray-900 ${heightMinusNavbar}`}
>
<Gallery />
</div>
</>
);
}
}
export default dashboard;
Что я делаю неправильно?
Спасибо что подметил это. Итак, то, что я делаю, кажется антипаттерном для Tailwind CSS. Вы предлагаете мне использовать собственный javascript без попутного ветра для этого конкретного случая и вместо этого применить CSS к компоненту? Я делал это раньше в приложениях в прошлом, но они не реагировали/попутный ветер, и я не уверен, что это лучшая практика.
Неважно, я нашел это решение, в котором говорится об использовании стиля встроенного состояния реакции. Ключ в том, чтобы убедиться, что вы используете состояние, потому что реакция будет повторно отображаться при изменении состояния. stackoverflow.com/questions/50273232/…



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если ваша навигационная панель имеет фиксированную высоту 80 пикселей, вы можете просто использовать встроенный класс calc.
<div class = "h-20 bg-slate-300">Navbar</div>
<div class = "h-[calc(100vh-80px)] bg-slate-100">Gallery</div>
https://play.tailwindcss.com/bOun5kbE3O
Только что попробовал это и не кости. Я не думаю, что это сработает. Согласно этой странице (tailwindcss.com/docs/content-configuration#dynamic-class-names) «Tailwind на самом деле не оценивает ваш исходный код и может обнаруживать только статические неразрывные строки классов».
Это действующий Tailwind CSS, я даже дал ссылку на рабочий пример. Класс представляет собой полную неразрывную строку.
Я вижу, что ваш пример работает, но по какой-то причине он не работает с моим реагирующим приложением. Интересно, могу ли я настроить или что-то еще, конфликтующее с ним.
В любом случае у вас рабочий и приемлемый ответ. Я также предоставил другое решение, использующее функцию стилизации встроенного состояния реакции. Какое из двух решений вы бы назвали лучшей практикой или это не имеет значения?
Лично я бы выбрал один класс css, но они очень похожи. Я даже собирался предложить использовать встроенный стиль, пока не понял, что это можно сделать с помощью класса Tailwind.
Да, подход с одним CSS чище. Для этого я выберу ваш в качестве подходящего ответа. Спасибо за помощь!
Я нашел решение:
width text-grey-300 y-full bg-gray-900)height) React, хранящийся в переменной. Обратите внимание, что в приведенном ниже коде я использую style = {{ height: this.state.height - 80 }} для div.Это связано с тем, что изменения состояния будут повторно отображать идеальный компонент. Таким образом, решение становится таким:
import React from "react";
import WalletConnect from "../components/WalletConnect/WalletConnect";
import fren1 from "../assets/fren/1.png";
import pixel1 from "../assets/fren/pix/1.gif";
import fren5 from "../assets/fren/5.png";
import MenuButton from "../components/buttons/MenuButton";
import { NftNamespace } from "alchemy-sdk";
import { collection } from "firebase/firestore";
import Gallery from "../components/gallery/Gallery";
import Navbar from "../components/navbars/Dapp";
class dashboard extends React.Component {
constructor(props) {
super(props);
this.state = {
width: window.innerWidth,
height: window.innerHeight,
};
this.updateWindowDimensions = this.updateWindowDimensions.bind(this);
}
componentDidMount() {
this.updateWindowDimensions();
window.addEventListener("resize", this.updateWindowDimensions);
}
componentWillUnmount() {
window.removeEventListener("resize", this.updateWindowDimensions);
}
updateWindowDimensions() {
this.setState({
width: window.innerWidth,
height: window.innerHeight,
});
}
render() {
return (
<>
<Navbar />
<div
className = "w-screen text-gray-300 y-full bg-gray-900"
style = {{ height: this.state.height - 80 }}
>
<Gallery />
</div>
</>
);
}
}
export default dashboard;
Вероятно, потому что это имя динамического класса. tailwindcss.com/docs/content-configuration#dynamic-class-names