1. ホーム
  2. Web制作
  3. HTML/Xhtml

HTMLドラッグ&ドロップコード

2022-01-21 02:45:02

vueをベースとした

この機能のコアとなるアイデアは、JavaScript コードによってページ上のノードの左と上のマージンを制御することであり、異なるスタイルのポジショニングのための異なるソリューションが存在する

このソリューションでは import turtle as T import random import time # Draw the trunk of the cherry blossom(60,t) def Tree(branch, t): time.sleep(0.0005) if branch > 3: if 8 <= branch <= 12: if random.randint(0, 2) == 0: t.color('snow') # white else: t.color('lightcoral') # light coral t.pensize(branch / 3) elif branch < 8: if random.randint(0, 1) == 0: t.color('snow') else: t.color('lightcoral') # light coral t.pensize(branch / 2) else: t.color('sienna') # ochre (zhě) t.pensize(branch / 10) # 6 t.forward(branch) a = 1.5 * random.random() t.right(20 * a) b = 1.5 * random.random() Tree(branch - 10 * b, t) t.left(40 * a) Tree(branch - 10 * b, t) t.right(20 * a) t.up() t.backward(branch) t.down() # Falling petals def Petal(m, t): for i in range(m): a = 200 - 400 * random.random() b = 10 - 20 * random.random() t.up() t.forward(b) t.left(90) t.forward(a) t.down() t.color('lightcoral') # light coral t.circle(1) t.up() t.backward(a) t.right(90) t.backward(b) # Drawing area t = T.Turtle() # Canvas size w = T.Screen() t.hideturtle() # Hide the brush t.getscreen().tracer(5, 0) w.screensize(bg='wheat') # wheat wheat t.left(90) t.up() t.backward(150) t.down() t.color('sienna') # Draw the torso of a cherry blossom Tree(60, t) # Falling petals Petal(200, t) w.exitonclick() 位置決め方法の解答

css スタイルのコアとなるコード

from turtle import *
from random import *
from math import *

def tree(n,l):
    pd()#downstroke
    # shading effect
    t = cos(radians(shading()+45))/8+0.25
    pencolor(t,t,t)
    pensize(n/3)
    forward(l)#draw the branch

    if n>0:
        b = random()*15+10 #right branch deflection angle
        c = random()*15+10 #left branch deflection angle
        d = l*(random()*0.25+0.7) #the length of the next branch
        # right angle, draw right branch
        right(b)
        tree(n-1,d)
        #Turn left by a certain angle and draw the left branch
        left(b+c)
        tree(n-1,d)
        #Turn back
        right(c)
    else:
        #draw the leaves
        right(90)
        n=cos(radians(drawing()-45))/4+0.5
        pencolor(n,n*0.8,n*0.8)
        circle(3)
        left(90)
        #Add 0.3 times the number of falling leaves
        if(random()>0.7):
            pu()
            #drift down
            t = heading()
            an = -40 +random()*40
            setheading(an)
            dis = int(800*random()*0.5 + 400*random()*0.3 + 200*random()*0.2)
            forward(dis)
            setheading(t)
            #draw the leaves
            pd()
            right(90)
            n = cos(radians(heading()-45))/4+0.5
            pencolor(n*0.5+0.5,0.4+n*0.4,0.4+n*0.4)
            circle(2)
            left(90)
            pu()
            # return
            t=heading()
            setheading(an)
            backward(dis)
            setheading(t)
    pu()
    backward(l)#return

bgcolor(0.5,0.5,0.5)#background color
ht()#hide turtle
speed(0)#speed 1-10 progressive, 0 fastest
tracer(0,0)
pu()#raise pen
backward(100)
left(90)#turn left 90 degrees
pu()#raise pen
backward(300)#backward300
tree(12,100)#recursive 7 levels
done()


from turtle import *
from random import *
from math import *

def tree(n, l):
    pd()
    t = cos(radians(heading() + 45)) / 8 + 0.25
    pencolor(t, t, t)
    pensize(n / 4)
    forward(l)
    if n > 0:
        b = random() * 15 + 10
        c = random() * 15 + 10
        d = l * (random() * 0.35 + 0.6)
        right(b)
        tree(n - 1, d)
        left(b + c)
        tree(n - 1, d)
        right(c)
    else:
        right(90)
        n = cos(radians(heading() - 45)) / 4 + 0.5
        pencolor(n, n, n)
        circle(2)
        left(90)
    pu()
    backward(l)
bgcolor(0.5, 0.5, 0.5)
ht()
speed(0)
tracer(0, 0)
left(90)
pu()
backward(300)
tree(13, 100)
done()


親コンテナは、以下のように変換されます。 from turtle import * importiere Zeit setup(1000,800,0,0) speed(0) penup() seth(90) fd(340) seth(0) pendown() Geschwindigkeit(5) begin_fill() fillcolor('rot') kreis(50,30) for i in range(10): fd(1) links(10) kreis(40,40) for i in range(6): fd(1) links(3) Kreis(80,40) for i in range(20): fd(0.5) links(5) Kreis(80,45) for i in range(10): fd(2) links(1) Kreis(80,25) for i in range(20): fd(1) links(4) Kreis(50,50) time.sleep(0.1) kreis(120,55) speed(0) seth(-90) fd(70) rechts(150) fd(20) links(140) Kreis(140,90) links(30) Kreis(160,100) links(130) fd(25) penup() rechts(150) kreis(40,80) pendown() links(115) fd(60) penup() links(180) fd(60) pendown() end_fill() rechts(120) kreis(-50,50) kreis(-20,90) speed(1) fd(75) geschwindigkeit(0) Kreis(90,110) penup() links(162) fd(185) links(170) pendown() Kreis(200,10) kreis(100,40) Kreis(-52,115) links(20) Kreis(100,20) Kreis(300,20) speed(1) fd(250) penup() geschwindigkeit(0) links(180) fd(250) Kreis(-300,7) rechts(80) Kreis(200,5) pendown() links(60) begin_fill() fillcolor('grün') kreis(-80,100) rechts(90) fd(10) links(20) kreis(-63,127) end_fill() penup() left(50) fd(20) links(180) pendown() Kreis(200,25) penup() rechts(150) fd(180) rechts(40) pendown() begin_fill() fillcolor('grün') kreis(-100,80) rechts(150) fd(10) links(60) kreis(-80,98) end_fill() penup() links(60) fd(13) links(180) pendown() Geschwindigkeit(1) kreis(-200,23) exitonclick() フィールドはブラウザの表示領域全体を満たし、子コンテナはブラウザの表示領域全体を von turtle importieren * importiere zufällig importiere Zeit n = 100.0 speed("fastest") screensize(bg='seashell') links(90) forward(3*n) color("orange", "gelb") begin_fill() left(126) for i in range(5): forward(n/5) rechts(144) vorwärts(n/5) links(72) end_fill() rechts(126) color("dunkelgrün") rückwärts(n*4.8) def tree(d, s): if d <= 0: return vorwärts(s) tree(d-1, s*.8) rechts(120) tree(d-3, s*.5) rechts(120) Baum(d-3, s*.5) rechts(120) rückwärts(s) Baum(15, n) rückwärts(n/2) for i in range(200): a = 200 - 400 * random.random() b = 10 - 20 * zufällig.zufällig() aufwärts() vorwärts(b) links(90) vorwärts(a) runter() if random.randint(0, 1) == 0: color('tomato') sonst: color('Weizen') Kreis(2) aufwärts() rückwärts(a) rechts(90) rückwärts(b) time.sleep(60) 属性で親コンテナ内での絶対位置決めを可能にし、さらに top && left && transform: translate(-50%, -50%) 属性は、親コンテナ内の子コンテナの絶対位置を制御します。

JavaScriptのロジック制御のコアとなるコード

まず、ノードを移動させるために必要な手順と、それに対応するイベントイベントを分解してみましょう。

  • 子コンテナが作成されたときの親コンテナ内の絶対位置
  • マウスボタンが押されたときのonmousedownイベント
  • マウスが移動したときのonmousemoveイベント
  • マウスボタンがバウンスしたときのonmouseupイベント

onMousedown、onMousemove、onMouseupイベントを使うだけで、最もシンプルな動きを実現することができます。

/*
* Get the top and left positions of the child container relative to the parent container when the child container is created
*
mounted () {
  this.left = this.$refs.fatherBox.offsetLeft
  this.top = this.$refs.fatherBox.offsetTop
}


/*
* When the mouse is pressed
* 1. turn on the flag that allows the child container to move
* 2. record information about the position of the mouse when it is clicked
*
mouseDown (e) {
  // Set the flag to allow the popup window to move
  this.moveFlag = true
  // Save the start position of the mouse
  this.startLeft = e.clientX - this.left
  this.startTop = e.clientY - this.top
}

/*
* When the mouse moves
* 1. determine if the flag allows the child container to move
* 2. set the left position of the popup box
* 3. set the right position of the popup box
*
move (e) {
  // Determine if the flag is allowed to move
  if (!this.moveFlag) return

  // Set the left position of the popup box
  this.left = e.clientX - this.startLeft
  // Set the right position of the popup box
  this.top = e.clientY - this.startTop

}

/*
* When the mouse button pops up
* 1. turn off the flag that allows the child container to move
*
mouseUp (e) {
  this.flag = false
}


このオフセットを親コンポーネントに公開することで、親コンポーネントは子コンポーネントの top と left の値をリアルタイムに設定し、子コンテナをマウスの動きに追従させることができます。

親コンポーネントのコード

親コンポーネントは子コンポーネントの ref と zIndex 値を設定し、親コンポーネントの backValue メソッドは子コンポーネントから zIndex 値を受け取り、zIndex によって特定の子コンポーネントインスタンスを識別します。

/*
* Parent component code snippet jsx version
*
export default {
  props: {
    playList: {
      type: Array,
      required: true
    }
  },
  render () {
    return (
      <div style={{width: '100%', height: '100%'}} ref={'father'}>
        {
          this.playList && this.playList.map((item, index) => {
            return (
              <ChildComponents
                key={index}
                ref={index}
                zIndex={index}
                visible={true}
                backValue={this.backValue}
                info={item}
                width={600}
                height={400}
              />
            )
          })
        }
      </div>
    )
  },
  methods: {
    backValue (left, top, zIndex) {
      this.$refs[zIndex]. $el.style.top = `${top}px`
      this.$refs[zIndex]. $el.style.left = `${left}px`
    }
  }
}

<! -- Parent component code snippet vue file version -->

<template>
  <div
    ref="father"
    style"width: 100%, height: 100%"
  >
    <ChildComponents
      v-for="(item, index) in playList"
      :key="index"
      :ref="index"
      :visible="true"
      :z-index="index"
      :back-value="backValue"
      :info="item"
      :close="close"
      :width="600"
      :height="400"
    />
  </div>
</template>
<script>
export default {
  components: {
    VideoPlayerModal
  },
  props: {
    playList: {
      type: Array,
      required: true
    }
  },
  methods: {
    backValue (left, top, zIndex) {
      this.$refs[zIndex][0]. $el.style.top = `${top}px`
      this.$refs[zIndex][0]. $el.style.left = `${left}px`
    }
  }
}
</script>

子コンポーネントのフェンス範囲を設定する

この関数は onmousemove イベントにおいてのみ必要で、子コンテナの上端と左端がブラウザの表示範囲外にあるかどうかを判断します。

/* 1.
* 1. this.width data is the width value passed in by the parent component, or the default value set by the child component itself
* 2. this.height data is the height value passed in by the parent component, or the default value set by the child component itself
*
move (e) {
  // determine if the flag allows movement
  if (!this.moveFlag) return

  // Determine if the left view is exceeded
      if (this.$refs.fatherBox.offsetLeft < this.width / 2) {
        // disable popup box movement
        this.moveFlag = false
        // Set the left position of the popup box
        this.left = this.width / 2 + 10
        // call the callback function to expose the offset to the parent component
        this.backValue(this.left, this.top, this.zIndex)
        return
      }

      // Determine if the right view is exceeded
      if (this.$refs.fatherBox.offsetLeft > document.body.clientWidth - this.width / 2) {
        // disable popup box movement
        this.moveFlag = false
        // Set the position of the right side of the popup box
        this.left = document.body.clientWidth - this.width / 2 - 10
        // call the callback function to expose the offset to the parent component
        this.backValue(this.left, this.top, this.zIndex)
        return
      }

      // Determine if the top view is exceeded
      if (this.$refs.fatherBox.offsetTop < this.height / 2 + 70) {
        // disable popup box movement
        this.moveFlag = false
        // Set the top position of the popup box
        this.top = this.height / 2 + 70 + 10
        // call the callback function to expose the offset to the parent component
        this.backValue(this.left, this.top, this.zIndex)
        return
      }

      // Determine if the bottom view is exceeded
      if (this.$refs.fatherBox.offsetTop > document.body.clientHeight - this.height / 2 - 50) {
        // disable popup box movement
        this.moveFlag = false
        // Set the bottom position of the popup box
        this.top = document.body.clientHeight - this.height / 2 - 50 - 10
        // call the callback function to expose the offset to the parent component
        this.backValue(this.left, this.top, this.zIndex)
        return
      }

      // Set the left position of the popup box
      this.left = e.clientX - this.startLeft
      // Set the right position of the popup box
      this.top = e.clientY - this.startTop

      // call the callback function to expose the offset to the parent component
      this.backValue(this.left, this.top, this.zIndex)
}

子コンポーネントは、マウスが子コンテナの外に出たときに onmouseout イベントを設定して、予期せぬバグの問題を防ぎます。

mouseOut (e) {
  this.moveFlag = false
}

これはHTMLドラッグ&ドロップ機能についてのこの記事の終わりです、より関連するHTMLドラッグ&ドロップ機能の内容は、BinaryDevelopの以前の記事を検索してくださいまたは、次の関連記事を参照してください、あなたがより多くなることを願っています。