- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想用 React 和 Typescript 从这个 Codepen 重新创建这个下划线效果
密码笔: https://codepen.io/krakruhahah/pen/jOzwXww
我认为下面代码中的问题是接口(interface),我开始声明我的类型,但它仍然无法识别它们。它说他们是任何。但是 max 被声明为 number 但仍显示为 any。我不确定为什么。这些功能被描述为注释。
tsx:
import React from 'react';
import Typography from '@mui/material/Typography';
import { Box } from '@mui/material';
interface Props {
max: number;
}
const styles = {
body: {
width: "80%",
margin: "10vw auto",
},
heading: {
fontFamily: "Playfair Display, serif",
fontSize: "10vw",
},
"subheading": {
fontFamily: "Open Sans, sans-serif",
fontSize: "1em",
lineHeight: "1.5",
},
"@media screen and (min-width: 40em)": {
body: {
width: "50%",
},
heading:{
fontSize: "6vw",
},
subheading: {
fontSize: "1.75vw",
}
},
"underline--magical": {
backgroundImage: "linear-gradient(120deg, #84fab0 0%, #8fd3f4 100%)",
backgroundRepeat: "no-repeat",
backgroundSize: "100% 0.2em",
backgroundPosition: "0 88%",
transition: "backgroundSize 0.25s ease-in",
"&:hover": {
backgroundSize: "100% 88%",
},
},
};
function Effect(props: Props) {
// VARIABLES
const magicalUnderlines = Array.from(document.querySelectorAll('.underline--magical'));
const gradientAPI = 'https://gist.githubusercontent.com/wking-io/3e116c0e5675c8bcad8b5a6dc6ca5344/raw/4e783ce3ad0bcd98811c6531e40256b8feeb8fc8/gradient.json';
// HELPER FUNCTIONS
// 1. Get random number in range. Used to get random index from array.
const randNumInRange = max => Math.floor(Math.random() * (max - 1));
// 2. Merge two separate array values at the same index to
// be the same value in new array.
const mergeArrays = (arrOne, arrTwo) => arrOne
.map((item, i) => `${item} ${arrTwo[i]}`)
.join(', ');
// 3. Curried function to add a background to array of elms
const addBackground = (elms) => (color) => {
elms.forEach(el => {
el.style.backgroundImage = color;
});
}
// 4. Function to get data from API
const getData = async(url): Promise<XMLHttpRequest> => {
const response = await fetch(url);
const data = await response.json();
return data.data;
}
// 5. Partial Application of addBackground to always apply
// background to the magicalUnderlines constant
const addBackgroundToUnderlines = addBackground(magicalUnderlines);
// GRADIENT FUNCTIONS
// 1. Build CSS formatted linear-gradient from API data
const buildGradient = (obj) => `linear-gradient(${obj.direction}, ${mergeArrays(obj.colors, obj.positions)})`;
// 2. Get single gradient from data pulled in array and
// apply single gradient to a callback function
const applyGradient = async(url, callback): Promise<XMLHttpRequest> => {
const data = await getData(url);
const gradient = buildGradient(data[randNumInRange(data.length)]);
callback(gradient);
}
// RESULT
applyGradient(gradientAPI, addBackgroundToUnderlines);
return (
<Box>
<Typography sx={styles.heading}>
Look At This <span style={styles['underline--magical']}>Pretty</span> Underline
</Typography>
<Typography sx={styles.subheading}>
Wow this one is super incredibly cool, and this{' '}
<span style={styles['underline--magical']}>one is on Multiple Lines!</span> I wish I had found this like thirty
projects ago when I was representing the lollipop guild.
</Typography>
</Box>
);
}
export { Effect };
最佳答案
linear-gradient
我们需要一串元组。我创建了一个辅助函数 生成梯度范围数组 得到这个字符串。import styled from "@emotion/styled";
import Typography from "@mui/material/Typography";
import Box from "@mui/material/Box";
import { Underline } from "./Underline";
import useGradient from "./useGradient";
const Heading = styled(Typography)`
font-family: "Playfair Display", serif;
font-size: 10vw;
@media screen and (min-width: 40em) {
font-size: 6vw;
}
`;
const Subheading = styled(Typography)`
font-family: "Open Sans", sans-serif;
font-size: 1em;
@media screen and (min-width: 40em) {
font-size: 1.75vw;
}
`;
export default function App() {
const gradient = useGradient();
return (
<div className="App">
<Box>
<Heading>
Look At This <Underline gradient={gradient}>Pretty</Underline>{" "}
Underline
</Heading>
<Subheading>
Wow this one is super incredibly cool, and this{" "}
<Underline gradient={gradient}>one is on Multiple Lines!</Underline> I
wish I had found this like thirty projects ago when I was representing
the lollipop guild.
</Subheading>
</Box>
</div>
);
}
使用渐变.ts
import { useEffect, useState } from "react";
import { generateGradientRangeArray, randNumInRange } from "./Helpers";
import { GradientType, IResult } from "./types";
const GRADIENT_API =
"https://gist.githubusercontent.com/wking-io/3e116c0e5675c8bcad8b5a6dc6ca5344/raw/4e783ce3ad0bcd98811c6531e40256b8feeb8fc8/gradient.json";
const useGradient = () => {
const [gradients, setGradients] = useState<GradientType>();
useEffect(() => {
const getData = async (url: string): Promise<void> => {
// get the data from the api
const response = await fetch(url);
const result = (await response.json()) as IResult;
// Get single gradient from data pulled in array
const gradient = result.data[randNumInRange(result.data.length)];
const transform = generateGradientRangeArray(gradient);
// set state with the result
setGradients(transform);
};
// Catching errors
getData(GRADIENT_API).catch(console.error);
}, []);
return gradients;
};
export default useGradient;
下划线.tsx
import styled from "@emotion/styled";
import { Props, GradientType } from "./types";
const UnderlineStyle = styled.span<{ gradient: GradientType }>`
background-image: linear-gradient(
${(props) => props.gradient.direction},
${(props) => props.gradient.range}
);
background-repeat: no-repeat;
background-size: 100% 0.2em;
background-position: 0 88%;
transition: background-size 0.25s ease-in;
&:hover {
background-size: 100% 88%;
}
`;
export const Underline = ({ children, gradient }: Props) => {
if (!gradient) return null;
return <UnderlineStyle gradient={gradient}>{children}</UnderlineStyle>;
};
助手.ts
import { IGradient, GradientType } from "./types";
/// HELPER FUNCTIONS
// Get random number in range. Used to get random index from array.
export const randNumInRange = (max: number) =>
Math.floor(Math.random() * (max - 1));
// Create range of colors for gradient
export const generateGradientRangeArray = (data: IGradient): GradientType => {
const { colors, direction, name, positions } = data;
const rangeColorsArray: string[] = [];
for (const clr in colors) {
for (const pos in positions) {
if (clr === pos) {
rangeColorsArray.push(`${colors[clr]} ${positions[pos]},`);
}
}
}
const createGradientString = rangeColorsArray.join(" ").slice(0, -1);
return { name, direction, range: createGradientString };
};
类型.ts
import { ReactNode } from "react";
export interface IGradient {
name: string;
direction: string;
colors: string[];
positions: string[];
}
export type GradientType = { range: string } & Pick<
IGradient,
"name" | "direction"
>;
export interface IResult {
data: IGradient[];
}
export interface Props {
children: ReactNode;
gradient?: GradientType;
}
关于javascript - 在 React 中使用渐变 API 自定义下划线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73116434/
好的,所以我编辑了以下... 只需将以下内容放入我的 custom.css #rt-utility .rt-block {CODE HERE} 但是当我尝试改变... 与 #rt-sideslid
在表格 View 中,我有一个自定义单元格(在界面生成器中高度为 500)。在该单元格中,我有一个 Collection View ,我按 (10,10,10,10) 固定到边缘。但是在 tablev
对于我的无能,我很抱歉,但总的来说,我对 Cocoa、Swift 和面向对象编程还很陌生。我的主要来源是《Cocoa Programming for OS X》(第 5 版),以及 Apple 的充满
我正在使用 meta-tegra 为我的 NVIDIA Jetson Nano 构建自定义图像。我需要 PyTorch,但没有它的配方。我在设备上构建了 PyTorch,并将其打包到设备上的轮子中。现
在 jquery 中使用 $.POST 和 $.GET 时,有没有办法将自定义变量添加到 URL 并发送它们?我尝试了以下方法: $.ajax({type:"POST", url:"file.php?
Traefik 已经默认实现了很多中间件,可以满足大部分我们日常的需求,但是在实际工作中,用户仍然还是有自定义中间件的需求,为解决这个问题,官方推出了一个 Traefik Pilot[1] 的功
我想让我的 CustomTextInputLayout 将 Widget.MaterialComponents.TextInputLayout.OutlinedBox 作为默认样式,无需在 XML 中
我在 ~/.emacs 中有以下自定义函数: (defun xi-rgrep (term) (grep-compute-defaults) (interactive "sSearch Te
我有下表: 考虑到每个月的权重,我的目标是在 5 个月内分散 10,000 个单位。与 10,000 相邻的行是我最好的尝试(我在这上面花了几个小时)。黄色是我所追求的。 我试图用来计算的逻辑如下:计
我的表单中有一个字段,它是文件类型。当用户点击保存图标时,我想自然地将文件上传到服务器并将文件名保存在数据库中。我尝试通过回显文件名来测试它,但它似乎不起作用。另外,如何将文件名添加到数据库中?是在模
我有一个 python 脚本来发送电子邮件,它工作得很好,但问题是当我检查我的电子邮件收件箱时。 我希望该用户名是自定义用户名,而不是整个电子邮件地址。 最佳答案 发件人地址应该使用的格式是: You
我想减小 ggcorrplot 中标记的大小,并减少文本和绘图之间的空间。 library(ggcorrplot) data(mtcars) corr <- round(cor(mtcars), 1)
GTK+ noob 问题在这里: 是否可以自定义 GtkFileChooserButton 或 GtkFileChooserDialog 以删除“位置”部分(左侧)和顶部的“位置”输入框? 我实际上要
我正在尝试在主页上使用 ajax 在 magento 中使用 ajax 显示流行的产品列表,我可以为 5 或“N”个产品执行此操作,但我想要的是将分页工具栏与结果集一起添加. 这是我添加的以显示流行产
我正在尝试使用 PasswordResetForm 内置函数。 由于我想要自定义表单字段,因此我编写了自己的表单: class FpasswordForm(PasswordResetForm):
据我了解,新的 Angular 7 提供了拖放功能。我搜索了有关 DnD 的 Tree 组件,但没有找到与树相关的内容。 我在 Stackblitz 上找到的一个工作示例.对比drag'ndrop功能
我必须开发一个自定义选项卡控件并决定使用 WPF/XAML 创建它,因为我无论如何都打算学习它。完成后应该是这样的: 到目前为止,我取得了很好的进展,但还有两个问题: 只有第一个/最后一个标签项应该有
我要定制xtable用于导出到 LaTeX。我知道有些问题是关于 xtable在这里,但我找不到我要找的具体东西。 以下是我的表的外观示例: my.table <- data.frame(Specif
用ejs在这里显示日期 它给我结果 Tue Feb 02 2016 16:02:24 GMT+0530 (IST) 但是我需要表现为 19th January, 2016 如何在ejs中执行此操作?
我想问在 JavaFX 中使用自定义对象制作 ListView 的最佳方法,我想要一个每个项目如下所示的列表: 我搜了一下,发现大部分人都是用细胞工厂的方法来做的。有没有其他办法?例如使用客户 fxm
我是一名优秀的程序员,十分优秀!