菜鳥初探
emotions 實作 RWD & CSS Flex屬性
第一關:RWD只吃得到1023px以上的斷點
// @mediaQuery.js
import { css } from '@emotion/core';
const breakpoints = {
mobile: 479,
portraitTablet: 767,
// RWD 只吃得到 tablet 和 desktop 的斷點
tablet: 1023,
desktop: 1199,
};
const mq = Object.keys(breakpoints).reduce((accumulator, label) => {
const prefix = typeof breakpoints[label] === 'string' ? '' : 'max-width: ';
const suffix = typeof breakpoints[label] === 'string' ? '' : 'px';
accumulator[label] = styles => css`
@media (${prefix + breakpoints[label] + suffix}) {
${css`
${styles};
`};
}
`;
return accumulator;
}, {});
export default mq;
那時候小白說:
自動產生的html不包含meta viewport
所以預設是兩倍大小的模擬,會吃不到media query
查了一下資料後發現:
使用RWD一定要在html上加上↓
<meta name='viewport' content='initial-scale=1, maximum-scale=1' />
這段的意思是讓「網頁呈現的寬度」
以「裝置目前的寬度」來做呈現
(如果裝置的寬度是320px,則網站的寬度也設成320px)
而不是把960px的網頁內容縮小成320px來呈現;
viewport : 螢幕上的可視區域
initial-scale=1 :不要縮放網頁的意思
maxium-scale=1 :設定畫面初始最大縮放比例
舉例
沒加:以電腦尺寸縮小
加了:以裝置目前的寬度呈現
更多<meta name=”viewport”>屬性如下:
第二關:字體沒有按照給定的大小顯示
欲知為何如此,且需深入瞭解css flexbox
用flexbox的flex屬性排版
display: flex;
flex: 1;
display: flex;
flex: 2;
display: flex;
flex: 1;
內藏玄機↓
flex的三個屬性
當我們用flex來排版時,會有以下三個屬性
1. flex-grow:我們寫flex時,一般都是在給定他的值,按照數字做相對應的「伸展」比例分配,會將空間依比例填滿。
(因此現在排版都使用flex-grow,相較於給定width或是padding/margin容易維持版型。)
2. flex-shrink:如何在空間不夠的狀態下,依比例縮小以適應有限空間。它的預設值為1,一般會以調整grow為主。
(設定RWD時,容易因為忽略flex-shrink而跑版)
3. flex-basis:子元素的基本大小,替代width,預設值為 0,沒有設定此屬性的時候,會直接採用 flex-grow 屬性。
所以,我們可以發現...
設定flex屬性是以「畫面完整性」為前提去縮放
因此當畫面大小不足時,自然而然會去縮小子元素
字體自然也不會按照我們預想的px去呈現!
更多flex細節,可參考:
圖解 Flexbox 進階屬性
https://cythilya.github.io/2017/04/06/flexbox-advance/
深入理解css3中的flex-grow、flex-shrink、flex-basis
https://zhoon.github.io/css3/2014/08/23/flex.html
第三關:
第三關:
這關比較簡單!
主要原因就是元素寬度超過螢幕大小
將超過的元素都下修即可
@emotions RWD寫法
//引入寫法
import mq from '../../@emotions/mediaQuery';
const BlockWrapper = styled.div`
display: flex;
width: 100%;
height: 100%;
flex: 6;
${mq.mobile`
flex-direction: column;
padding: 0px 0px 0px 40px;
//這裡無法再傳props下去
`}
`;
function XXX() {
return (
<BlockWrapper>
<Block>
...
</Block>
</BlockWrapper>
);
}
export default XXX;
尚未解決的問題,待下回分曉
const Private = styled.a`
text-decoration: none;
font-size: 16px;
letter-spacing: 1px;
color: #fff;
font-family: "Noto Sans CJK TC","Noto Sans";
line-height: 2.5;
padding: 0px 5px;
@media (max-width: 1024px) {
display: ${props => props.display};
//要傳props還是使用 RWD 原生的 @media
font-size: 12px;
}
`;
...
<Private display="none">
手機版不顯示
</Private>
作業
RWD & Flex
By parkerhiphop
RWD & Flex
- 351