HTMLドラッグ&ドロップコード
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の以前の記事を検索してくださいまたは、次の関連記事を参照してください、あなたがより多くなることを願っています。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン