1.0.2 • Published 1 year ago

ray-blend-tools v1.0.2

Weekly downloads
-
License
MIT
Repository
-
Last release
1 year ago

ray-blend-tools

animate

author

ilex.h

install

npm install --save ray-blend-tools

Usage

<div id="dg-container" data-gallery="gallery" class="dg-container ">
  <div class="dg-wrapper">
    <div className="sub-system-item">
      <img src="" alt="" />
    </div>
  </div>
  <nav>
    <span class="dg-prev" />
    <span class="dg-next" />
  </nav>
</div>
import { Gallery } from 'ray-blend-tools';

const gallery = Gallery(document.getElementById('dg-container'));

// ...

use with react

entry index.js

import React from 'react';
import { render } from 'react-dom';
import App from './App';
import './index.scss';

render(<App />, document.getElementById('app'));

// 开发模式下开启 热加载 (不需要开启时,屏蔽一下代码即可)
if (module.hot) {
  module.hot.accept();
}

app demo

import React, { Component } from 'react';
import SubSystem from './SubSystemGallery';
import PageNav from './PageNav';

const _sysList = [
  { key: 'onePage', index: 0, text: '模块1', url: '', isSelfPage: false },
  { key: 'digitalPlan', index: 1, text: '模块2', url: '', isSelfPage: false },
  { key: 'giot', index: 2, text: '物联网云平台', url: '', isSelfPage: false },
  { key: 'analysis', index: 3, text: '大数据分析平台', url: '', isSelfPage: false },
  { key: 'dispatch', index: 4, text: '模块3', url: '', isSelfPage: false }
];

class Content extends Component {

  constructor(props) {
    super(props);
    this.state = {
      currentSys: 2
    };
  }

  onSysLineItemClick = ({ key, index }) => {
    this.setState({
      currentSys: index
    });
  }

  changeCurrentSys = ({ key, index }) => {
    this.setState({
      currentSys: index
    });
  }

  nextSys = (gallery = {}) => {
    this.setState({
      currentSys: gallery.current || 0
    });
  }

  prevSys = (gallery = {}) => {
    this.setState({
      currentSys: gallery.current || 0
    });
  }

  render() {

    const { currentSys } = this.state;

    return (
      <div className="ue-content">
        <SubSystem
          sysList={_sysList}
          currentSys={currentSys}
          changeCurrentSys={this.changeCurrentSys}
          nextSys={this.nextSys}
          prevSys={this.prevSys}
        />
        <PageNav onItemClick={this.onSysLineItemClick} sysList={_sysList} currentSys={currentSys} />
      </div>
    );
  }
}

Content.propTypes = {

};

export default Content;

import React, { Component } from 'react';
import PropTypes from 'prop-types';

class PageNav extends Component {
  render() {
    const { sysList, onItemClick, currentSys } = this.props;
    return (
      <div className="page-nav">
        {sysList.map(d => {
          const cls = d.index === currentSys ? 'page-nav-item page-nav-item-active' : 'page-nav-item';
          return <span key={d.key} className={cls} onClick={() => onItemClick(d)}>{d.text}</span>;
        })}
      </div>
    );
  }
}

PageNav.propTypes = {
  sysList: PropTypes.array,
  onItemClick: PropTypes.func,
  currentSys: PropTypes.number
};

export default PageNav;


import React, { Component } from 'react';
import PropTypes from 'prop-types';

import { Gallery } from 'ray-blend-tools';

const completeSubImgIcon = (icon) => {
  return `/example/resources/${icon}.png`;
};

class SubSystemGallery extends Component {

  constructor(props) {
    super(props);
  }

  componentDidMount() {
    const { currentSys, nextSys, prevSys } = this.props;
    this.gallery = new Gallery(this.container, {
      current: currentSys, // index of current item
      autoplay: false, // slideshow on / off
      interval: 2000, // time between transitions
      next: nextSys,
      prev: prevSys
    });
  }

  componentDidUpdate(prevProps, prevState) {
    if (prevProps.currentSys !== this.props.currentSys){
      this.gallery.goPage(this.props.currentSys);
    }
  }

  componentWillUnmount() {
    this.gallery.destroy();
  }

  onItemClick = (sysItem) => {
    const { changeCurrentSys, currentSys } = this.props;
    const { key, index, url, isSelfPage } = sysItem;
    if (currentSys === key || currentSys === index){
      // window.open(url, '_blank');
      // window.open(url);
      if (isSelfPage){
        window.open(url, '_self');
      } else {
        window.open(url);
      }
    } else {
      changeCurrentSys && changeCurrentSys(sysItem);
    }
  }

  renderItem = (sysItem) => {
    const { key } = sysItem;
    const imgSrc = completeSubImgIcon(key);
    return (
      <div key={key} className="sub-system-item sub-sys-right" onClick={() => this.onItemClick(sysItem)}>
        <img src={imgSrc} alt="" />
      </div>
    );
  }

  renderContent = () => {
    const { sysList } = this.props;
    return sysList.map(sl => this.renderItem(sl));
  }

  render() {

    return (
      <div id="dg-container" data-gallery="gallery" className="dg-container sub-system" ref={node => this.container = node}>
        <div className="dg-wrapper">
          {this.renderContent()}
        </div>
        <nav>
          <span className="dg-prev" />
          <span className="dg-next" />
        </nav>
      </div>
    );
  }
}

SubSystemGallery.propTypes = {
  sysList: PropTypes.array,
  currentSys: PropTypes.oneOfType([
    PropTypes.string,
    PropTypes.number
  ]),
  changeCurrentSys: PropTypes.func,
  nextSys: PropTypes.func,
  prevSys: PropTypes.func
};

export default SubSystemGallery;

scss index.scss gallery.scss

@import './gallery.scss';

html,
body {
  width: 100%;
  height: 100%;
  padding: 0;
  margin: 0;
}

#app {
  width: 100%;
  height: 100%;
}

.ue-content {
  display: flex;
  height: 80%;
  flex: 1;
  background: #f6f6f6;
  flex-direction: column;

  .sub-system {
    flex: 1;
    display: flex;
    align-items: center;
    justify-content: center;

    .sub-system-item {
      position: absolute;

      img {
        width: 50rem;
      }
    }
  }
}

.page-nav {
  font-size: 18px;
  text-align: center;

  &-item {
    display: inline-block;
    padding: 0.5rem;
    margin: 1rem;
    cursor: pointer;
    background: #bad8ff;

    &.page-nav-item-active {
      color: white;
      background: #2382fd;
    }
  }
}

// galleray.scss

.dg-container {
  position: relative;
  width: 100%;
  height: 450px;
}

.dg-wrapper {
  position: relative;
  display: flex;
  width: 100%;
  height: 100%;
  margin: 0 auto;
  transform-style: preserve-3d;
  perspective: 1000px;
  align-items: center;
  justify-content: center;
}

.dg-wrapper div.dg-transition {
  transition: all 0.5s ease-in-out;
}

.dg-wrapper a.dg-transition {
  transition: all 0.5s ease-in-out;
}

.dg-wrapper a img {
  display: block;
  padding: 41px 0 0 1px;
}

.dg-container {
  nav {
    position: absolute;
    bottom: 20px;
    left: 50%;
    z-index: 1000;
    width: 58px;
    margin-left: -29px;

    span {
      float: left;
      width: 26px;
      height: 26px;
      text-indent: -9000px;
      cursor: pointer;
      opacity: 0.8;

      &.dg-prev {
        background: transparent url('./resources/arrow-left.png') no-repeat;
      }

      &.dg-next {
        background: transparent url('./resources/arrow-right.png') no-repeat;
      }

      &:hover {
        opacity: 1;

        &.dg-prev {
          background: transparent url('./resources/arrow-left-active.png') no-repeat;
        }

        &.dg-next {
          background: transparent url('./resources/arrow-right-active.png') no-repeat;
        }
      }
    }
  }
}

api

options:

showTotal: 3,
current: 0, // index of current item
autoplay: false, // slideshow on / off
interval: 2000 // time between transitions
prev: func
next: func

method:

destroy
goPage

License

MIT

1.0.2

1 year ago

1.0.1

1 year ago