- .box{
- background-color: brown;
- width: 100px;
- height: 100px;
- border-radius: 6px;
- box-shadow: 0 0 6px #999;
- cursor: pointer;
- }
-
- <div id="app">
- <p>appp>
- <div class="box" v-drag>div>
- div>
-
-
-
- <script type="module">
- import { createApp } from "../assets/vue/3.0/vue.esm-browser.js";
-
- const app = createApp({
- data(){
- return {
-
- }
- }
- })
- // vue3的全局概念不是在同一个环境就都属于vue语法的全局环境;
- // vue3的全局指的是由一个createApp作为全局启动代码,完成多个vue实例的加载,此时对于这些vue实例而言全局环境为创建app
- // 通过应用程序对象的 directive 方法完成一个自定义指令的描述
- // app.directive(指令名,指令的回调执行方法)
- app.directive("drag",function(el){
- el.style.position="absolute";
- el.onmousedown = function(event){
- if(event.button!=0) return;
- let ox = event.offsetX;
- let oy = event.offsetY;
- el.onmousemove = function(event){
- let px = event.pageX;
- let py = event.pageY;
- el.style.top=(py-oy)+"px";
- el.style.left=(px-ox)+"px";
- }
- }
- el.onmouseup = function(){
- el.onmousemove = null;
- }
- })
- app.mount("#app")
-
-
- script>
-
- body{
- padding-bottom: 800px;
- }
- .box{
- background-color: brown;
- width: 100px;
- height: 100px;
- border-radius: 6px;
- box-shadow: 0 0 6px #999;
- cursor: pointer;
- }
-
-
-
调用自定义指令test
-
调用自定义指令test
-
调用自定义指令test
-
-
-
-
-
-
-
- import { createApp } from "../assets/vue/3.0/vue.esm-browser.js";
- createApp({
- data(){
- return {
-
- }
- },
- // 通过属性配置方式定义多个局部指令
- // 局部指令只能在当前定义的vue实例对应的容器中
- directives:{
- // key (String) 定义指令名称 => 在模板中可以通过 v-指令名称 方式进行调用
- // value (Function) 定义指令的执行回调
- test:function(){
- console.log("自定义局部指令test");
- },
- // el 参数为自定义指令在页面调用时所对应的vnode生成的DOM元素
- drag(el){
- // console.log("自定义局部指令drag");
- el.style.position="absolute";
- // el.style.top="0px";
- // el.style.left="0px";
- // 绑定鼠标左键按下的事件
- el.onmousedown = function(event){
- // console.log("鼠标被点击:",event)
- if(event.button!=0) return;
- let ox = event.offsetX;
- let oy = event.offsetY;
-
- // 在按下的事件中再次绑定鼠标移动事件
- el.onmousemove = function(event){
- // console.log("移动:",event);
- let px = event.pageX;
- let py = event.pageY;
- // console.log(px,ox);
- // console.log(py,oy);
- el.style.top=(py-oy)+"px";
- el.style.left=(px-ox)+"px";
- }
- }
- // 绑定鼠标左键弹起的事件
- el.onmouseup = function(){
- // 在弹起时移除鼠标移动事件
- el.onmousemove = null;
- }
- }
- }
- }).mount("#app")
方法一
-
- body{
- padding-bottom: 800px;
- }
- img{
- width: 400px;
- height: 400px;
- border: 1px solid #dedede;
- }
-
- <body>
- <div id="app">
- <img v-preload=" img " style="object-fit:cover">
- div>
-
- <script>
- let arr = document.querySelectorAll("img[v-preload]");
- arr.forEach((dom)=>{
- dom.src = "../assets/img/loading.gif"
- dom.tempStyle = dom.style.cssText;
- dom.style.objectFit="scale-down";
- dom.style.objectPosition="center";
- })
- script>
- <script type="module">
- import { createApp } from "../assets/vue/3.0/vue.esm-browser.js";
- const app = createApp({
- data(){
- return {
- img:"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic.jj20.com%2Fup%2Fallimg%2F1112%2F11251Q24100%2F1Q125124100-5.jpg&refer=http%3A%2F%2Fpic.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1665718104&t=91a061cac8657bf9b1bc3ead30017584"
- }
- }
- })
-
- app.directive("preload", function(el,binding){
- if(binding.value==binding.oldValue) return;
- // el.src = "../assets/img/loading.gif"
- // let tempStyle = el.style.cssText;
- // el.style.objectFit="scale-down";
- // el.style.objectPosition="center";
-
- let imgDom = new Image();
- imgDom.src = binding.value;
- imgDom.onload = function(){
- // console.log("图片加载完成");
- el.src = binding.value;
- el.style.cssText = el.tempStyle;
- }
-
- })
-
- app.mount("#app")
- script>
- body>
方法二
- body{
- padding-bottom: 800px;
- }
- img{
- width: 400px;
- height: 400px;
- border: 1px solid #dedede;
- }
- /* 骨架屏 loading */
- img[v-preload],.preload{
- background-color: #dedede;
- background-image: linear-gradient(to right, rgba(255,255,255,0) 0%,rgba(255,255,255,0.8) 10%,rgba(255,255,255,0) 20%);
- background-size: 230% 100%;
- background-position: 30% 0%;
- animation: skeleton 1.5s infinite;
- }
- @keyframes skeleton {
- 0%{
- background-position: 30% 0%;
- }
- 100%{
- background-position: -100% 0%;
- }
- }
-
- <div id="app">
- <img v-preload=" img " style="object-fit:cover">
- div>
- <script type="module">
- import { createApp } from "../assets/vue/3.0/vue.esm-browser.js";
- const app = createApp({
- data(){
- return {
- // 此处代码不能换行
- img:"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic.jj20.com%2Fup%2Fallimg%2F1112%2F11251Q24100%2F1Q125124100-5.jpg&refer=http%3A%2F%2Fpic.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1665718104&t=91a061cac8657bf9b1bc3ead30017584"
- }
- }
- })
-
- app.directive("preload", function(el,binding){
- if(binding.value==binding.oldValue) return;
- el.classList.add("preload")
- let imgDom = new Image();
- imgDom.src = binding.value;
- imgDom.onload = function(){
- // console.log("图片加载完成");
- el.src = binding.value;
- el.classList.remove("preload")
- }
- })
- app.mount("#app")
- script>