简单造轮子代码

2020-04-09  本文已影响0人  学的会的前端

Tabs组件

// CSS部分
.tabs {}
.tabs>ol{
  list-style: none;
  padding: 0;
  margin: 0;
}
.tabs>ol.tabs-bar{
  border-bottom: 1px solid red;
  display: flex;
}
.tabs>ol.tabs-bar li{
  padding: 4px 8px;
  border: 1px solid transparent;
  border-bottom: none;
}
.tabs>ol.tabs-bar li:hover {
  border: 1px solid red;
}
.tabs>ol.tabs-bar li.active {
  border: 1px solid blue;
}
.tabs>ol.tabs-content li{
  display: none;
}
.tabs>ol.tabs-content li.active {
  display: block;
}

//JavaScript部分
class Tabs{
  constructor(selector){
    this.element = $(selector)
    this.init()
    this.bindEvents()
  }
  init(){
      this.element.each(function(i,e){
        $(e).children('.tabs-bar').children('li').eq(0).addClass('active')
        $(e).children('.tabs-content').children('li').eq(0).addClass('active')
      })
  }
  bindEvents(){
    this.element.on('click','.tabs-bar>li',function(e){  
      let $li = $(e.currentTarget)
      $li.addClass('active').siblings().removeClass('active')
      let $index = $li.index()
      let $content = $li.closest('.tabs').find('.tabs-content>li').eq($index)
      $content.addClass('active').siblings().removeClass('active')
    })
  }
}
var tab = new Tabs('.tabs')

// HTML部分
 <div class = "tabs">
    <ol class = "tabs-bar">
      <li>1</li>
      <li>2</li>
      <li>3</li>
    </ol>

    <ol class = "tabs-content">
      <li>content1</li>
      <li>content2</li>
      <li>content3</li>
    </ol>
  </div>
  <div class = "tabs">
    <ol class = "tabs-bar">
      <li>1</li>
      <li>2</li>
      <li>3</li>
    </ol>

    <ol class = "tabs-content">
      <li>content1</li>
      <li>content2</li>
      <li>content3</li>
    </ol>
  </div>
  <script src="https://code.jquery.com/jquery-2.1.4.js"></script>

Sticky组件

//CSS部分

*{margin: 0; padding: 0}
#topbar{
  background: green;
  height: 60px;
  text-align: center;
  color: #fff;
}
.topbarPlaceholder{
  height: 60px;
}
#topbar.sticky{
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  opacity: 0.5;
}

main{
  height: 800px;
  background: #ddd;
}
button.sticky{
  position: fixed;
  top: 60px;
  left: 0;
}

//JavaScript部分

class Sticky{
  constructor(selector,n){
    this.elements = $(selector)
    this.offset = n || 0
    this.placeholder()
    this.cacheOffset()
    this.listenOffset()
  }
  placeholder(){
    this.elements.each((index,element) => {
      let $wrapper = $('<div class = "topbarPlaceholder"></div>')
      $(element).wrap($wrapper)
      $(element).parent().height($(element).outerHeight())
    })
  }
  cacheOffset(){
    this.offsets = []
    this.elements.each((index,element) => {  
      this.offsets[index] = $(element).offset()
    })
  }
  listenOffset(){
    $(window).on('scroll',() => {
      let scrollY = window.scrollY
      this.elements.each((index,element) => {
        if(scrollY + this.offset > this.offsets[index].top){
          $(element).addClass('sticky')
        }else {
          $(element).removeClass('sticky')
        }
      })
    })
  }
}

new Sticky('#topbar')
new Sticky('button',60)


//HTML部分

 <div id = "topbar">
      topbar
    </div>
  
 
  <main>
    主要内容
    <P>段落1</p>
    <P>段落2</p>
    <P>段落3</p>
    <P>段落4</p>
    <P>段落5</p>
    <P>段落6</p>
    <P>段落7</p>
    <P>段落8</p>
    <P>段落9</p>
    <P>段落10</p>
    <button>黏住的按钮</button>
    <p>段落11</p>
  </main>
<script src="https://code.jquery.com/jquery-2.1.4.js"></script>

Dialog组件

//CSS部分
.frankDialog{
  background: rgba(0,0,0,0.5);
  position: fixed;
  top:0;
  left: 0;
  width: 100%;
  height: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}
.frankDialog-wrapper{
  background: #fff;
  padding: 20px;
  min-width: 200px;
}
.frankDialog-header {
  border-bottom: 1px solid red;
}
.frankDialog-main {
  padding-top: 10px;
  padding-bottom: 10px;
}
.frankDialog-footer {
  text-align: right;
}
.frankDialog-footer button {
  margin-left: 10px;
}

.frankDialog{
  z-index: 100
}

//JavaScript部分

class Dialog {
  constructor(options) {
    this.options = options
    this.init()
  }
  get template() {
    let {
      title, content
    } = this.options
    return `
      <div class="frankDialog">
        <div class="frankDialog-wrapper">
          <header class="frankDialog-header">${title}</header>
          <main class="frankDialog-main">${content}</main>
          <footer class="frankDialog-footer"></footer>
        </div>
      </div>
    `
  }
  generateButtons(){
    let { buttons } = this.options
    let $buttons = buttons.map((buttonOption) => {
      let $b = $('<button></button>')
      $b.text(buttonOption.text)
      $b.on('click', buttonOption.action)
      return $b
    })
    return $buttons
  }
  init() {
    var $dialog = $(this.template)
    $dialog.find('footer').append(this.generateButtons())
    $dialog.addClass(this.options.className)
    this.$dialog = $dialog
  }
  open() {
    this.$dialog.appendTo('body')
  }
  close() {
    this.$dialog.detach()
  }
}

////////////////////




x.onclick = function() {
  var dialog = new Dialog({
    title: '标题',
    content: '<b>欢迎</b>',
    className: 'userDialog',
    buttons: [{
      text: '确定',
      action: function() {
        setTimeout(() => {
          dialog.close()
        }, 3000)
      }
    }, {
      text: '取消',
      action: function() {
        dialog.close()
      }
    }, ]
  })
  dialog.open()
}

Suggestion组件

//CSS部分

.frankSuggestion{
  position: relative;
  border: 1px solid red;
  display: inline-block;
}
.frankSuggestion-loading{
  position: absolute;
  top: 100%;
  left: 0;
  display: none;
}
.frankSuggestion.loading .frankSuggestion-loading{
  display: block;
}

.frankSuggestion-list{
  position: absolute;
  border: 1px solid green;
  top: 100%;
  left: 0;
  margin: 0;
  padding: 0;
  list-style: none;
  width: 100%;
}
.frankSuggestion.loading .frankSuggestion-list{
  display: none;
}
.frankSuggestion.empty  .frankSuggestion-empty{
  display: block;
}
.frankSuggestion-empty{
  display: none;
}



//JavaScript部分
class Suggestion {
  constructor(options) {
    this.options = options
    this.$input = $(options.input)
    this.$input.wrap('<div class="frankSuggestion"></div>')
    this.$wrapper = this.$input.parent()

    this.$ol = $('<ol class="frankSuggestion-list"></ol>')
    this.$input.after(this.$ol)
    this.$loading = $('<div class="frankSuggestion-loading"></div>')
    this.$loading.html(this.options.loadingTemplate)
    this.$empty = $('<div class="frankSuggestion-empty"></div>')
    this.$empty.html(this.options.emptyTemplate)

    this.$ol.after(this.$loading)
    this.$ol.after(this.$empty)
    this.bindEvents()
  }
  bindEvents() {
    //  let timerId
    let lazySearch = _.debounce(this.search.bind(this), 300);
    this.$input.on('input', (e) => {
      //      if (timerId) {
      //        window.clearTimeout(timerId)
      //      }
      //      timerId = setTimeout(() => {
      //         this.search(e.currentTarget.value)
      //         timerId = undefined
      //      }, 1000)
      lazySearch(e.currentTarget.value)
    })
    
    this.$ol.on('click', 'li', (e)=>{
      this.$input.val($(e.currentTarget).text())
    })
  }
  search(keyword) {
    this.$wrapper.addClass('loading')
    this.$wrapper.removeClass('empty')
    this.options.search(keyword, (array) => {
      this.$ol.empty()
      this.$wrapper.removeClass('loading')
      
      if (!array || array.length === 0) {
        this.$wrapper.addClass('empty')
        return
      }
      
      
      array.forEach((text) => {
        this.$ol.append($('<li></li>').text(text))
      })
    })
  }

}

////////////////

var s = new Suggestion({
  input: 'input',
  search: function(text, callback) {
    if (text === '0') {
      return setTimeout(()=>callback([]), 500)
    }
    let array = []
    for (let i = 0; i < 5; i++) {
      var n = parseInt(Math.random() * 100, 10)
      array.push(text + n)
    }
    setTimeout(() => callback(array), 500)

  },
  loadingTemplate: '加载中',
  emptyTemplate: '找不到啊找不到'
})
上一篇 下一篇

猜你喜欢

热点阅读