javascript - 使用 FLIP 技术构建页面布局
问题描述
我是编程的初学者,我正在尝试使用 React 中的 FLIP 技术构建页面布局,但我卡住了,所以我想寻求你的帮助。有关 FLIP 技术的更多信息,请参阅参考 URL。
很快,我想要构建一个页面布局,它由一个主要内容和多个子内容组成,如下图所示,并且可以通过单击子内容来重新定位主要内容。
我找到了一个与我想通过网上冲浪创建的布局类似的布局,并将其作为参考 URL 包含在下面。
・我尝试了什么。
我认为我可以使用钩子、CSS 和 react-flip-toolkit -library- 来实现这一点。事实上,交换两个元素位置的代码很容易实现。
https://codesandbox.io/s/flip-l4o04?file=/src/index.js
但是,我不知道如何编写代码来控制内容数量增加时的行为。react-flip-toolkit使用flipkey作为键,所以如果我只是添加更多的容器,onclick会触发flipper标签中的所有容器,它不会起作用。
https://codesandbox.io/s/flip-test-f3pqb?file=/src/index.js
接下来,我重写了一些代码。
const AnimatedSquare = () => {
const [active, setActive] = useState(false);
const toggleActive = () => setActive(prevState => !prevState);
const [active1, setActive1] = useState(false);
const toggleActive1 = () => setActive1(prevState => !prevState);
return (
<div>
<Flipper flipKey={active,active1}>
<div className="box">
<Flipped flipId="square">
<div
className={active ? "square" : "square-active"}
onClick={toggleActive}/>
</Flipped>
<Flipped flipId="square1">
<div
className={active1 ? "square-active-1" : "square1"}
onClick={toggleActive1}/>
</Flipped>
现在只有被重写的部分代码独立运行,但这还不够好,因为它不能与主要内容重新定位。
·问题
我应该编写什么代码来使每个容器独立运行并将其位置与参考 URL 中所示的主要内容交换?我会很感激你的帮助。
~参考网址~
解决方案
我想这就是你想要的
我只是在正方形上划分活动状态并累积活动正方形类
如果有一天链接停止打开,我附上下面的代码
import React, { useCallback, useState } from "react";
import ReactDOM from "react-dom";
import { Flipper, Flipped } from "react-flip-toolkit";
import "./styles.css";
const AnimatedSquare = () => {
const [active, setActive] = useState({
square1: true,
square2: false,
square3: false,
square4: false,
square5: false
});
const handleActive = useCallback(
(id) => () =>
setActive({
square1: false,
square2: false,
square3: false,
square4: false,
square5: false,
[id]: true
}),
[]
);
return (
<div>
<Flipper flipKey={true}>
<div className="box">
<Flipped flipId="square1">
<div
className={`square1${active.square1 ? " active" : ""}`}
onClick={handleActive("square1")}
></div>
</Flipped>
<Flipped flipId="square2">
<div
className={`square2${active.square2 ? " active" : ""}`}
onClick={handleActive("square2")}
/>
</Flipped>
</div>
<Flipped flipId="square3">
<div
className={`square3${active.square3 ? " active" : ""}`}
onClick={handleActive("square3")}
/>
</Flipped>
<Flipped flipId="square4">
<div
className={`square4${active.square4 ? " active" : ""}`}
onClick={handleActive("square4")}
/>
</Flipped>
<Flipped flipId="square5">
<div
className={`square5${active.square5 ? " active" : ""}`}
onClick={handleActive("square5")}
/>
</Flipped>
</Flipper>
</div>
);
};
ReactDOM.render(<AnimatedSquare />, document.querySelector("#root"));
* {
box-sizing: border-box;
}
body {
justify-content: left;
align-items: left;
min-height: 100vh;
}
.box {
position: relative;
}
.square1 {
transition: all 1s;
margin-top: 10px;
margin-left: 5px;
margin-right: 5px;
width: 17rem;
height: 12rem;
cursor: pointer;
background-image: linear-gradient(45deg, rgb(0, 255, 0), rgb(71, 182, 108));
}
.square2 {
transition: all 1s;
margin-top: 10px;
margin-left: 5px;
margin-right: 5px;
width: 17rem;
height: 12rem;
cursor: pointer;
background-image: linear-gradient(45deg, rgb(255, 0, 255), rgb(182, 71, 158));
}
.square3 {
transition: all 1s;
margin-top: 10px;
margin-left: 5px;
margin-right: 5px;
width: 17rem;
height: 12rem;
cursor: pointer;
background-image: linear-gradient(
45deg,
rgb(113, 206, 234),
rgb(60, 107, 170)
);
}
.square4 {
transition: all 1s;
margin-top: 10px;
margin-left: 5px;
margin-right: 5px;
width: 17rem;
height: 12rem;
cursor: pointer;
background-image: linear-gradient(45deg, rgb(253, 72, 0), rgb(170, 110, 60));
}
.square5 {
transition: all 1s;
margin-top: 10px;
margin-left: 5px;
margin-right: 5px;
width: 17rem;
height: 12rem;
cursor: pointer;
background-image: linear-gradient(45deg, rgb(255, 0, 0), rgb(182, 71, 71));
}
.active {
position: fixed;
top: 0;
transform: translateX(300px);
width: 75rem;
height: 50rem;
cursor: pointer;
}
推荐阅读
- java - 我的代码有什么问题吗?为什么压缩和解压缩速度比其他应用程序慢?
- java - 稳定的婚姻问题 - 代码不返回任何人的合作伙伴/选择
- solr - Solr 8.0.0 增量导入问题
- azure - 如何在 B2C 中设置密码重置用户流程以避免非广告用户的电子邮件地址
- javascript - 从最小日期开始添加一个月的填充
- android - 将应用程序上传到播放控制台时出错 - “上传失败 Android App Bundle 未签名。”
- nginx - 为什么最后修改时间和内容长度生成的Nginx etag值?
- java - 如何理解 HttpLoggingInterceptor.class 中的方法“isPlaintext”?
- python - Python:从名称中删除一些字符后比较文件名
- android - 带有firebase android的标签的动态数量