umblbug Page (2)
tublbug Page (2)
Reactを使用してTurbug Pageを作成する予定です
手順1)Navigation+Image Slider
フェーズ2)Grid+レスポンス-本日実施
Grid+レスポンス(メディアクエリ)
[原理]
[原理]
[コード]
(GridContainer.js)
import React from 'react'
import styled from 'styled-components';
import Grid from './secions/Grid';
const Template = styled.div`
width: 1000px;
display: flex;
flex-direction: column;
justify-content: center;
align-items:center;
@media only screen and (max-width: 996px){
width:100%;
height:auto;
}
`;
const TitleText = styled.div`
font-size: 20px;
font-weight: bold;
margin-top: 40px;
margin-bottom: 20px;
align-self: flex-start;
margin-left: 15px;
`;
const GridContainerTemplate = styled.div`
display: grid;
grid-template-columns: repeat(4,1fr);
grid-template-rows: auto;
grid-gap: 20px;
@media only screen and (max-width: 996px){
grid-template-columns: repeat(2, minmax(220px,1fr));
width:97%;
}
`;
function GridTemplate({titletext, object}) {
return (
<Template>
<TitleText>{titletext}</TitleText>
<GridContainerTemplate>
{
object.map((obj,idx)=>(
<Grid
obj={obj}
key={`Grid-${idx}`}
</Grid>
))
}
</GridContainerTemplate>
</Template>
)
}
export default GridTemplate
const GridContainerTemplate = styled.div`
display: grid;
/* 최초 4개의 컬럼 유지 ! */
grid-template-columns: repeat(4,1fr);
grid-template-rows: auto;
grid-gap: 20px;
/* 996px 이하가 되면 최소 220px 최대 1fr크기를 가지는 컬럼 유지 ! */
@media only screen and (max-width: 996px){
grid-template-columns: repeat(2, minmax(220px,1fr));
width:97%;
}
`;
:内部要素の幅または高さのいずれかをautoとし、残りの要素をサイズとして指定すると、幅に応じて比例して
(Grid.js)
...
const GridTemplate = styled.div`
display: flex;
flex-direction: column;
width: 235px;
height: 292px;
padding-bottom: 64px;
position: relative;
overflow: hidden;
border-radius: 6px;
@media only screen and (max-width: 996px){
width:100%;
height:auto;
}
`;
const Img = styled.img`
width: 235px;
height: 160px;
border-radius: 6px;
cursor: pointer;
transition: 0.3s;
&:hover {
transform:scale(1.05);
${Like} {
transform:scale(1.2);
}
}
@media only screen and (max-width: 996px){
width:100%;
height:auto;
}
`;
...
function Grid({obj}) {
return (
<GridTemplate>
<Like>
<LikeImg src="https://tumblbug.com/wpa/1d4978f729cd37a38573e85f399b74c1.png"></LikeImg>
</Like>
<Img src={obj.img}></Img>
<TextBox>
<TagText>{obj.tagText}</TagText>
<TitleText>{obj.titleText}</TitleText>
</TextBox>
<SuccessRate>{obj.successRate}</SuccessRate>
</GridTemplate>
)
}
Grid-item hover効果
[プレビュー]
:scaleを追加し、オーバーフロー部分
const Img = styled.img`
width: 235px;
height: 160px;
border-radius: 6px;
cursor: pointer;
transition: 0.3s;
&:hover {
transform:scale(1.05);
}
@media only screen and (max-width: 996px){
width:100%;
height:auto;
}
`;
ImageSliderへの反作用の追加
[原理]
(git-hub参照)
[コード]
(Slider.js)
...
const SliderTemplate = styled.div`
display: flex;
justify-content: flex-start;
position: relative;
@media screen and (max-width: 960px){
display: flex;
flex-direction: column;
width:100%;
height:auto;
}
`;
テキスト部分も同様の原理を使用して、外部ボックスをwid:100%、height:autoに設定しようとしたが、なかった.
->imgラベルでいいです.divではできません.
したがって、トランジションを放棄し、条件レンダリングで解決します.
(SideText.js)
function SideText({chIdx, obj, onClickLeftButton, onClickRightButton}) {
return (
/* 해당되는 텍스트만 width:100%로 출력하게 했음 */
chIdx == obj.idx?
<>
<SideWrap chIdx={chIdx}>
<TextBox>
<MainText>
<MainTxt1>{obj.mainTxt1}</MainTxt1>
<MainTxt2>{obj.mainTxt2}</MainTxt2>
</MainText>
<SubText>{obj.subTxt}</SubText>
</TextBox>
<ButtonAndPage>
<ButtonBox>
<ButtonLeft
onClick={onClickLeftButton}>
<i className="fas fa-chevron-left"></i>
</ButtonLeft>
<ButtonRight
onClick={onClickRightButton}>
<i className="fas fa-chevron-right"></i>
</ButtonRight>
</ButtonBox>
<PageCnt>{obj.idx+1} / 5</PageCnt>
</ButtonAndPage>
</SideWrap>
</>
:null
)
}
最終結果
Reference
この問題について(umblbug Page (2)), 我々は、より多くの情報をここで見つけました
https://velog.io/@neity16/React-tumblbug-Page-2
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
Reference
この問題について(umblbug Page (2)), 我々は、より多くの情報をここで見つけました https://velog.io/@neity16/React-tumblbug-Page-2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol