带有React和GreenSock的3D CSS翻转捕捉

Jhey Tompkins 2021年11月29日0评论3D CSS FLIPY快照与反应和GRACESONK 14分钟阅读CSS,反应,工具,应用程序,技术分享在推特上,LinkedIn带有React和GreenSock的3D CSS翻转捕捉关于作者“KDSPG1”JHI做出令人敬畏的人可怕的东西!他是一名拥有近10年经验的web开发人员。与欧洲之星(Eurostar)、优步(Uber)等品牌合作,并为其服务……更多关于Jhey的信息↬

电子邮件时事通讯关于前端和用户体验的(精彩的)电子邮件“KDSP”每周提示。受到19万人的信任。

带有React和GreenSock的3D CSS翻转捕捉可访问的前端模式Masterclass带有React和GreenSock的3D CSS翻转捕捉在线提升您的前端技能带有React和GreenSock的3D CSS翻转捕捉免费开发者测试帐户快速摘要入门↬ 杰伊的一个主要咒语是让学习变得有趣。在本文中,他向您展示了通过将您的想法付诸实践来提高技能的方法,并且不会忘记您可以玩代码。有了这种心态,每一个想法都必然成为一个尝试新事物的机会。“KDSP”命名很难,对吗?“轻率的快照”是我能想到的最好的东西。一天晚上,我在电视上看到了这样的效果,我给自己做了一个笔记,让自己做一些类似的事情。

虽然这不是我希望在短期内投放到网站上的东西,但这是一个很好的小挑战。这符合我关于“代码中的游戏性”学习的整个立场。不管怎样,几天后,我坐在键盘前,几个小时后,我有了这个:

3D CSS Flippy Snaps点击以翻转另一个图像️ @reactjs&&@greensockhttps://t.co/Na14z40tHE 通过@CodePen图片。啁啾com/nz6pdQGpmd

-Jhey️ (@ JH3YY)2021年11月8日

我的最终演示是一个反应应用程序,但我们不需要挖掘使用反应来解释这项工作的机制。一旦我们确定了如何工作,我们将创建React应用程序。

注意:在开始之前。值得注意的是,此演示的性能受网格大小的影响,最好在基于Chromium的浏览器中查看演示。让我们从创建网格开始。假设我们想要一个10乘10的网格。这是100个细胞(这就是为什么React对于这样的东西很方便)。每个单元格将由一个元素组成,该元素包含可翻转卡的正面和背面。

“KDSP”我们网格的样式非常简单。我们可以使用display:grid并为网格大小使用自定义属性。这里我们默认为10。

。轻拍{显示:网格;网格间距:1px;网格模板行:重复(变量(--网格大小,10),1fr);

在演示中,我使用帕格为我生成这个。您可以通过单击演示中的“查看已编译的HTML”来查看已编译的HTML。

-常量网格大小=10-常数计数=数学。功率(网格尺寸,2)-常数x=f%网格大小.flippy-snap卡。flippy卡片(样式=`--x:${x};--y:${y};`).flippy-card_uu后“KDSP”然后我们需要一些样式。

。纸牌{--当前图像:url(“https://random-image.com/768");身高:100%;宽度:100%;位置:相对位置;}.flippy-card_uuu后部{身高:100%;背面可见性:隐藏;背景图像:var(--当前图像);背景尺寸:计算值(var(--网格尺寸,10)*100%);.flippy-card_uuu后部{背景图像:var(--下一幅图像);变换:旋转(180度)旋转(180度);}“KDSP”卡的后部通过变换组合旋转获得其位置。但是,有趣的部分是我们如何显示每张卡的图像部分。在这个演示中,我们使用一个自定义属性来定义两个图像的URL。然后我们将这些设置为每个卡片面的背景图像。

在跳跃之后更多!继续阅读下面的内容↓ “KDSP”将在前端和用户体验方面举办精彩的在线研讨会,包括实用外卖、现场会议、视频录制以及关于设计系统、CSS/JS和用户体验的友好问答。与Carie Fisher、Stefan Baumgartner和其他许多人合作。

跳转到在线研讨会↬ 带有React和GreenSock的3D CSS翻转捕捉

,但关键在于如何定义背景大小和背景位置。使用自定义属性--x和--y,我们将该值乘以-100%。然后我们将背景大小设置为——网格大小乘以100%。这将显示给定卡的正确图像部分。

查看画笔[2.添加图像](https://codepen.io/smashingmag/pen/gOxNLPz)作者:JHEY

见钢笔2。添加JHEY

的图像时,您可能已经注意到我们有--当前图像和--下一个图像。但是,目前,没有办法看到下一幅图像。为此,我们需要一种方法来扭转局面。我们可以为此使用另一个自定义属性。

让我们引入一个--count属性并为我们的卡设置一个转换:

。轻拍{透视图:50vmin;}.纸牌{转换:rotateX(计算值(var(--计数)*-180度));变换样式:保留-3d;}

我们可以在包含元素上设置--count属性。范围界定意味着所有卡片都可以拾取该值并使用它来变换它们在x轴上的旋转。我们还需要设置变换样式:preserve-3d,以便看到卡片的背面。设置透视图可以为我们提供3D透视图。

此演示允许您更新--count属性值,以便查看其效果。

见钢笔[3.转动卡片](https://codepen.io/smashingmag/pen/LYjKbZW)作者:JHEY

见钢笔3。在这一点上,您可以将其包装在那里,并设置一个简单的单击处理程序,该处理程序会递增--每次单击按一计数。

const SNAP=文档。查询选择器('.flippy snap')让计数=0常量更新=()=>快照。风格setProperty('--count',count++)断裂addEventListener('click',UPDATE)

删除网格间隙,您就会得到这个结果。单击捕捉将其翻转。

见钢笔[4.无聊的翻转](https://codepen.io/smashingmag/pen/eYEwBdN)作者:JHEY

见钢笔4。JHEY

的无聊翻转现在我们已经解决了基本的力学问题,是时候将其转化为React应用程序了。这里有点不对劲。

常量应用=()=>{const[disabled,setDisabled]=useState(true)const[gridSize,setGridSize]=useState(9)const grabPic=async()=>{const pic=等待取数('https://source.unsplash.com/random/1000x1000')}useffect(()=>{const url=await grabPic()setSnaps([url,nextUrl])}设置()const setNewImage=异步计数=>{const newSnap=wait grabPic()计数当前%2!==0 ? [快照,快照[1]:[快照[0],快照])}const onFlip=异步计数=>{setDisabled(真)}如果(snaps.length!==2)返回加载

返回(gridSize={gridSize}disabled={disabled}onFlip={onFlip}/>)const pic=等待取数('https://source.unsplash.com/random/1000x1000')返回图片。网址}//初始效果捕捉FlipySnap使用的两个捕捉useffect(()=>{const url=await grabPic()setSnaps([url,nextUrl])setDisabled(错误)设置()gridSize={gridSize}disabled={disabled}//切换“disabled”属性以停止垃圾邮件点击快照={snaps}onFlip={onFlip}snapRef={snapRef}const newSnap=wait grabbic()//抓取快照小睡(计数当前%2!==0 ? [快照,快照[1]:[快照[0],快照]setDisabled(false)//再次启用单击}const onFlip=异步计数=>{setNewImage(count)//抓取一个新的快照以显示常量单元格计数=数学。pow(网格大小,2)const count=useRef(0)常数翻转=e=>{计数当前=计数。电流+1if(onFlip)onFlip(count)}返回(className=“快速捕捉”风格={{“--网格大小”:网格大小,“--current image':`url('${snaps[0]}')`,}}onClick={flip}>{新数组(单元格计数).fill().map((单元格,索引)=>{常数x=索引%gridSize常数y=数学。楼层(索引/网格大小)键={index}风格={{“--y”:y,}}>))计数当前=计数。电流+1延迟:gsap。乌提尔斯。分发({金额:gridSize/20,网格:[gridSize,gridSize],放松:力量1。伊努特,持续时间:0.2,//此时更新图像},})常数y=数学。楼层(索引/网格大小)返回(data-snap-y={y}风格={{}}>延迟:gsap。乌提尔斯。分发({from:[x/gridSize,y/gridSize],金额:gridSize/20,}),//此时更新图像if(onFlip)onFlip(count)常数翻转=e=>{如果(禁用| |翻转.当前)返回const x=parseInt(e.target.parentNode.getAttribute('data-snap-x'),10)延迟:gsap。乌提尔斯。分发({from:[x/gridSize,y/gridSize],放松:力量1。伊努特,}),持续时间:0.2,翻转。电流=真翻转。电流=假})const x=parseInt(e.currentTarget.getAttribute('data-snap-x'),10)const y=parseInt(e.currentTarget.getAttribute('data-snap-y'),10)gsap。到(containerRef.current.querySelectorAll(“.flippy卡”){from:[x/gridSize,y/gridSize],放松:力量1。伊努特持续时间:0.1,转换:translate3d(0,0,计算((1-(变量(--悬停,1)))*5vmin))}“KDSP”这里我们说的是一张卡在z轴上最多移动5vmin。

然后使用onPointerOver道具将其应用于每张卡。

{新数组(单元格计数).fill().map((单元格,索引)=>{常数x=索引%gridSizeonPointerOver={indicate}className=“flippy卡”“--x”:x,)持续时间:0.1,className=“快速捕捉”ref={containerRef}onPointerLeave={reset}风格={{}}边框:6px实心#fff;左边框颜色:#000;底部:10%;宽度:8%;变换:平移3d(0,0,5vmin)旋转(0度);}@关键帧旋转{

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/141879.html

(0)

相关推荐