Style element by style property

เวลาเราเขียน style ใส่เข้าไปใน html ธรรมดาๆ หน้าตามันจะประมาณนี้

<div style="background-coloc:red; border:1px solid black;"></div>

เราใช้ Vue ช่วยแทรก style แบบนี้ได้ในหลายๆรูปแบบ เรามาไล่ดูกันว่า Vue จะช่วยเราได้อย่างไร

แบบธรรมดาที่สุด

เราใช้คำสั่ง v-bind:style เป็นตัวช่วยผูก style เข้าไปใน div ดูตัวอย่าง

<div id="app">
  <div v-bind:style="{backgroundColor: 'red'}">This is box</div>
  <div v-bind:style="{'background-color': 'yellow'}">This is box</div>
  <div v-bind:style="{'border': '1px solid black'}">This is box</div>
</div>

<script src="https://npmcdn.com/vue/dist/vue.js"></script>
<script>
  new Vue({
    el: '#app',
    data: {} 
  })
</script>

Vue นั้นจะไม่สร้างคำสั่ง style ขึ้นมาใหม่ มันจะหยิบเอามาจาก css โดยตรง เพราะฉะนั้น เราเคยใช้ชื่อ style อย่างไรก็ใช้อย่างนั้น

จากโค้ดจะเห็นว่าเราเขียน style ได้ 2 รูปแบบ คือแบบ css style กับ camel case style แต่ถึงจะเป็น camel case style มันก็หยิบยืมชื่อ style มาจาก css อยู่ดี แค่ตัดเครื่องหมายขีดกลางออก แล้วเปลี่ยนอักษรตัวแรกของคำหลังเป็นตัวอักษรตัวใหญ่ เท่านั้น

ข้อสังเกตุอย่างหนึ่งก็คือ หากเราเลือกใช้ camel case ไม่ต้องคร่อมค่าด้วยเครื่องหมายคำพูด แต่ถ้าหากเราเลือกใช้ตามชื่อ css เป๊ะๆ เราต้องคร่อมค่าด้วยเครื่องหมายคำพูด

<div v-bind:style="{backgroundColor: 'red'}">This is box</div>
<div v-bind:style="{'background-color': 'yellow'}">This is box</div>
<div v-bind:style="{'border': '1px solid black'}">This is box</div>

ผลลัพธ์

แมป Style อย่างง่ายอีกวิธีหนึ่ง

นอกจากเราจะระบุค่า css สไตล์ลงไปตรงๆ ดังตัวอย่างด้านบน เรายังสามารถใช้ตัวแปรของ Vue เข้ามาช่วยได้ด้วย

<div id="app">
  <div v-bind:style="{backgroundColor: vueRed}">This is box</div>
  <div v-bind:style="{'background-color': vueYellow}">This is box</div>
  <div v-bind:style="{'border': vueBorder}">This is box</div>
</div>

<script src="https://npmcdn.com/vue/dist/vue.js"></script>
<script>
  new Vue({
    el: '#app',
    data: {
      vueRed: 'red',
      vueYellow: 'yellow',
      vueBorder: '1px solid black' 
    } 
  })
</script>

vueRed, vueYellow, vueBorder คือชื่อตัวแปร Vue

<div v-bind:style="{backgroundColor: vueRed}">This is box</div>
<div v-bind:style="{'background-color': vueYellow}">This is box</div>
<div v-bind:style="{'border': vueBorder}">This is box</div>

ในตัวแปรต่างๆ เก็บค่าที่ต้องการไว้

<script>
  new Vue({
    el: '#app',
    data: {
      vueRed: 'red',
      vueYellow: 'yellow',
      vueBorder: '1px solid black' 
    } 
  })
</script>

ผลลัพธ์ที่ได้

แมป Style หลายค่า

ในกรณีที่เราต้องการจะแมป css สไตล์หลายๆค่า เราสามารถทำได้ดังนี้

<div id="app">
  <div v-bind:style="{'background-color': 'red', 'border': '2px solid black'}">This is box</div>
</div>

<script src="https://npmcdn.com/vue/dist/vue.js"></script>
<script>
  new Vue({
    el: '#app',
    data: {} 
  })
</script>

เราส่งค่าหลายค่าให้ v-bind:style ได้เลย

<div v-bind:style="{'background-color': 'red', 'border': '2px solid black'}">This is box</div>

แมป Style ด้วยอะเรย์

อีกวิธีในการแมปค่า css สไตล์คือส่งค่าไปให้ v-bind:style แบบอะเรย์ ดูตัวอย่าง

<div id="app">
  <div v-bind:style="[{'border': '2px solid black'},{'background-color': 'red'}]">This is box</div>
</div>

<script src="https://npmcdn.com/vue/dist/vue.js"></script>
<script>
  new Vue({
    el: '#app',
    data: {} 
  })
</script>

ผลลัพธ์

ตัวอย่างโค้ดประยุกต์ใช้ v-bind:style (progress bar)

<div id="app">
  <div style="background-color: #cccccc">
    <div id="progressbar" v-bind:style="{'background-color': 'red', 'width': width + '%'}">Progressing...</div>
  </div>
  <input type="button" v-on:click="start" value="Start Progress" />
</div>

<script src="https://npmcdn.com/vue/dist/vue.js"></script>
<script>
  new Vue({
    el: '#app',
    data: {
      width: 0
    },
    methods: {
      start: function(){
        var vm = this
        var time = setInterval(function(){
          vm.width++
          if(vm.width >= 100){
            clearInterval(time)
          } 
        }, 100)
      }
    }
  })
</script>

ผลลัพธ์

//P

results matching ""

    No results matching ""