├── public
├── favicon.ico
├── manifest.json
└── index.html
├── src
├── Home
│ ├── documentation.md
│ ├── less
│ │ ├── antMotionStyle.less
│ │ ├── edit.less
│ │ ├── common.less
│ │ ├── custom.less
│ │ ├── content.less
│ │ ├── content0.less
│ │ ├── content3.less
│ │ ├── feature5.less
│ │ ├── content5.less
│ │ ├── footer1.less
│ │ ├── banner1.less
│ │ └── nav3.less
│ ├── utils.js
│ ├── Content0.jsx
│ ├── Content5.jsx
│ ├── Footer1.jsx
│ ├── Banner1.jsx
│ ├── Content3.jsx
│ ├── index.jsx
│ ├── Feature5.jsx
│ ├── Nav3.jsx
│ └── data.source.js
├── App.test.js
├── index.css
├── index.js
├── App.css
├── App.js
├── logo.svg
└── serviceWorker.js
├── README.md
├── config-overrides.js
├── .gitignore
└── package.json
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ant-motion/landing-create-react-app-example/HEAD/public/favicon.ico
--------------------------------------------------------------------------------
/src/Home/documentation.md:
--------------------------------------------------------------------------------
1 | # 如何使用:
2 |
3 | - umi 里如何使用[请查看](https://landing.ant.design/docs/use/umi)。
4 | - 其它脚手架使用[请查看](https://landing.ant.design/docs/use/getting-started)。
5 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Landing create-react-app Example
2 |
3 | 详细使用请查看 landing 里的 [use in create-react-app](https://landing.ant.design/docs/use/create-react-app)
4 |
5 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
6 |
7 |
--------------------------------------------------------------------------------
/src/App.test.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './App';
4 |
5 | it('renders without crashing', () => {
6 | const div = document.createElement('div');
7 | ReactDOM.render(, div);
8 | ReactDOM.unmountComponentAtNode(div);
9 | });
10 |
--------------------------------------------------------------------------------
/config-overrides.js:
--------------------------------------------------------------------------------
1 | const { override, fixBabelImports, addLessLoader } = require('customize-cra');
2 |
3 | module.exports = override(
4 | fixBabelImports('import', {
5 | libraryName: 'antd',
6 | libraryDirectory: 'es',
7 | style: true,
8 | }),
9 | addLessLoader({
10 | javascriptEnabled: true,
11 | }),
12 | );
--------------------------------------------------------------------------------
/src/Home/less/antMotionStyle.less:
--------------------------------------------------------------------------------
1 | @import './common.less';
2 | @import './custom.less';
3 | @import './content.less';
4 | @import './nav3.less';
5 | @import './banner1.less';
6 | @import './content0.less';
7 | @import './content5.less';
8 | @import './content3.less';
9 | @import './feature5.less';
10 | @import './footer1.less';
11 | @import './edit.less';
--------------------------------------------------------------------------------
/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | }
10 | ],
11 | "start_url": ".",
12 | "display": "standalone",
13 | "theme_color": "#000000",
14 | "background_color": "#ffffff"
15 | }
16 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | padding: 0;
4 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen",
5 | "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
6 | sans-serif;
7 | -webkit-font-smoothing: antialiased;
8 | -moz-osx-font-smoothing: grayscale;
9 | }
10 |
11 | code {
12 | font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
13 | monospace;
14 | }
15 |
--------------------------------------------------------------------------------
/src/Home/less/edit.less:
--------------------------------------------------------------------------------
1 | #Content0_0 .home-page > div > .k9h76g7v2q-editor_css {
2 | justify-content: center;
3 | }
4 | #Footer1_0 .ant-col > div > .k9h7irl6jgj-editor_css {
5 | display: flex;
6 | justify-content: center;
7 | }
8 | #Footer1_0 .ant-col > div > .k9h7jbsf8ap-editor_css {
9 | display: flex;
10 | justify-content: center;
11 | }
12 | #Footer1_0 .ant-row > .ant-col > .k9h7k134cu-editor_css {
13 | display: flex;
14 | justify-content: center;
15 | }
16 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import './index.css';
4 | import App from './Home';
5 | import * as serviceWorker from './serviceWorker';
6 |
7 | ReactDOM.render(, document.getElementById('root'));
8 |
9 | // If you want your app to work offline and load faster, you can change
10 | // unregister() to register() below. Note this comes with some pitfalls.
11 | // Learn more about service workers: http://bit.ly/CRA-PWA
12 | serviceWorker.unregister();
13 |
--------------------------------------------------------------------------------
/src/Home/less/common.less:
--------------------------------------------------------------------------------
1 |
2 | // @import "~antd/lib/style/v2-compatible-reset.less";
3 |
4 | body {
5 | word-wrap: break-word;
6 | }
7 |
8 | body,
9 | div,
10 | dl,
11 | dt,
12 | dd,
13 | ul,
14 | ol,
15 | li,
16 | h1,
17 | h2,
18 | h3,
19 | h4,
20 | h5,
21 | h6 {
22 | margin: 0;
23 | padding: 0;
24 | }
25 |
26 | /* .content-wrapper > .tween-one-leaving,
27 | .queue-anim-leaving {
28 | // position: absolute !important;
29 | // width: 100%;
30 | } */
31 |
32 | .video {
33 | max-width: 800px;
34 | }
35 |
36 | #react-content {
37 | min-height: 100%;
38 | }
39 | .home-page-wrapper p {
40 | padding: 0;
41 | margin: 0;
42 | }
43 |
--------------------------------------------------------------------------------
/src/App.css:
--------------------------------------------------------------------------------
1 | .App {
2 | text-align: center;
3 | }
4 |
5 | .App-logo {
6 | animation: App-logo-spin infinite 20s linear;
7 | height: 40vmin;
8 | pointer-events: none;
9 | }
10 |
11 | .App-header {
12 | background-color: #282c34;
13 | min-height: 100vh;
14 | display: flex;
15 | flex-direction: column;
16 | align-items: center;
17 | justify-content: center;
18 | font-size: calc(10px + 2vmin);
19 | color: white;
20 | }
21 |
22 | .App-link {
23 | color: #61dafb;
24 | }
25 |
26 | @keyframes App-logo-spin {
27 | from {
28 | transform: rotate(0deg);
29 | }
30 | to {
31 | transform: rotate(360deg);
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/src/App.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import logo from './logo.svg';
3 | import './App.css';
4 |
5 | class App extends Component {
6 | render() {
7 | return (
8 |
24 | );
25 | }
26 | }
27 |
28 | export default App;
29 |
--------------------------------------------------------------------------------
/src/Home/utils.js:
--------------------------------------------------------------------------------
1 |
2 | import React from 'react';
3 | import { Button } from 'antd';
4 |
5 | export const isImg = /^http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w-./?%&=]*)?/;
6 | export const getChildrenToRender = (item, i) => {
7 | let tag = item.name.indexOf('title') === 0 ? 'h1' : 'div';
8 | tag = item.href ? 'a' : tag;
9 | let children = typeof item.children === 'string' && item.children.match(isImg)
10 | ? React.createElement('img', { src: item.children, alt: 'img' })
11 | : item.children;
12 | if (item.name.indexOf('button') === 0 && typeof item.children === 'object') {
13 | children = React.createElement(Button, {
14 | ...item.children
15 | });
16 | }
17 | return React.createElement(tag, { key: i.toString(), ...item }, children);
18 | };
19 |
--------------------------------------------------------------------------------
/src/Home/less/custom.less:
--------------------------------------------------------------------------------
1 | @import "~antd/lib/style/themes/default.less";
2 |
3 | @line-color: #e9e9e9;
4 |
5 | @shadow-color: rgba(0, 0, 0, 0.15);
6 |
7 | @bottom-bar-bg-color: #262626;
8 | @bottom-bar-line-color: #000;
9 |
10 | @template-bg-color: #001529;
11 | @template-bg-color-light: #ececec;
12 | @template-nav-bg-color: #001529;
13 | @template-text-color: #ccc;
14 | @template-text-title-color: #bcbcbc;
15 | @template-text-color-light: #fff;
16 | @template-footer-text-color: #999;
17 |
18 | @animate-duration: .45s;
19 |
20 | /* 详细页图片或框框的样式;
21 | */
22 | .page-shadow() {
23 | box-shadow: 0 5px 8px @shadow-color;
24 | }
25 |
26 | .page-pro() {
27 | border-radius: 6px;
28 | border: 1px solid @line-color;
29 | transform: translateY(0);
30 | transition: transform .3s @ease-out, box-shadow .3s @ease-out;
31 | &:hover {
32 | .page-shadow();
33 | transform: translateY(-5px);
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/src/Home/less/content.less:
--------------------------------------------------------------------------------
1 | @homepage: home-page;
2 | .@{homepage}-wrapper {
3 | width: 100%;
4 | position: relative;
5 | overflow: hidden;
6 | .@{homepage} {
7 | height: 100%;
8 | max-width: 1200px;
9 | position: relative;
10 | margin: auto;
11 | will-change: transform;
12 | }
13 | .title-wrapper > h1, > h1 {
14 | font-size: 32px;
15 | color: @text-color;
16 | margin-bottom: 16px;
17 | }
18 | .title-wrapper {
19 | margin: 0 auto 64px;
20 | text-align: center;
21 | }
22 | }
23 |
24 | .@{homepage} {
25 | padding: 128px 24px;
26 | }
27 |
28 | @media screen and (max-width: 767px) {
29 | .@{homepage}-wrapper {
30 | .@{homepage} {
31 | padding: 56px 24px;
32 | >h1 {
33 | font-size: 24px;
34 | margin: 0 auto 32px;
35 | &.title-h1 {
36 | margin-bottom: 8px;
37 | }
38 | }
39 | >p {
40 | margin-bottom: 32px;
41 | }
42 | }
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "landing-create-react-app-example",
3 | "version": "0.1.0",
4 | "private": true,
5 | "homepage": "./",
6 | "dependencies": {
7 | "@ant-design/compatible": "^1.0.2",
8 | "antd": "^4.0.1",
9 | "enquire-js": "^0.2.1",
10 | "rc-banner-anim": "^2.2.2",
11 | "rc-queue-anim": "^1.6.12",
12 | "rc-scroll-anim": "^2.5.6",
13 | "rc-tween-one": "^2.3.4",
14 | "react": "^16.8.3",
15 | "react-dom": "^16.8.3",
16 | "react-scripts": "2.1.5"
17 | },
18 | "scripts": {
19 | "start": "react-app-rewired start",
20 | "build": "react-app-rewired build",
21 | "test": "react-app-rewired test",
22 | "eject": "react-app-rewired eject"
23 | },
24 | "eslintConfig": {
25 | "extends": "react-app"
26 | },
27 | "browserslist": [
28 | ">0.2%",
29 | "not dead",
30 | "not ie <= 11",
31 | "not op_mini all"
32 | ],
33 | "devDependencies": {
34 | "babel-plugin-import": "^1.11.0",
35 | "customize-cra": "^0.2.12",
36 | "less": "^3.9.0",
37 | "less-loader": "^4.1.0",
38 | "react-app-rewired": "^2.1.0"
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/src/Home/less/content0.less:
--------------------------------------------------------------------------------
1 | @content0: content0;
2 |
3 | .@{content0}-wrapper {
4 | min-height: 446px;
5 | overflow: hidden;
6 |
7 | .@{content0} {
8 | height: 100%;
9 | padding: 64px 24px;
10 |
11 | >.title-wrapper {
12 | margin: 0 auto 48px;
13 | }
14 |
15 | &-block {
16 | padding: 0 4%;
17 | display: inline-block;
18 | text-align: center;
19 | min-height: 200px;
20 | margin-bottom: 24px;
21 | img {
22 | width: 100%;
23 | }
24 |
25 | &-wrapper {
26 | position: relative;
27 | height: 100%;
28 | top: 25%;
29 | padding: 20px 0;
30 | }
31 |
32 | &.queue-anim-leaving {
33 | position: relative !important;
34 | }
35 |
36 | &-icon {
37 | width: 100px;
38 | height: 100px;
39 | margin: auto;
40 | }
41 |
42 | &-title {
43 | line-height: 32px;
44 | margin: 10px auto;
45 | font-size: 24px;
46 | }
47 | }
48 | }
49 | }
50 |
51 | @media screen and (max-width: 767px) {
52 | .@{content0}-wrapper {
53 | min-height: 880px;
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/src/Home/less/content3.less:
--------------------------------------------------------------------------------
1 | @content3: content3;
2 | .@{content3}-wrapper {
3 | min-height: 764px;
4 | .@{content3} {
5 | height: 100%;
6 | overflow: hidden;
7 | & .title-content {
8 | text-align: center;
9 | }
10 | &-block-wrapper {
11 | position: relative;
12 | .@{content3}-block {
13 | display: inline-block;
14 | padding: 48px 24px;
15 | vertical-align: top;
16 | .@{content3}-icon {
17 | display: inline-block;
18 | width: 15%;
19 | vertical-align: top;
20 | }
21 | .@{content3}-text {
22 | width: 85%;
23 | display: inline-block;
24 | padding-left: 8%;
25 | }
26 | &.clear-both {
27 | clear: both;
28 | }
29 | }
30 | }
31 | }
32 | }
33 |
34 | @media screen and (max-width: 767px) {
35 | .@{content3}-wrapper {
36 | min-height: 1080px;
37 | .@{content3} {
38 | &-block-wrapper {
39 | margin: 20px auto;
40 | height: auto;
41 | .@{content3}-block {
42 | .@{content3}-title {
43 | font-size: 20px;
44 | }
45 | &.queue-anim-leaving {
46 | position: relative !important;
47 | }
48 | }
49 | }
50 | }
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/src/Home/Content0.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import QueueAnim from 'rc-queue-anim';
3 | import { Row, Col } from 'antd';
4 | import OverPack from 'rc-scroll-anim/lib/ScrollOverPack';
5 | import { getChildrenToRender } from './utils';
6 |
7 | class Content extends React.PureComponent {
8 | render() {
9 | const { dataSource, isMobile, ...props } = this.props;
10 | const {
11 | wrapper,
12 | titleWrapper,
13 | page,
14 | OverPack: overPackData,
15 | childWrapper,
16 | } = dataSource;
17 | return (
18 |
19 |
20 |
21 | {titleWrapper.children.map(getChildrenToRender)}
22 |
23 |
24 |
31 | {childWrapper.children.map((block, i) => {
32 | const { children: item, ...blockProps } = block;
33 | return (
34 |
35 |
36 | {item.children.map(getChildrenToRender)}
37 |
38 |
39 | );
40 | })}
41 |
42 |
43 |
44 |
45 | );
46 | }
47 | }
48 |
49 | export default Content;
50 |
--------------------------------------------------------------------------------
/src/Home/less/feature5.less:
--------------------------------------------------------------------------------
1 | @content7: content7;
2 | .@{content7}-wrapper {
3 | min-height: 720px;
4 | .@{content7} {
5 | >h1,
6 | >p {
7 | text-align: center;
8 | }
9 | &-tag {
10 | & i {
11 | width: 12px;
12 | height: 14px;
13 | display: inline-block;
14 | vertical-align: middle;
15 | margin-right: 5px;
16 | }
17 | &-name {
18 | display: inline-block;
19 | }
20 | }
21 | .ant-tabs-bar {
22 | text-align: center;
23 | }
24 | .ant-tabs {
25 | .ant-tabs-nav {
26 | float: none;
27 | text-align: center;
28 | }
29 | }
30 | &-tabs-wrapper {
31 | position: relative;
32 | margin-top: 24px;
33 | }
34 | &-content {
35 | display: flex;
36 | align-items: center;
37 | }
38 | &-text {
39 | padding: 24px 48px;
40 | }
41 | &-img {
42 | padding: 24px 48px;
43 | }
44 | .ant-tabs-tabpane {
45 | margin-top: 40px;
46 | }
47 | }
48 | }
49 |
50 | @media screen and (max-width: 767px) {
51 | .@{content7}-wrapper {
52 | min-height: 980px;
53 | overflow: hidden;
54 | .@{content7} {
55 | max-width: 100%;
56 | &-content {
57 | display: block;
58 | }
59 | &-text,
60 | &-img {
61 | text-align: left;
62 | padding: 0;
63 | }
64 | &-img {
65 | margin-top: 32px;
66 | }
67 | .ant-tabs-bar {
68 | width: auto;
69 | .ant-tabs-nav {
70 | float: left;
71 | }
72 | }
73 | }
74 | }
75 | }
76 |
--------------------------------------------------------------------------------
/src/Home/less/content5.less:
--------------------------------------------------------------------------------
1 | @content5: content5;
2 | .@{content5}-wrapper {
3 | background-color: #fafafa;
4 | min-height: 720px;
5 | .@{content5} {
6 | >p {
7 | text-align: center;
8 | }
9 | &-img-wrapper {
10 | margin: 0 auto;
11 | left: 0;
12 | right: 0;
13 | .block {
14 | margin-bottom: 24px;
15 | .content5-block-content {
16 | display: block;
17 | background: #fff;
18 | border-radius: 4px;
19 | padding: 10px;
20 | text-align: center;
21 | position: relative;
22 | overflow: hidden;
23 | .page-pro();
24 | border: none;
25 | transition: box-shadow .3s @ease-out, transform .3s @ease-out;
26 | & > span {
27 | width: 100%;
28 | height: 160px;
29 | display: block;
30 | background: @line-color;
31 | padding: 5%;
32 | }
33 | & p {
34 | width: 100%;
35 | line-height: 30px;
36 | }
37 | &:hover {
38 | & p {
39 | bottom: 0;
40 | }
41 | }
42 | }
43 | }
44 | }
45 | }
46 | }
47 |
48 | @media screen and (max-width: 767px) {
49 | .@{content5}-wrapper {
50 | height: 2000px;
51 | overflow: hidden;
52 | .@{content5} {
53 | ul {
54 | li {
55 | display: block;
56 | width: 100%;
57 | padding: 2%;
58 | span {
59 | height: 168px;
60 | }
61 | p {
62 | position: relative;
63 | bottom: 0;
64 | }
65 | }
66 | }
67 | }
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
10 |
11 |
15 |
16 |
25 | React App
26 |
27 |
28 |
29 |
30 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/src/Home/Content5.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Row, Col } from 'antd';
3 | import { TweenOneGroup } from 'rc-tween-one';
4 | import OverPack from 'rc-scroll-anim/lib/ScrollOverPack';
5 | import { getChildrenToRender } from './utils';
6 |
7 | class Content5 extends React.PureComponent {
8 | getChildrenToRender = (data) =>
9 | data.map((item) => {
10 | return (
11 |
12 |
13 |
14 |
15 |
16 |
{item.children.content.children}
17 |
18 |
19 | );
20 | });
21 |
22 | render() {
23 | const { ...props } = this.props;
24 | const { dataSource } = props;
25 | delete props.dataSource;
26 | delete props.isMobile;
27 | const childrenToRender = this.getChildrenToRender(
28 | dataSource.block.children
29 | );
30 | return (
31 |
32 |
33 |
34 | {dataSource.titleWrapper.children.map(getChildrenToRender)}
35 |
36 |
40 |
52 | {childrenToRender}
53 |
54 |
55 |
56 |
57 | );
58 | }
59 | }
60 |
61 | export default Content5;
62 |
--------------------------------------------------------------------------------
/src/Home/less/footer1.less:
--------------------------------------------------------------------------------
1 | .footer1-wrapper {
2 | background: @template-bg-color;
3 | overflow: hidden;
4 | position: relative;
5 | min-height: 360px;
6 | color: @template-footer-text-color;
7 | .footer1 {
8 | .home-page {
9 | padding: 64px 24px 80px;
10 | }
11 | }
12 | .block {
13 | padding: 0 32px;
14 | .logo {
15 | max-width: 180px;
16 | }
17 | .slogan {
18 | font-size: 12px;
19 | margin-top: -20px;
20 | }
21 | >h2 {
22 | margin-bottom: 24px;
23 | color: @template-text-color;
24 | }
25 | a {
26 | color: @template-footer-text-color;
27 | margin-bottom: 12px;
28 | float: left;
29 | clear: both;
30 | &:hover {
31 | color: @primary-color;
32 | }
33 | }
34 | }
35 | .copyright-wrapper {
36 | width: 100%;
37 | border-top: 1px solid fade(@line-color, 10);
38 | .home-page {
39 | padding: 0 24px;
40 | overflow: hidden;
41 | }
42 | .copyright {
43 | height: 80px;
44 | text-align: center;
45 | line-height: 80px;
46 | }
47 | }
48 | }
49 |
50 | @media screen and (max-width: 767px) {
51 | .footer1 {
52 | min-height: 550px;
53 | &-wrapper {
54 | .footer1 {
55 | .home-page {
56 | padding: 64px 24px 32px;
57 | }
58 | }
59 | }
60 | .logo {
61 | margin: 0 auto 24px;
62 | }
63 | .block {
64 | text-align: center;
65 | margin-bottom: 32px;
66 | padding: 0;
67 | }
68 | >ul {
69 | width: 90%;
70 | margin: 20px auto 0;
71 | padding: 10px 0;
72 | >li {
73 | width: 100%;
74 | h2 {
75 | margin-bottom: 10px;
76 | }
77 | li {
78 | display: inline-block;
79 | margin-right: 10px;
80 | }
81 | }
82 | }
83 | .copyright {
84 | &-wrapper {
85 | .home-page {
86 | padding: 0;
87 | .copyright {
88 | font-size: 12px;
89 | }
90 | }
91 | }
92 |
93 | span {
94 | width: 90%;
95 | }
96 | }
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/src/Home/Footer1.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import TweenOne from 'rc-tween-one';
3 | import OverPack from 'rc-scroll-anim/lib/ScrollOverPack';
4 | import QueueAnim from 'rc-queue-anim';
5 | import { Row, Col } from 'antd';
6 | import { getChildrenToRender } from './utils';
7 | import { isImg } from './utils';
8 |
9 | class Footer extends React.Component {
10 | static defaultProps = {
11 | className: 'footer1',
12 | };
13 |
14 | getLiChildren = (data) =>
15 | data.map((item, i) => {
16 | const { title, childWrapper, ...itemProps } = item;
17 | return (
18 |
19 |
20 | {typeof title.children === 'string' &&
21 | title.children.match(isImg) ? (
22 |
23 | ) : (
24 | title.children
25 | )}
26 |
27 |
28 | {childWrapper.children.map(getChildrenToRender)}
29 |
30 |
31 | );
32 | });
33 |
34 | render() {
35 | const { ...props } = this.props;
36 | const { dataSource } = props;
37 | delete props.dataSource;
38 | delete props.isMobile;
39 | const childrenToRender = this.getLiChildren(dataSource.block.children);
40 | return (
41 |
42 |
43 |
50 | {childrenToRender}
51 |
52 |
57 |
58 |
59 | {dataSource.copyright.children}
60 |
61 |
62 |
63 |
64 |
65 | );
66 | }
67 | }
68 |
69 | export default Footer;
70 |
--------------------------------------------------------------------------------
/src/logo.svg:
--------------------------------------------------------------------------------
1 |
8 |
--------------------------------------------------------------------------------
/src/Home/Banner1.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Button } from 'antd';
3 | import { DownOutlined } from '@ant-design/icons';
4 | import QueueAnim from 'rc-queue-anim';
5 | import TweenOne, { TweenOneGroup } from 'rc-tween-one';
6 | import BannerAnim, { Element } from 'rc-banner-anim';
7 | import { isImg } from './utils';
8 | import 'rc-banner-anim/assets/index.css';
9 |
10 | const { BgElement } = Element;
11 | class Banner extends React.PureComponent {
12 | render() {
13 | const { ...props } = this.props;
14 | const { dataSource } = props;
15 | delete props.dataSource;
16 | delete props.isMobile;
17 | const childrenToRender = dataSource.BannerAnim.children.map((item, i) => {
18 | const elem = item.BannerElement;
19 | const elemClassName = elem.className;
20 | delete elem.className;
21 | const { bg, textWrapper, title, content, button } = item;
22 | return (
23 |
24 |
25 |
31 |
32 | {typeof title.children === 'string' &&
33 | title.children.match(isImg) ? (
34 |

35 | ) : (
36 | title.children
37 | )}
38 |
39 |
40 | {content.children}
41 |
42 |
45 |
46 |
47 | );
48 | });
49 | return (
50 |
51 |
57 |
58 |
59 | {childrenToRender}
60 |
61 |
62 |
63 |
74 |
75 |
76 |
77 | );
78 | }
79 | }
80 |
81 | export default Banner;
82 |
--------------------------------------------------------------------------------
/src/Home/Content3.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import QueueAnim from 'rc-queue-anim';
3 | import TweenOne from 'rc-tween-one';
4 | import { Row, Col } from 'antd';
5 | import OverPack from 'rc-scroll-anim/lib/ScrollOverPack';
6 | import { getChildrenToRender } from './utils';
7 |
8 | class Content3 extends React.PureComponent {
9 | getDelay = (e, b) => (e % b) * 100 + Math.floor(e / b) * 100 + b * 100;
10 |
11 | render() {
12 | const { ...props } = this.props;
13 | const { dataSource, isMobile } = props;
14 | delete props.dataSource;
15 | delete props.isMobile;
16 | let clearFloatNum = 0;
17 | const children = dataSource.block.children.map((item, i) => {
18 | const childObj = item.children;
19 | const delay = isMobile ? i * 50 : this.getDelay(i, 24 / item.md);
20 | const liAnim = {
21 | opacity: 0,
22 | type: 'from',
23 | ease: 'easeOutQuad',
24 | delay,
25 | };
26 | const childrenAnim = { ...liAnim, x: '+=10', delay: delay + 100 };
27 | clearFloatNum += item.md;
28 | clearFloatNum = clearFloatNum > 24 ? 0 : clearFloatNum;
29 | return (
30 |
42 |
52 |
53 |
54 |
55 |
61 | {childObj.title.children}
62 |
63 |
69 | {childObj.content.children}
70 |
71 |
72 |
73 | );
74 | });
75 | return (
76 |
77 |
78 |
79 | {dataSource.titleWrapper.children.map(getChildrenToRender)}
80 |
81 |
82 |
83 |
84 | {children}
85 |
86 |
87 |
88 |
89 |
90 | );
91 | }
92 | }
93 |
94 | export default Content3;
95 |
--------------------------------------------------------------------------------
/src/Home/less/banner1.less:
--------------------------------------------------------------------------------
1 |
2 | @banner1: banner1;
3 | .@{banner1} {
4 | // 如果在第一屏且导航位置为 relative, 一屏为 height: calc(~"100vh - 64px");
5 | width: 100%;
6 | height: 100vh;
7 | position: relative;
8 | border-color: #666;
9 | background: #fff;
10 | &-wrapper, .banner-anim {
11 | height: 100%;
12 | }
13 | & .queue-anim-leaving {
14 | position: relative !important;
15 | }
16 | .banner-user-elem {
17 | height: 100%;
18 | color: #fff;
19 | position: relative;
20 | overflow: hidden;
21 | }
22 | .bg0 {
23 | background: url("https://zos.alipayobjects.com/rmsportal/hzPBTkqtFpLlWCi.jpg") center;
24 | }
25 | .bg1 {
26 | background: url("https://zos.alipayobjects.com/rmsportal/xHxWkcvaIcuAdQl.jpg") center;
27 | }
28 | .bg {
29 | width: 100%;
30 | height: 100%;
31 | position: absolute;
32 | top: 0;
33 | left: 0;
34 | overflow: hidden;
35 | background-size: cover;
36 | }
37 | .banner-user-elem .banner-user-title {
38 | font-size: 22px;
39 | top: 40%;
40 | }
41 | .banner-user-elem .banner-user-text {
42 | top: 40%;
43 | }
44 | & &-text-wrapper {
45 | display: block;
46 | position: relative;
47 | top: 20%;
48 | left: 0;
49 | right: 0;
50 | margin: auto;
51 | font-size: 14px;
52 | color: @template-text-color-light;
53 | width: 550px;
54 | text-align: center;
55 | }
56 | & &-title {
57 | width: 350px;
58 | left: 30px;
59 | margin: auto;
60 | display: inline-block;
61 | font-size: 40px;
62 | position: relative;
63 | }
64 | & &-content {
65 | margin-bottom: 20px;
66 | word-wrap: break-word;
67 | }
68 | & &-button {
69 | border: 1px solid #fff;
70 | color: #fff;
71 | background: transparent;
72 | box-shadow: 0 0 0 transparent;
73 | transition: background .45s @ease-out, box-shadow .45s @ease-out;
74 | line-height: 36px;
75 | font-size: 16px;
76 | height: 36px;
77 | & span {
78 | text-shadow: 0 0 0 rgba(0, 0, 0, 0);
79 | transition: text-shadow .45s @ease-out;
80 | }
81 | &:hover {
82 | color: #fff;
83 | border-color: #fff;
84 | background: rgba(255, 255, 255, 0.1);
85 | box-shadow: 0 0 10px rgba(50, 250, 255, 0.75);
86 | & span {
87 | text-shadow: 1px 1px 3px rgba(0, 0, 0, .35);
88 | }
89 | }
90 |
91 | &.queue-anim-leaving {
92 | width: auto;
93 | }
94 | }
95 | & &-icon {
96 | bottom: 20px;
97 | font-size: 24px;
98 | position: absolute;
99 | z-index: 10;
100 | left: 50%;
101 | margin-left: -12px;
102 | color: @template-text-color-light;
103 | }
104 | }
105 |
106 | .banner-anim-thumb-default span {
107 | width: 10px;
108 | height: 10px;
109 | border-radius: 10px;
110 | background: rgba(255, 255, 255, .5);
111 | }
112 |
113 | @media screen and (max-width: 767px) {
114 | .@{banner1} {
115 | & &-text-wrapper {
116 | width: 90%;
117 | .@{banner1}-title {
118 | width: 90%;
119 | left: 0;
120 | }
121 | }
122 | .bg {
123 | background-attachment: inherit;
124 | }
125 | }
126 | }
127 |
--------------------------------------------------------------------------------
/src/Home/index.jsx:
--------------------------------------------------------------------------------
1 | /* eslint no-undef: 0 */
2 | /* eslint arrow-parens: 0 */
3 | import React from 'react';
4 | import { enquireScreen } from 'enquire-js';
5 |
6 | import Nav3 from './Nav3';
7 | import Banner1 from './Banner1';
8 | import Content0 from './Content0';
9 | import Content5 from './Content5';
10 | import Content3 from './Content3';
11 | import Feature5 from './Feature5';
12 | import Footer1 from './Footer1';
13 |
14 | import {
15 | Nav30DataSource,
16 | Banner10DataSource,
17 | Content00DataSource,
18 | Content50DataSource,
19 | Content30DataSource,
20 | Feature50DataSource,
21 | Footer10DataSource,
22 | } from './data.source';
23 | import './less/antMotionStyle.less';
24 |
25 | let isMobile;
26 | enquireScreen((b) => {
27 | isMobile = b;
28 | });
29 |
30 | const { location } = window;
31 |
32 | export default class Home extends React.Component {
33 | constructor(props) {
34 | super(props);
35 | this.state = {
36 | isMobile,
37 | show: !location.port, // 如果不是 dva 2.0 请删除
38 | };
39 | }
40 |
41 | componentDidMount() {
42 | // 适配手机屏幕;
43 | enquireScreen((b) => {
44 | this.setState({ isMobile: !!b });
45 | });
46 | // dva 2.0 样式在组件渲染之后动态加载,导致滚动组件不生效;线上不影响;
47 | /* 如果不是 dva 2.0 请删除 start */
48 | if (location.port) {
49 | // 样式 build 时间在 200-300ms 之间;
50 | setTimeout(() => {
51 | this.setState({
52 | show: true,
53 | });
54 | }, 500);
55 | }
56 | /* 如果不是 dva 2.0 请删除 end */
57 | }
58 |
59 | render() {
60 | const children = [
61 | ,
67 | ,
73 | ,
79 | ,
85 | ,
91 | ,
97 | ,
103 | ];
104 | return (
105 | {
108 | this.dom = d;
109 | }}
110 | >
111 | {/* 如果不是 dva 2.0 替换成 {children} start */}
112 | {this.state.show && children}
113 | {/* 如果不是 dva 2.0 替换成 {children} end */}
114 |
115 | );
116 | }
117 | }
118 |
--------------------------------------------------------------------------------
/src/Home/Feature5.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import TweenOne from 'rc-tween-one';
3 | import OverPack from 'rc-scroll-anim/lib/ScrollOverPack';
4 | import { Tabs, Row, Col } from 'antd';
5 | import { Icon } from '@ant-design/compatible';
6 | import { getChildrenToRender } from './utils';
7 |
8 | const TabPane = Tabs.TabPane;
9 |
10 | class Content7 extends React.Component {
11 | constructor(props) {
12 | super(props);
13 | this.state = {
14 | current: 1,
15 | };
16 | }
17 |
18 | onChange = (key) => {
19 | this.setState({ current: parseFloat(key) });
20 | };
21 |
22 | getBlockChildren = (item, i) => {
23 | const { tag, content } = item;
24 | const { text, img } = content;
25 | const textChildren = text.children;
26 | const { icon } = tag;
27 | const iconChildren = icon.children;
28 | const tagText = tag.text;
29 | return (
30 |
34 |
35 | {tagText.children}
36 |
37 | }
38 | className={item.className}
39 | >
40 |
51 | {this.state.current === i + 1 && (
52 |
57 |
58 | {textChildren}
59 |
60 |
61 |
62 |
63 |
64 | )}
65 |
66 |
67 | );
68 | };
69 |
70 | render() {
71 | const { ...props } = this.props;
72 | const { dataSource } = props;
73 | delete props.dataSource;
74 | delete props.isMobile;
75 | const tabsChildren = dataSource.block.children.map(this.getBlockChildren);
76 | return (
77 |
78 |
79 |
80 | {dataSource.titleWrapper.children.map(getChildrenToRender)}
81 |
82 |
83 |
84 |
95 |
101 | {tabsChildren}
102 |
103 |
104 |
105 |
106 |
107 | );
108 | }
109 | }
110 |
111 | export default Content7;
112 |
--------------------------------------------------------------------------------
/src/Home/less/nav3.less:
--------------------------------------------------------------------------------
1 | @header3: header3;
2 |
3 | .@{header3} {
4 | background: #fff;
5 | width: 100%;
6 | z-index: 1;
7 | box-shadow: 0 4px 6px fade(#000, 5);
8 | position: relative;
9 | top: 0;
10 |
11 | .home-page {
12 | padding: 0 24px;
13 | }
14 |
15 | &-logo {
16 | display: inline-block;
17 | position: relative;
18 | width: 150px;
19 | line-height: 64px;
20 |
21 | & img {
22 | vertical-align: middle;
23 | display: inline-block;
24 | }
25 |
26 | & a {
27 | display: block;
28 | }
29 | }
30 |
31 | &-menu {
32 | float: right;
33 | .ant-menu-horizontal {
34 | border-bottom: none;
35 | }
36 | .ant-menu {
37 | line-height: 62px;
38 | height: 64px;
39 | background: transparent;
40 |
41 | a {
42 | display: block;
43 | }
44 | }
45 | }
46 |
47 | &-item {
48 | &-block {
49 | padding: 0 8px;
50 |
51 | >* {
52 | display: inline-block;
53 | }
54 | }
55 | }
56 |
57 | &-item,
58 | &-item-child,
59 | &-menu {
60 |
61 | .ant-menu-sub .ant-menu-item,
62 | .ant-menu-inline .ant-menu-item {
63 | height: auto;
64 | line-height: 1.5;
65 | }
66 |
67 | .item {
68 | &-sub-item {
69 | display: block;
70 | padding: 8px 24px;
71 | }
72 |
73 | &-image {
74 | float: left;
75 | margin-right: 16px;
76 | margin-top: 4px;
77 | position: relative;
78 | z-index: 1;
79 | }
80 |
81 | &-title {
82 | font-size: 14px;
83 | color: @text-color;
84 | margin-left: 46px;
85 | }
86 |
87 | &-content {
88 | font-size: 12px;
89 | color: fade(@text-color, 75);
90 | margin-left: 46px;
91 | }
92 | }
93 | }
94 | }
95 |
96 | @media screen and (max-width: 767px) {
97 | .@{header3} {
98 | &-logo {
99 | z-index: 101;
100 | }
101 |
102 | &.home-page-wrapper .home-page {
103 | padding: 0 24px;
104 | }
105 |
106 | &-menu {
107 | height: auto;
108 | float: inherit;
109 | position: relative;
110 | left: -24px;
111 | width: ~"calc(100% + 48px)";
112 | opacity: 0;
113 | transition: opacity .3s @ease-in-out;
114 | background: #fff;
115 |
116 | & li {
117 | padding: 0 24px;
118 |
119 | &.ant-menu-submenu {
120 | padding: 0;
121 | }
122 | }
123 | .item {
124 | &-sub-item {
125 | padding: 8px 0;
126 | }
127 | }
128 | }
129 |
130 | &-mobile-menu {
131 | width: 16px;
132 | height: 14px;
133 | cursor: pointer;
134 | position: absolute;
135 | top: 24px;
136 | right: 24px;
137 | z-index: 100;
138 |
139 | em {
140 | display: block;
141 | width: 100%;
142 | height: 2px;
143 | background: @template-nav-bg-color;
144 | margin-top: 4px;
145 | transition: transform .3s @ease-in-out, opacity .3s @ease-in-out;
146 | }
147 |
148 | :first-child {
149 | margin-top: 0;
150 | }
151 | }
152 |
153 | .ant-menu {
154 | height: auto;
155 | overflow: hidden;
156 |
157 | .ant-menu-item-selected {
158 | border: none;
159 | }
160 | }
161 |
162 | & .open {
163 | height: auto;
164 |
165 | .@{header3}-mobile-menu {
166 | em {
167 | &:nth-child(1) {
168 | transform: translateY(6px) rotate(45deg);
169 | }
170 |
171 | &:nth-child(2) {
172 | opacity: 0;
173 | }
174 |
175 | &:nth-child(3) {
176 | transform: translateY(-6px) rotate(-45deg);
177 | }
178 | }
179 | }
180 |
181 | >.@{header3}-menu {
182 | opacity: 1;
183 | pointer-events: auto;
184 | }
185 | }
186 | &-item-block {
187 | height: 40px;
188 | line-height: 40px;
189 | }
190 | }
191 | }
192 |
--------------------------------------------------------------------------------
/src/Home/Nav3.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import TweenOne from 'rc-tween-one';
3 | import { Menu } from 'antd';
4 | import { getChildrenToRender } from './utils';
5 |
6 | const { Item, SubMenu } = Menu;
7 |
8 | class Header3 extends React.Component {
9 | constructor(props) {
10 | super(props);
11 | this.state = {
12 | phoneOpen: undefined,
13 | };
14 | }
15 |
16 | phoneClick = () => {
17 | const phoneOpen = !this.state.phoneOpen;
18 | this.setState({
19 | phoneOpen,
20 | });
21 | };
22 |
23 | render() {
24 | const { dataSource, isMobile, ...props } = this.props;
25 | const { phoneOpen } = this.state;
26 | const navData = dataSource.Menu.children;
27 | const navChildren = navData.map((item) => {
28 | const { children: a, subItem, ...itemProps } = item;
29 | if (subItem) {
30 | return (
31 |
39 | {a.children.map(getChildrenToRender)}
40 |
41 | }
42 | popupClassName="header3-item-child"
43 | >
44 | {subItem.map(($item, ii) => {
45 | const { children: childItem } = $item;
46 | const child = childItem.href ? (
47 |
48 | {childItem.children.map(getChildrenToRender)}
49 |
50 | ) : (
51 |
52 | {childItem.children.map(getChildrenToRender)}
53 |
54 | );
55 | return (
56 | -
57 | {child}
58 |
59 | );
60 | })}
61 |
62 | );
63 | }
64 | return (
65 | -
66 |
67 | {a.children.map(getChildrenToRender)}
68 |
69 |
70 | );
71 | });
72 | const moment = phoneOpen === undefined ? 300 : null;
73 | return (
74 |
80 |
84 |
88 |
89 |
90 | {isMobile && (
91 |
{
94 | this.phoneClick();
95 | }}
96 | >
97 |
98 |
99 |
100 |
101 | )}
102 |
{
111 | if (this.state.phoneOpen) {
112 | e.target.style.height = 'auto';
113 | }
114 | },
115 | ease: 'easeInOutQuad',
116 | }
117 | : null
118 | }
119 | moment={moment}
120 | reverse={!!phoneOpen}
121 | >
122 |
129 |
130 |
131 |
132 | );
133 | }
134 | }
135 |
136 | export default Header3;
137 |
--------------------------------------------------------------------------------
/src/serviceWorker.js:
--------------------------------------------------------------------------------
1 | // This optional code is used to register a service worker.
2 | // register() is not called by default.
3 |
4 | // This lets the app load faster on subsequent visits in production, and gives
5 | // it offline capabilities. However, it also means that developers (and users)
6 | // will only see deployed updates on subsequent visits to a page, after all the
7 | // existing tabs open on the page have been closed, since previously cached
8 | // resources are updated in the background.
9 |
10 | // To learn more about the benefits of this model and instructions on how to
11 | // opt-in, read http://bit.ly/CRA-PWA
12 |
13 | const isLocalhost = Boolean(
14 | window.location.hostname === 'localhost' ||
15 | // [::1] is the IPv6 localhost address.
16 | window.location.hostname === '[::1]' ||
17 | // 127.0.0.1/8 is considered localhost for IPv4.
18 | window.location.hostname.match(
19 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
20 | )
21 | );
22 |
23 | export function register(config) {
24 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
25 | // The URL constructor is available in all browsers that support SW.
26 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);
27 | if (publicUrl.origin !== window.location.origin) {
28 | // Our service worker won't work if PUBLIC_URL is on a different origin
29 | // from what our page is served on. This might happen if a CDN is used to
30 | // serve assets; see https://github.com/facebook/create-react-app/issues/2374
31 | return;
32 | }
33 |
34 | window.addEventListener('load', () => {
35 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
36 |
37 | if (isLocalhost) {
38 | // This is running on localhost. Let's check if a service worker still exists or not.
39 | checkValidServiceWorker(swUrl, config);
40 |
41 | // Add some additional logging to localhost, pointing developers to the
42 | // service worker/PWA documentation.
43 | navigator.serviceWorker.ready.then(() => {
44 | console.log(
45 | 'This web app is being served cache-first by a service ' +
46 | 'worker. To learn more, visit http://bit.ly/CRA-PWA'
47 | );
48 | });
49 | } else {
50 | // Is not localhost. Just register service worker
51 | registerValidSW(swUrl, config);
52 | }
53 | });
54 | }
55 | }
56 |
57 | function registerValidSW(swUrl, config) {
58 | navigator.serviceWorker
59 | .register(swUrl)
60 | .then(registration => {
61 | registration.onupdatefound = () => {
62 | const installingWorker = registration.installing;
63 | if (installingWorker == null) {
64 | return;
65 | }
66 | installingWorker.onstatechange = () => {
67 | if (installingWorker.state === 'installed') {
68 | if (navigator.serviceWorker.controller) {
69 | // At this point, the updated precached content has been fetched,
70 | // but the previous service worker will still serve the older
71 | // content until all client tabs are closed.
72 | console.log(
73 | 'New content is available and will be used when all ' +
74 | 'tabs for this page are closed. See http://bit.ly/CRA-PWA.'
75 | );
76 |
77 | // Execute callback
78 | if (config && config.onUpdate) {
79 | config.onUpdate(registration);
80 | }
81 | } else {
82 | // At this point, everything has been precached.
83 | // It's the perfect time to display a
84 | // "Content is cached for offline use." message.
85 | console.log('Content is cached for offline use.');
86 |
87 | // Execute callback
88 | if (config && config.onSuccess) {
89 | config.onSuccess(registration);
90 | }
91 | }
92 | }
93 | };
94 | };
95 | })
96 | .catch(error => {
97 | console.error('Error during service worker registration:', error);
98 | });
99 | }
100 |
101 | function checkValidServiceWorker(swUrl, config) {
102 | // Check if the service worker can be found. If it can't reload the page.
103 | fetch(swUrl)
104 | .then(response => {
105 | // Ensure service worker exists, and that we really are getting a JS file.
106 | const contentType = response.headers.get('content-type');
107 | if (
108 | response.status === 404 ||
109 | (contentType != null && contentType.indexOf('javascript') === -1)
110 | ) {
111 | // No service worker found. Probably a different app. Reload the page.
112 | navigator.serviceWorker.ready.then(registration => {
113 | registration.unregister().then(() => {
114 | window.location.reload();
115 | });
116 | });
117 | } else {
118 | // Service worker found. Proceed as normal.
119 | registerValidSW(swUrl, config);
120 | }
121 | })
122 | .catch(() => {
123 | console.log(
124 | 'No internet connection found. App is running in offline mode.'
125 | );
126 | });
127 | }
128 |
129 | export function unregister() {
130 | if ('serviceWorker' in navigator) {
131 | navigator.serviceWorker.ready.then(registration => {
132 | registration.unregister();
133 | });
134 | }
135 | }
136 |
--------------------------------------------------------------------------------
/src/Home/data.source.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | export const Nav30DataSource = {
3 | wrapper: { className: 'header3 home-page-wrapper' },
4 | page: { className: 'home-page' },
5 | logo: {
6 | className: 'header3-logo',
7 | children:
8 | 'https://gw.alipayobjects.com/zos/basement_prod/b30cdc2a-d91c-4c78-be9c-7c63b308d4b3.svg',
9 | },
10 | Menu: {
11 | className: 'header3-menu',
12 | children: [
13 | {
14 | name: 'item0',
15 | className: 'header3-item',
16 | children: {
17 | href: '#',
18 | children: [
19 | {
20 | children: (
21 |
22 | 网站首页
23 |
24 | ),
25 | name: 'text',
26 | },
27 | ],
28 | },
29 | },
30 | {
31 | name: 'item1',
32 | className: 'header3-item',
33 | children: {
34 | href: '#',
35 | children: [
36 | {
37 | children: (
38 |
39 | 公司简介
40 |
41 | ),
42 | name: 'text',
43 | },
44 | ],
45 | },
46 | },
47 | {
48 | name: 'item2',
49 | className: 'header3-item',
50 | children: {
51 | href: '#',
52 | children: [
53 | {
54 | children: (
55 |
56 | 回收项目
57 |
58 | ),
59 | name: 'text',
60 | },
61 | ],
62 | },
63 | },
64 | {
65 | name: 'item3',
66 | className: 'header3-item',
67 | children: {
68 | href: '#',
69 | children: [
70 | {
71 | children: (
72 |
73 | 成功案例
74 |
75 | ),
76 | name: 'text',
77 | },
78 | ],
79 | },
80 | },
81 | {
82 | name: 'item4',
83 | className: 'header3-item',
84 | children: {
85 | href: '#',
86 | children: [
87 | {
88 | children: (
89 |
90 |
91 |
92 |
93 |
94 | 新闻咨询
95 |
96 |
97 |
98 |
99 |
100 | ),
101 | name: 'text',
102 | },
103 | ],
104 | },
105 | },
106 | {
107 | name: 'item5',
108 | className: 'header3-item',
109 | children: {
110 | href: '#',
111 | children: [
112 | {
113 | children: (
114 |
115 |
116 |
117 | 在线留言
118 |
119 |
120 |
121 | ),
122 | name: 'text',
123 | },
124 | ],
125 | },
126 | },
127 | {
128 | name: 'item6',
129 | className: 'header3-item',
130 | children: {
131 | href: '#',
132 | children: [
133 | {
134 | children: (
135 |
136 |
137 |
138 | 联系我们
139 |
140 |
141 |
142 | ),
143 | name: 'text',
144 | },
145 | ],
146 | },
147 | },
148 | ],
149 | },
150 | mobileMenu: { className: 'header3-mobile-menu' },
151 | };
152 | export const Banner10DataSource = {
153 | wrapper: { className: 'banner1' },
154 | BannerAnim: {
155 | children: [
156 | {
157 | name: 'elem0',
158 | BannerElement: { className: 'banner-user-elem' },
159 | textWrapper: { className: 'banner1-text-wrapper' },
160 | bg: { className: 'bg bg0' },
161 | title: {
162 | className: 'banner1-title',
163 | children:
164 | 'https://zos.alipayobjects.com/rmsportal/HqnZZjBjWRbjyMr.png',
165 | },
166 | content: {
167 | className: 'banner1-content',
168 | children: '一个高效的页面动画解决方案',
169 | },
170 | button: { className: 'banner1-button', children: 'Learn More' },
171 | },
172 | {
173 | name: 'elem1',
174 | BannerElement: { className: 'banner-user-elem' },
175 | textWrapper: { className: 'banner1-text-wrapper' },
176 | bg: { className: 'bg bg1' },
177 | title: {
178 | className: 'banner1-title',
179 | children:
180 | 'https://zos.alipayobjects.com/rmsportal/HqnZZjBjWRbjyMr.png',
181 | },
182 | content: {
183 | className: 'banner1-content',
184 | children: '一个高效的页面动画解决方案',
185 | },
186 | button: { className: 'banner1-button', children: 'Learn More' },
187 | },
188 | {
189 | name: 'elem2',
190 | BannerElement: { className: 'banner-user-elem' },
191 | textWrapper: { className: 'banner1-text-wrapper' },
192 | bg: { className: 'bg bg1' },
193 | title: {
194 | className: 'banner1-title',
195 | children:
196 | 'https://zos.alipayobjects.com/rmsportal/HqnZZjBjWRbjyMr.png',
197 | },
198 | content: {
199 | className: 'banner1-content',
200 | children: '一个高效的页面动画解决方案',
201 | },
202 | button: { className: 'banner1-button', children: 'Learn More' },
203 | },
204 | ],
205 | },
206 | };
207 | export const Content00DataSource = {
208 | wrapper: { className: 'home-page-wrapper content0-wrapper' },
209 | page: { className: 'home-page content0' },
210 | OverPack: { playScale: 0.3, className: '' },
211 | titleWrapper: {
212 | className: 'title-wrapper',
213 | children: [
214 | {
215 | name: 'title',
216 | children: (
217 |
218 | 回收项目
219 |
220 | ),
221 | },
222 | ],
223 | },
224 | childWrapper: {
225 | className: 'content0-block-wrapper k9h76g7v2q-editor_css',
226 | children: [
227 | {
228 | name: 'block0',
229 | className: 'content0-block',
230 | md: 8,
231 | xs: 24,
232 | children: {
233 | className: 'content0-block-item',
234 | children: [
235 | {
236 | name: 'image',
237 | className: 'content0-block-icon',
238 | children:
239 | 'https://zos.alipayobjects.com/rmsportal/WBnVOjtIlGWbzyQivuyq.png',
240 | },
241 | {
242 | name: 'title',
243 | className: 'content0-block-title',
244 | children: (
245 |
246 |
247 |
248 | 电梯回收
249 |
250 |
251 |
252 | ),
253 | },
254 | {
255 | name: 'content',
256 | children: (
257 |
258 | Elevator recovery
259 |
260 | ),
261 | },
262 | ],
263 | },
264 | },
265 | {
266 | name: 'block1',
267 | className: 'content0-block',
268 | md: 8,
269 | xs: 24,
270 | children: {
271 | className: 'content0-block-item',
272 | children: [
273 | {
274 | name: 'image',
275 | className: 'content0-block-icon',
276 | children:
277 | 'https://zos.alipayobjects.com/rmsportal/YPMsLQuCEXtuEkmXTTdk.png',
278 | },
279 | {
280 | name: 'title',
281 | className: 'content0-block-title',
282 | children: (
283 |
284 | 铁铝铜回收
285 |
286 | ),
287 | },
288 | {
289 | name: 'content',
290 | children: (
291 |
292 |
293 |
294 | Iron copper recovery
295 |
296 |
297 |
298 | ),
299 | },
300 | ],
301 | },
302 | },
303 | {
304 | name: 'block2',
305 | className: 'content0-block',
306 | md: 8,
307 | xs: 24,
308 | children: {
309 | className: 'content0-block-item',
310 | children: [
311 | {
312 | name: 'image',
313 | className: 'content0-block-icon',
314 | children:
315 | 'https://zos.alipayobjects.com/rmsportal/EkXWVvAaFJKCzhMmQYiX.png',
316 | },
317 | {
318 | name: 'title',
319 | className: 'content0-block-title',
320 | children: (
321 |
322 | 不锈钢回收
323 |
324 | ),
325 | },
326 | {
327 | name: 'content',
328 | children: (
329 |
330 | Stainless steel recovery
331 |
332 | ),
333 | },
334 | ],
335 | },
336 | },
337 | {
338 | name: 'block3',
339 | className: 'content0-block',
340 | md: 8,
341 | xs: 24,
342 | children: {
343 | className: 'content0-block-item',
344 | children: [
345 | {
346 | name: 'image',
347 | className: 'content0-block-icon',
348 | children:
349 | 'https://zos.alipayobjects.com/rmsportal/EkXWVvAaFJKCzhMmQYiX.png',
350 | },
351 | {
352 | name: 'title',
353 | className: 'content0-block-title',
354 | children: (
355 |
356 |
357 | 工程拆除
358 |
359 |
360 | ),
361 | },
362 | {
363 | name: 'content',
364 | children: (
365 |
366 | Engineering dismantling
367 |
368 | ),
369 | },
370 | ],
371 | },
372 | },
373 | {
374 | name: 'block4',
375 | className: 'content0-block',
376 | md: 8,
377 | xs: 24,
378 | children: {
379 | className: 'content0-block-item',
380 | children: [
381 | {
382 | name: 'image',
383 | className: 'content0-block-icon',
384 | children:
385 | 'https://zos.alipayobjects.com/rmsportal/EkXWVvAaFJKCzhMmQYiX.png',
386 | },
387 | {
388 | name: 'title',
389 | className: 'content0-block-title',
390 | children: (
391 |
392 |
393 | 中央空调回收
394 |
395 |
396 | ),
397 | },
398 | {
399 | name: 'content',
400 | children: (
401 |
402 | Air conditioning recovery
403 |
404 | ),
405 | },
406 | ],
407 | },
408 | },
409 | ],
410 | },
411 | };
412 | export const Content50DataSource = {
413 | wrapper: { className: 'home-page-wrapper content5-wrapper' },
414 | page: { className: 'home-page content5' },
415 | OverPack: { playScale: 0.3, className: '' },
416 | titleWrapper: {
417 | className: 'title-wrapper',
418 | children: [
419 | {
420 | name: 'title',
421 | children: (
422 |
423 | 成功案例
424 |
425 | ),
426 | className: 'title-h1',
427 | },
428 | ],
429 | },
430 | block: {
431 | className: 'content5-img-wrapper',
432 | gutter: 16,
433 | children: [
434 | {
435 | name: 'block0',
436 | className: 'block',
437 | md: 6,
438 | xs: 24,
439 | children: {
440 | wrapper: { className: 'content5-block-content' },
441 | img: {
442 | children:
443 | 'https://t.alipayobjects.com/images/rmsweb/T11aVgXc4eXXXXXXXX.svg',
444 | },
445 | content: { children: 'Ant Design' },
446 | },
447 | },
448 | {
449 | name: 'block1',
450 | className: 'block',
451 | md: 6,
452 | xs: 24,
453 | children: {
454 | wrapper: { className: 'content5-block-content' },
455 | img: {
456 | children:
457 | 'https://zos.alipayobjects.com/rmsportal/faKjZtrmIbwJvVR.svg',
458 | },
459 | content: { children: 'Ant Motion' },
460 | },
461 | },
462 | {
463 | name: 'block2',
464 | className: 'block',
465 | md: 6,
466 | xs: 24,
467 | children: {
468 | wrapper: { className: 'content5-block-content' },
469 | img: {
470 | children:
471 | 'https://t.alipayobjects.com/images/rmsweb/T11aVgXc4eXXXXXXXX.svg',
472 | },
473 | content: { children: 'Ant Design' },
474 | },
475 | },
476 | {
477 | name: 'block3',
478 | className: 'block',
479 | md: 6,
480 | xs: 24,
481 | children: {
482 | wrapper: { className: 'content5-block-content' },
483 | img: {
484 | children:
485 | 'https://zos.alipayobjects.com/rmsportal/faKjZtrmIbwJvVR.svg',
486 | },
487 | content: { children: 'Ant Motion' },
488 | },
489 | },
490 | {
491 | name: 'block4',
492 | className: 'block',
493 | md: 6,
494 | xs: 24,
495 | children: {
496 | wrapper: { className: 'content5-block-content' },
497 | img: {
498 | children:
499 | 'https://t.alipayobjects.com/images/rmsweb/T11aVgXc4eXXXXXXXX.svg',
500 | },
501 | content: { children: 'Ant Design' },
502 | },
503 | },
504 | {
505 | name: 'block5',
506 | className: 'block',
507 | md: 6,
508 | xs: 24,
509 | children: {
510 | wrapper: { className: 'content5-block-content' },
511 | img: {
512 | children:
513 | 'https://zos.alipayobjects.com/rmsportal/faKjZtrmIbwJvVR.svg',
514 | },
515 | content: { children: 'Ant Motion' },
516 | },
517 | },
518 | {
519 | name: 'block6',
520 | className: 'block',
521 | md: 6,
522 | xs: 24,
523 | children: {
524 | wrapper: { className: 'content5-block-content' },
525 | img: {
526 | children:
527 | 'https://t.alipayobjects.com/images/rmsweb/T11aVgXc4eXXXXXXXX.svg',
528 | },
529 | content: { children: 'Ant Design' },
530 | },
531 | },
532 | {
533 | name: 'block7',
534 | className: 'block',
535 | md: 6,
536 | xs: 24,
537 | children: {
538 | wrapper: { className: 'content5-block-content' },
539 | img: {
540 | children:
541 | 'https://zos.alipayobjects.com/rmsportal/faKjZtrmIbwJvVR.svg',
542 | },
543 | content: { children: 'Ant Motion' },
544 | },
545 | },
546 | ],
547 | },
548 | };
549 | export const Content30DataSource = {
550 | wrapper: { className: 'home-page-wrapper content3-wrapper' },
551 | page: { className: 'home-page content3' },
552 | OverPack: { playScale: 0.3 },
553 | titleWrapper: {
554 | className: 'title-wrapper',
555 | children: [
556 | {
557 | name: 'title',
558 | children: (
559 |
560 | 公司简介
561 |
562 | ),
563 | className: 'title-h1',
564 | },
565 | {
566 | name: 'content',
567 | className: 'title-content',
568 | children: (
569 |
570 |
571 |
572 | 苏州子浩物资回收有限公司
573 |
574 |
575 |
576 | ),
577 | },
578 | ],
579 | },
580 | block: {
581 | className: 'content3-block-wrapper',
582 | children: [
583 | {
584 | name: 'block0',
585 | className: 'content3-block',
586 | md: 12,
587 | xs: 24,
588 | children: {
589 | icon: {
590 | className: 'content3-icon',
591 | children:
592 | 'https://zos.alipayobjects.com/rmsportal/ScHBSdwpTkAHZkJ.png',
593 | },
594 | textWrapper: { className: 'content3-text' },
595 | title: {
596 | className: 'content3-title',
597 | children: (
598 |
599 |
600 |
601 | 回收项目
602 |
603 |
604 |
605 | ),
606 | },
607 | content: {
608 | className: 'content3-content',
609 | children: (
610 |
611 |
612 | 电梯回收,中央空调回收,废旧物资回收,机械设备回收,厨房、宾馆设备等。
613 |
614 |
615 | ),
616 | },
617 | },
618 | },
619 | {
620 | name: 'block1',
621 | className: 'content3-block',
622 | md: 12,
623 | xs: 24,
624 | children: {
625 | icon: {
626 | className: 'content3-icon',
627 | children:
628 | 'https://zos.alipayobjects.com/rmsportal/NKBELAOuuKbofDD.png',
629 | },
630 | textWrapper: { className: 'content3-text' },
631 | title: {
632 | className: 'content3-title',
633 | children: (
634 |
635 | 企业精神
636 |
637 | ),
638 | },
639 | content: {
640 | className: 'content3-content',
641 | children: (
642 |
643 | 开拓进取、锐意创新、刻意求真、崇尚完美。
644 |
645 | ),
646 | },
647 | },
648 | },
649 | {
650 | name: 'block2',
651 | className: 'content3-block',
652 | md: 12,
653 | xs: 24,
654 | children: {
655 | icon: {
656 | className: 'content3-icon',
657 | children:
658 | 'https://zos.alipayobjects.com/rmsportal/xMSBjgxBhKfyMWX.png',
659 | },
660 | textWrapper: { className: 'content3-text' },
661 | title: {
662 | className: 'content3-title',
663 | children: (
664 |
665 | 服务宗旨
666 |
667 | ),
668 | },
669 | content: {
670 | className: 'content3-content',
671 | children: (
672 |
673 | 价格合理、信守承诺、安全快捷 、高效。
674 |
675 | ),
676 | },
677 | },
678 | },
679 | {
680 | name: 'block3',
681 | className: 'content3-block',
682 | md: 12,
683 | xs: 24,
684 | children: {
685 | icon: {
686 | className: 'content3-icon',
687 | children:
688 | 'https://zos.alipayobjects.com/rmsportal/MNdlBNhmDBLuzqp.png',
689 | },
690 | textWrapper: { className: 'content3-text' },
691 | title: {
692 | className: 'content3-title',
693 | children: (
694 |
695 |
696 | 企业原则
697 |
698 |
699 | ),
700 | },
701 | content: {
702 | className: 'content3-content',
703 | children: (
704 |
705 |
706 | 讲诚信、以信誉求发展。
707 | 议、指导。前进中的望月将会在不断变化的各种客观条件下,把握市场动向,熟悉市场环境,完善的饰后服务,让客户真正感受到望月,热情、真诚、诚信的全方位服务。
708 |
709 |
710 | ),
711 | },
712 | },
713 | },
714 | ],
715 | },
716 | };
717 | export const Feature50DataSource = {
718 | wrapper: { className: 'home-page-wrapper content7-wrapper' },
719 | page: { className: 'home-page content7' },
720 | OverPack: {},
721 | titleWrapper: {
722 | className: 'title-wrapper',
723 | children: [
724 | {
725 | name: 'title',
726 | children: (
727 |
728 | 新闻资讯
729 |
730 | ),
731 | className: 'title-h1',
732 | },
733 | ],
734 | },
735 | tabsWrapper: { className: 'content7-tabs-wrapper' },
736 | block: {
737 | children: [
738 | {
739 | name: 'block0',
740 | tag: {
741 | className: 'content7-tag',
742 | text: {
743 | children: (
744 |
745 | 公司新闻
746 |
747 | ),
748 | className: 'content7-tag-name',
749 | },
750 | icon: { children: 'mobile' },
751 | },
752 | content: {
753 | className: 'content7-content',
754 | text: {
755 | className: 'content7-text',
756 | md: 14,
757 | xs: 24,
758 | children: (
759 |
760 | 技术
761 |
762 | 丰富的技术组件,简单组装即可快速搭建金融级应用,丰富的技术组件,简单组装即可快速搭建金融级应用。
763 |
764 |
765 | 融合
766 |
767 | 解放业务及技术生产力,推动金融服务底层创新,推动金融服务底层创新。解放业务及技术生产力,推动金融服务底层创新。
768 |
769 |
770 |
771 | 开放
772 |
符合金融及要求的安全可靠、高可用、高性能的服务能力,符合金融及要求的安全可靠、高可用、高性能的服务能力。
773 |
774 | ),
775 | },
776 | img: {
777 | className: 'content7-img',
778 | children:
779 | 'https://zos.alipayobjects.com/rmsportal/xBrUaDROgtFBRRL.png',
780 | md: 10,
781 | xs: 24,
782 | },
783 | },
784 | },
785 | {
786 | name: 'block1',
787 | tag: {
788 | className: 'content7-tag',
789 | icon: { children: 'tablet' },
790 | text: {
791 | className: 'content7-tag-name',
792 | children: (
793 |
794 | 行业新闻
795 |
796 | ),
797 | },
798 | },
799 | content: {
800 | className: 'content7-content',
801 | text: {
802 | className: 'content7-text',
803 | md: 14,
804 | xs: 24,
805 | children: (
806 |
807 | 技术
808 |
809 | 丰富的技术组件,简单组装即可快速搭建金融级应用,丰富的技术组件,简单组装即可快速搭建金融级应用。
810 |
811 |
812 | 融合
813 |
814 | 解放业务及技术生产力,推动金融服务底层创新,推动金融服务底层创新。解放业务及技术生产力,推动金融服务底层创新。
815 |
816 |
817 |
818 | 开放
819 |
符合金融及要求的安全可靠、高可用、高性能的服务能力,符合金融及要求的安全可靠、高可用、高性能的服务能力。
820 |
821 | ),
822 | },
823 | img: {
824 | className: 'content7-img',
825 | md: 10,
826 | xs: 24,
827 | children:
828 | 'https://zos.alipayobjects.com/rmsportal/xBrUaDROgtFBRRL.png',
829 | },
830 | },
831 | },
832 | ],
833 | },
834 | };
835 | export const Footer10DataSource = {
836 | wrapper: { className: 'home-page-wrapper footer1-wrapper' },
837 | OverPack: { className: 'footer1', playScale: 0.2 },
838 | block: {
839 | className: 'home-page',
840 | gutter: 0,
841 | children: [
842 | {
843 | name: 'block0',
844 | xs: 24,
845 | md: 6,
846 | className: 'block',
847 | title: {
848 | className: 'logo',
849 | children:
850 | 'https://zos.alipayobjects.com/rmsportal/qqaimmXZVSwAhpL.svg',
851 | },
852 | childWrapper: {
853 | className: 'slogan',
854 | children: [
855 | {
856 | name: 'content0',
857 | children: 'Animation specification and components of Ant Design.',
858 | },
859 | ],
860 | },
861 | },
862 | {
863 | name: 'block1',
864 | xs: 24,
865 | md: 6,
866 | className: 'block',
867 | title: {
868 | children: (
869 |
870 | 回收项目
871 |
872 | ),
873 | },
874 | childWrapper: {
875 | children: [
876 | {
877 | name: 'link0',
878 | href: '#',
879 | children: (
880 |
881 |
882 |
883 | 电梯回收
884 |
885 |
886 |
887 | ),
888 | },
889 | {
890 | name: 'link1',
891 | href: '#',
892 | children: (
893 |
894 | 铁铝铜回收
895 |
896 | ),
897 | },
898 | {
899 | name: 'link2',
900 | href: '#',
901 | children: (
902 |
903 | 不锈钢回收
904 |
905 | ),
906 | },
907 | {
908 | name: 'link3',
909 | href: '#',
910 | children: (
911 |
912 | 工程拆除
913 |
914 | ),
915 | },
916 | {
917 | name: 'link4',
918 | href: '#',
919 | children: (
920 |
921 | 中央空调回收
922 |
923 | ),
924 | },
925 | ],
926 | },
927 | },
928 | {
929 | name: 'block2',
930 | xs: 24,
931 | md: 6,
932 | className: 'block',
933 | title: { children: '关于' },
934 | childWrapper: {
935 | children: [
936 | { href: '#', name: 'link0', children: 'FAQ' },
937 | { href: '#', name: 'link1', children: '联系我们' },
938 | ],
939 | },
940 | },
941 | {
942 | name: 'block3',
943 | xs: 24,
944 | md: 6,
945 | className: 'block',
946 | title: {
947 | children: (
948 |
949 |
950 | 关注我们
951 |
952 |
953 | ),
954 | className: 'k9h7k134cu-editor_css',
955 | },
956 | childWrapper: {
957 | children: [
958 | {
959 | name: 'image~k9h7il8htc6',
960 | className: 'k9h7irl6jgj-editor_css',
961 | children:
962 | 'https://zos.alipayobjects.com/rmsportal/HzvPfCGNCtvGrdk.png',
963 | },
964 | ],
965 | },
966 | },
967 | ],
968 | },
969 | copyrightWrapper: { className: 'copyright-wrapper' },
970 | copyrightPage: { className: 'home-page' },
971 | copyright: {
972 | className: 'copyright',
973 | children: (
974 |
975 | ©2018 by Ant Motion All Rights
976 | Reserved
977 |
978 | ),
979 | },
980 | };
981 |
--------------------------------------------------------------------------------