DEV Community

ZHZL-m
ZHZL-m

Posted on

【Journey of HarmonyOS Next】 ArkTS-based Development (3) -> JS-Compatible Web Development (4) -> swiper

Image description

1 -> Create a Swiper component

Create a Swiper component in the hml file in the pages/index directory.

<!-- test.hml-->
<div class="container">
  <swiper>
    <div class="item" style="background-color: #bf45ea;">
      <text>item1</text>
    </div>
    <div class="item" style="background-color: #088684;">
      <text>item2</text>
    </div>
    <div class="item" style="background-color: #7786ee;">
      <text>item3</text>
    </div>
  </swiper>
</div>
Enter fullscreen mode Exit fullscreen mode
/* test.css */
.container{
  width: 100%;
  height: 100%;
  flex-direction: column;
  background-color: #F1F3F5;
  align-items: center;
  justify-content: center;
  width: 100%;
}
swiper{
  height: 30%;
}
.item{
  width: 100%;
  height: 500px;
}
text{
  width: 100%;
  height: 100%;
  text-align: center;
  font-size: 50px;
  color: white;
}
Enter fullscreen mode Exit fullscreen mode

Image description

illustrate

The Swiper component supports subcomponents other than the < list >.

2 -> Add attributes

When the Swiper component does not enable loop playback (loop="false"), add the autoplay attribute (autoplay), set the playback interval (interval) during autoplay, and the page will automatically switch and stay on the last subcomponent page. Add the digital attribute to enable the digital navigation point, and set the toggle to a fade slide effect (scrolleffect="fade").

<!-- test.hml-->
<div class="container">
  <swiper index="1"  autoplay="true" interval="2000" indicator="true" digital="true" duration="500"
  scrolleffect="fade" loop="false">
    <div class="item" style="background-color: #bf45ea;">
      <text>item1</text>
    </div>
    <div class="item" style="background-color: #088684;">
      <text>item2</text>
    </div>
    <div class="item" style="background-color: #7786ee;">
      <text>item3</text>
    </div>
    <div class="item" style="background-color: #c88cee;">
      <text>item4</text>
    </div>
  </swiper>
</div>

Enter fullscreen mode Exit fullscreen mode
/* test.css */
.container{
  width: 100%;
  height: 100%;
  flex-direction: column;
  background-color: #F1F3F5;
  align-items: center;
  justify-content: center;
}
swiper{
  height: 30%;
}
.item{
  width: 100%;
  height: 500px;
}
text{
  width: 100%;
  height: 100%;
  text-align: center;
  font-size: 50px;
  color: white;
}
Enter fullscreen mode Exit fullscreen mode

Image description

illustrate

Set the Indicator (Enabled Navpoint Indicator) property to true for the Digital (Numanic Navpoint Enabled) property to take effect.

The loop attribute takes effect only when the number of Swiper subcomponents is greater than or equal to 2.

The ScrollEffect property takes effect only when the value of the Loop property is false.

3 -> Set the style

Set the width and height of the Swiper component, the diameter of the navigation point indicator (indicator-size), color (indicator-color), relative position (ndicator-top), and the color when selected (indicator-selected-color).

<!-- test.hml-->
<div class="container">
  <swiper index="1" autoplay="true" interval="2000"  duration="500" >
    <div class="item" style="background: linear-gradient(to right,#806dd9,#5d44ea,#2eb9d5)">
      <text>item1</text>
    </div>
    <div class="item" style="background: linear-gradient( to right,#2eb9d5,#0e7db4,#2673d9)">
      <text>item2</text>
    </div>
    <div class="item" style="background: linear-gradient( to right,#2673d9,#0c89af,#806dd9)">
      <text>item3</text>
    </div>
  </swiper>
</div>
Enter fullscreen mode Exit fullscreen mode
/* test.css */
.container{
  width: 100%;
  height: 100%;
  flex-direction: column;
  background-color: #F1F3F5;
  align-items: center;
  justify-content: center;
}
swiper{
  width:  500px;
  height: 500px;
  border-radius: 250px;
  indicator-color: white;
  indicator-selected-color: blue;
  indicator-size: 40px;
  indicator-top: 100px;
  overflow: hidden ;
}
.item{
  width: 100%;
  height: 500px;
}
text{
  width: 100%;
  text-align: center;
  margin-top: 150px;
  font-size: 50px;
  color: white;
}
Enter fullscreen mode Exit fullscreen mode

Image description

4 -> Binding Events

Create two text components to add a click event, and when clicked, call the showPrevious (show the previous subcomponent) or showNext (show the next subcomponent) method. When a select component is added and the change event is triggered when a drop-down component is selected, the swiperTo method is called to jump to the specified carousel page. Swiper component bindings change (triggered when the currently displayed component index changes) and finish (triggered when the toggle animation ends) events.

<!-- test.hml-->
<div class="container">
  <swiper interval="2000" onchange="change" loop="false" onanimationfinish="finish" id="swiper">
    <div class="item" style="background-color: #bf45ea">
      <text>item1</text>
    </div>
    <div class="item" style="background-color: #088684;">
      <text>item2</text>
    </div>
    <div class="item" style="background-color: #7786ee;">
      <text>item3</text>
    </div>
    <div class="item" style="background-color: #c88cee;">
      <text>item4</text>
    </div>
  </swiper>
  <div class="content">
      <button class="pnbtn" onclick="previous">Previous</button>
      <select onchange="selectChange">
          <option value="0">swipeTo 1</option>
          <option value="1">swipeTo 2</option>
          <option value="2">swipeTo 3</option>
          <option value="3">swipeTo 4</option>
      </select>
    <button class="pnbtn" onclick="next">Next</button>
  </div>
</div>
Enter fullscreen mode Exit fullscreen mode
/* test.css */
.container{
  width: 100%;
  height: 100%;
  flex-direction: column;
  background-color: #F1F3F5;
  align-items: center;
  justify-content: center;
}
swiper{
  height: 30%;
}
.item{
  width: 100%;
  height: 500px;
}
text{
  width: 100%;
  height: 100%;
  text-align: center;
  font-size: 50px;
  color: white;
}
select{
  background-color: white;
  width: 250px;
  height: 80px;
}
.content{
  margin-top: 100px;
  justify-content: space-around;
}
.pnbtn{
  width: 200px;
  height: 80px;
  font-size: 30px; 
}
Enter fullscreen mode Exit fullscreen mode
import prompt from '@system.prompt';
export default{
  change(e){
    prompt.showToast({duration:2000,message:"current index:"+e.index});
  },
  finish(){
    prompt.showToast({duration:2000,message:"切换动作结束"});
  },
  selectChange(e){
    this.$element('swiper').swipeTo({index: Number(e.newValue)});
  },
  previous(){
    this.$element('swiper').showPrevious();
  },
  next(){
    this.$element('swiper').showNext();
  }
}
Enter fullscreen mode Exit fullscreen mode

Image description

5 -> Scenario Example

In this scenario, Swiper is used to create a carousel, create a thumbnail at the bottom of the carousel, click the thumbnail and call the swipeTo method to switch to the corresponding carousel.

<!-- test.hml-->
<div class="container">
  <swiper duration="500" indicator="false" id="swiper" onchange="change">
    <div class="item" for="item in list">
      <image src="{{item.src}}"></image>
    </div>
  </swiper>
  <div class="content">
    <div class="content_item {{index == $idx?'actived':''}}" for="item in list" onclick="imageTo({{$idx}})">
      <image src="{{item.src}}"></image>
    </div>
  </div>
</div>
Enter fullscreen mode Exit fullscreen mode
/* test.css */
.container{
  flex-direction: column;
  background-color: #F1F3F5;
  align-items: center;
  justify-content: center;
  width: 100%;
}
swiper{
  width: 100%;
  height: 500px;
}
.item{
  width: 100%;
  height: 500px;
}
.content{
  margin-top: -120px;
  width: 70%;
  display: flex;
  justify-content: space-around;
  height: 100px;
}
.content_item{
  padding: 5px;
  transform: scale(0.5);
}
.actived{
  transform: scale(1);
  border: 1px solid #b20937ea;
}
Enter fullscreen mode Exit fullscreen mode
// index.js
import prompt from '@system.prompt';
export default {
  data:{
    index: 0,
    list:[
      {src: 'common/images/1.png'},
      {src: 'common/images/2.png'},
      {src: 'common/images/3.png'},
      {src: 'common/images/4.png'},]
    },
  imageTo(index){
    this.index = index;
    this.$element('swiper').swipeTo({index: index});
  },
  change(e){
    this.index = e.index;
  }
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)