vue 移动端拖拽 + 吸附效果


<template>
    <div
        class="floatball"
        id="floatball"
        @mousedown.="down"
        @touchstart.stop="down"
        @mousemove.prevent="move"
        @touchmove.prevent="move"
        @mouseup="end"
        @touchend.stop="end"
        :style="{ top: position.y + 'px', left: position.x + 'px' }"
    ></div>
</template>

<script>
// 鼠标位置和div的左上角位置 差值
var dx, dy;
var screenWidth = window.screen.width;
var screenHeight = window.screen.height;

export default {
    data() {
        return {
            flags: false,
            position: {
                x: 287,
                y: 220
            }
        };
    },

    methods: {
        // 实现移动端拖拽
        down(event) {
            this.flags = true;
            var touch;
            if (event.touches) {
                touch = event.touches[0];
            } else {
                touch = event;
            }
            console.log("鼠标点所在位置", touch.clientX, touch.clientY);
            console.log(
                "div左上角位置",
                event.target.offsetTop,
                event.target.offsetLeft
            );
            dx = touch.clientX - event.target.offsetLeft;
            dy = touch.clientY - event.target.offsetTop;
        },
        move(event) {
            if (this.flags) {
                var touch;
                if (event.touches) {
                    touch = event.touches[0];
                } else {
                    touch = event;
                }
                // 定位滑块的位置
                this.position.x = touch.clientX - dx;
                this.position.y = touch.clientY - dy;
                // 限制滑块超出页面
                // console.log('屏幕大小', screenWidth, screenHeight )
                if (this.position.x < 0) {
                    this.position.x = 0;
                } else if (
                    this.position.x >
                    screenWidth - touch.target.clientWidth
                ) {
                    this.position.x = screenWidth - touch.target.clientWidth;
                }
                if (this.position.y < 0) {
                    this.position.y = 0;
                } else if (
                    this.position.y >
                    screenHeight - touch.target.clientHeight
                ) {
                    this.position.y = screenHeight - touch.target.clientHeight;
                }
                //阻止页面的滑动默认事件
                document.addEventListener(
                    "touchmove",
                    function(event) {
                        event.stopPropagation();
                        event.preventDefault();
                    },
                    false
                );
            }
            event.stopPropagation();
        },
        //鼠标释放时候的函数
        end(event) {
            console.log("end");
            console.log(screenWidth);
            if(event.target.offsetLeft<(screenWidth/2)){
                this.position.x = 0; 
            }else{
                this.position.x = screenWidth-74; 
            }
            this.flags = false;
        }
    }
};
</script>

<style>
.floatball {

    height: 158px;
    width: 142px;
    z-index: 990;
    position: fixed;
    top: 500px;
    right: 220px;
    background: url("../../assets/blind/Group 435.png") no-repeat;
    background-size: 100% 100%;
    margin-right: 50px;
    /* border-radius: 50%; */
    /* background-color: rgba(29, 157, 237, 0.8); */
}

</style>

使用

<template>
    <section class="blindset">
        <TopBar title="盲定" class="rulesHeader" />
        <div>
            <div class="coming">
                <p>
                    来自张三12345678912转让订单,请于<b
                        style="color:#3AFBDC;margin:0 3px;"
                        >23:00</b
                    >前完成订单支付
                </p>
            </div>
            <h3>欢迎选择<span>Z</span>车型</h3>
            <div class="center_img">
                <p class="decs_car">
                    <span>长城T30</span
                    >车型配置、图片等信息可能会与最终量产车型存在差异
                </p>
                <p class="desc_img"><img :src="picture1" alt="" /></p>
            </div>
            <div>
                <h4>盲定权益</h4>
                <span>前10000名创始用户专享</span>
            </div>
            <BlindIconList :cloumn="cloumn" />
            <div class="title3">
                <h2>购车人信息</h2>
                <!-- <a :href="mobile"><span></span>我有疑问,致电客服中心</a> -->
            </div>

            <div>
                <van-form>
                    <!-- <van-cell-group> -->
                    <van-field
                        v-model="formData.username"
                        label="购车人"
                        label-width="100px"
                        placeholder="请填写购车人姓名"
                    />
                    <!-- </van-cell-group> -->
                    <!-- <van-cell-group> -->
                    <van-field
                        disabled
                        v-model="formData.tel"
                        label="联系电话"
                        label-width="100px"
                        placeholder="请填写购车人姓名"
                    />
                    <!-- </van-cell-group> -->
                    <!-- <van-cell-group> -->
                    <van-field
                        v-model="formData.IdCard"
                        label="身份证"
                        label-width="100px"
                        placeholder="请填写购车人身份证号"
                    />
                    <!-- </van-cell-group> -->
                    <!-- <van-cell-group> -->
                    <van-field
                        readonly
                        clickable
                        name="area"
                        :value="formData.value"
                        label="购车城市"
                        placeholder="未选择"
                        right-icon="arrow"
                        @click="showArea = true"
                    />
                    <van-popup v-model="showArea" position="bottom">
                        <van-area
                            :area-list="areaList"
                            @confirm="onConfirm"
                            @cancel="showArea = false"
                        />
                    </van-popup>
                    <!-- </van-cell-group> -->
                    <!-- <van-cell-group> -->
                    <van-field
                        v-model="formData.sms"
                        center
                        clearable
                        label="验证码"
                        placeholder="请填写验证码"
                    >
                        <template #button>
                            <span size="large" style="color:#3AFBDC;"
                                >获取验证码</span
                            >
                        </template>
                    </van-field>
                    <!-- </van-cell-group> -->
                    <div>
                        <p class="bbotom">
                            <van-checkbox
                                v-model="formData.checked"
                                shape="square"
                                ><span style="color:#fff;lineHeight:20px;"
                                    >我已阅读并同意
                                    <a @click="implement">《购车须知》</a></span
                                >
                            </van-checkbox>
                        </p>
                        <div class="total_payment">
                            <div>
                                <p>
                                    <span>合计:</span>
                                    <span style="color:#3AFBDC;"
                                        >¥<b
                                            style="fontSize:24px;fontWeight:normal;"
                                            >9999</b
                                        ></span
                                    >
                                </p>
                                <p>如改变购车计划,预定金可退</p>
                            </div>
                            <div>
                                <span class="payment" @click="payEarnest"
                                    >支付定金</span
                                >
                            </div>
                        </div>
                    </div>
                </van-form>
            </div>
        </div>
        <!-- 拨打电话图标 需要拖拽的元素 -->
        <Drag />
    </section>
</template>

<script>
import TopBar from "../../components/TopBar/Main.vue";
import BlindIconList from "../../components/BlindIconList/Main.vue";
import { areaList } from "@vant/area-data";
import Drag from "../../components/Drag/Main.vue";
export default {
    name: "blindset",
    components: {
        TopBar,
        BlindIconList,
        Drag
    },
    data() {
        return {
            areaList,
            mobile: "tel:13552157693",
            drag: false,
            page: { x: "", y: "" },
    
            formData: {
                username: "",
                tel: "12345678945",
                IdCard: "",
                value: "",
                sms: "",
                checked: false
            },
            showArea: false
        };
    },
    methods: {

        // 城市选择
        onConfirm(values) {
            this.formData.value = values
                .filter(item => !!item)
                .map(item => item.name)
                .join("/");
            this.showArea = false;
        },

        // 点击购物须知事件
        implement() {
            console.log("点击了购车须知");
        },
        // 提交事件
        payEarnest() {
            console.log(this.formData);
        }
    }
};
</script>

<style lang="less">
.blindset {
    box-sizing: border-box;
    background: url(../../assets/bg.png) no-repeat #092536;
    background-size: 100%;
    min-height: 100vh;
    width: 100%;
    z-index: 100;
    line-height: 50px;
    color: #fff;
    font-family: PingFang SC;
    // font-size: 28px;
    display: flex;
    flex-direction: column;
    overflow: hidden;
    padding: 30px;
    position: relative;
}

</style>

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM