使用nextjs开发过程中,一路根据功能要求,逐步引入css相关的各种工程方案

官方脚手架默认css+module css

image.png
image.png

项目使用antd,切换到less

并且要修改主题,antd使用的less,会使用less变量
并且使用less(sass)之类的层级嵌套开发提供效率
image.png

类目冲突,引入module css方案

客户端端路由,切换路由后,会偶发页面某个样式被覆盖
发现是类名冲突导致,通常加父级类名(命名空间)加一区别,但是这样还是难以避免,且不好维护。
nextjs支持Module Css方案,构建时动态生成随机classNmae,该方案对CSS Less Scss等都支持。
image.png

组件样式需要从props取值,引入style-componet

style-componet 跟其他方案可以配合使用
image.png

  1. import styles from "./index.module.less"
  2. import styled, { css } from 'styled-components';
  3. const TagDiv = styled.div`
  4. width:${props => props.width && `${props.width}px`};
  5. position: relative;
  6. min-height: 22px;
  7. overflow: hidden;
  8. &:hover{
  9. ul{
  10. transform: translateX(calc( ${props => props.width && `${props.width}px`} - 100%));
  11. }
  12. }
  13. ${(props) =>
  14. props?.css
  15. &&
  16. css`
  17. ${props.css}
  18. `}
  19. `
  20. // width 需要一个确定的值,才能在样式里translateX显示全部
  21. export default function TagsBox({list=[], width=180, css=''}) {
  22. if(typeof list === 'string'){
  23. return <TagDiv width={width} className={styles["tag-box"]} css={css}>
  24. <ul>
  25. <li>{list}</li>
  26. </ul>
  27. </TagDiv>
  28. }
  29. return (
  30. <TagDiv width={width} className={styles["tag-box"]} css={css}>
  31. <ul>
  32. {
  33. list?.map((item, index)=>
  34. <li key={index}>{item}</li>
  35. )
  36. }
  37. </ul>
  38. </TagDiv>
  39. )
  40. }