質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

2回答

509閲覧

画像の重なりをユーザーの操作により解除できる方法はないか。 vue.js

yzmw131321

総合スコア25

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2018/07/09 06:20

編集2018/07/11 08:29

イメージ説明

Vue.js で、図のような機能を実装したいです。
この機能を実装する方法がわからないので質問させて頂きます。

❶の状態では、3枚のdiv要素が重なって並んでいます。
奥に行くほど最初の幅は短くなっていますが、高さは全て同じです。

❶の状態で最も手前の要素を下にスクロールすると、下に移動し、
div 1要素+α分だけ スクロールした段階で次の要素も続いて 幅を100%にしつつ下に移動させ、
❸までの機能を実装させたいです。

当初の考えとしては、
(1) 十分スクロールできるよう、全体の高さを確保する
(2) 最も手前の要素を可動、それ以外を固定に設定
(3) スクロールした量を取得し、1枚の高さ+α 移動した際に、次の要素に可動かつ幅を100%に設定したclassを与える

といった流れを想定しています。ここでいうスクロールとは、
画面をスクロールして (つまり、ユーザーは画面を指で上に弾いて)下を見るという事ではなく、
水色の要素を下に弾いて移動させる、というイメージです。(スクロール、以外に適当な表現があれば教えてください。これが分からないので、自力で調べるのに限界があります)


ソースを表示します。
現時点では、手前の .coupon_areaをtouchmoveすると position:absoluteを外せるように設定したつもりです。
しかし、absoluteが消えるどころか3つのli要素自体が全て消えてしまいます。これの原因も分からないです。

vue

1<!-- thanks表示、announce非表示 OK --> 2<template> 3 <div class="content_wapper"> 4 5 <div class="content_inner"> 6 7 <div class="member_barcode_area coupon_area"> 8 <p>テキスト</p> 9 <div class="barcode"></div> 10 </div> 11 12 <div class="thanks_text_area" v-if="coupondAllSlided" v-bind:class="{show: coupondAllSlided}"> 13 <p>テキスト</p> 14 <div class="button_area"> 15 <button class="type1">テキスト</button> 16 </div> 17 <p class="coupon_list_header">テキスト</p> 18 </div> 19 20 <ul class="coupon_list"> 21 <li class="coupon_area hasImg back" v-if="couponIsSliding" v-bind:class="{notSlided: couponIsSliding}"> 22 </li> 23 24 <li class="coupon_area hasImg between" v-if="couponIsSliding" v-bind:class="{notSlided: couponIsSliding}"> 25 </li> 26 27 <li class="coupon_area front" v-on:touchmove="slide" v-if="couponIsSliding" v-bind:class="{notSlided: couponIsSliding}"> 28 </li> 29 30 </ul> 31 </div> 32 </div> 33</template> 34 35<script type="text/javascript" src="../assets/js/jsfile.js"></script> 36 37<style scoped src="../assets/css/cssfile.css"></style> 38

scss

1@import "variables"; 2 3.content_wapper { 4 5 .content_inner { 6 margin: 0 0.2rem 0 0.2rem; 7 width: calc(100vw - (0.2rem * 2)); 8 9 .member_barcode_area{ 10 11 p{ 12 text-align: center; 13 margin: 0.5rem 0; 14 font-size: 1.1rem; 15 16 &::before,&::after{ 17 content: ''; 18 background-color: #000; 19 vertical-align: middle; 20 display: inline-block; 21 background-repeat: no-repeat; 22 width: 15px; 23 height: 15px; 24 background-size: contain; 25 margin-bottom: 3px; 26 margin-right: 1px; 27 margin-left: 1px; 28 } 29 } 30 31 .barcode{ 32 width: 17rem; 33 height: 5rem; 34 background-color: #000; 35 margin-left: auto; 36 margin-right: auto; 37 } 38 } 39 40 .thanks_text_area { 41 margin: 2rem 0; 42 text-align: center; 43 44 .coupon_list_header { 45 margin-top: 2rem; 46 } 47 48 .show { 49 visibility: show; 50 } 51 } 52 53 .coupon_list { 54 position: relative; 55 56 .coupon_area { 57 height: 14rem; 58 left: 50%; 59 transform: translateX(-50%); 60 61 &.notSlided { 62 position: absolute; 63 } 64 65 &.back { 66 width: 80%; 67 } 68 69 &.between { 70 width: 90%; 71 z-index: 1; 72 top: 2rem; 73 } 74 75 &.front { 76 width: 95%; 77 z-index: 2; 78 top: 4rem; 79 } 80 } 81 } 82 83 .coupon_area { 84 position: relative; 85 border: #0F70AA 2px solid; 86 background-color: #E0F3FF; 87 height: 8rem; 88 padding: 0.5rem 0.5rem 0.1rem 0.5rem; 89 margin: 0.5rem 0; 90 color: #484848; 91 92 .coupon_title { 93 94 .new { 95 display: inline-block; 96 height: 1.5rem; 97 line-height: 1.5rem; 98 width: 3.5rem; 99 text-align: center; 100 color: #ffffff; 101 background-color: #FF0000; 102 margin-right: 0.5rem; 103 border-radius: 15px; 104 -moz-border-radius: 15px; 105 -webkit-border-radius: 15px; 106 } 107 } 108 109 .discount_text { 110 font-size: 2.5rem; 111 font-weight: bold; 112 text-align: center; 113 color: $BASE_COLOR; 114 } 115 116 .deadline_area { 117 font-weight: 400; 118 width: 10rem; 119 text-align: center; 120 margin-top: 1rem; 121 margin-left: auto; 122 margin-right: auto; 123 124 p { 125 font-size: 0.9rem; 126 127 &:first-child{ 128 padding-bottom: 0.2rem; 129 } 130 } 131 } 132 133 .announce_area { 134 background-color: $BASE_COLOR; 135 text-align: center; 136 vertical-align: middle; 137 margin: 1rem auto 0 auto; 138 color: $LABEL_COLOR; 139 width: 50%; 140 height: 3rem; 141 border-radius: 0.3rem; 142 position: fixed; 143 position: relative; 144 145 &::before { 146 content: ''; 147 position: absolute; 148 display: block; 149 width: 0; 150 height: 0; 151 right: -9px; 152 top: 15px; 153 border-left: 10px solid $BASE_COLOR; 154 border-top: 10px solid transparent; 155 border-bottom: 10px solid transparent; 156 } 157 158 p { 159 line-height: 1rem; 160 padding-top: 0.5rem; 161 } 162 } 163 164 .arrow { 165 float: right; 166 background-image: url(../img/down-arrow.png); 167 position: absolute; 168 right: -3rem; 169 top: 0; 170 background-repeat: no-repeat; 171 background-size: 30px 53px; 172 width: 2rem; 173 height: 5rem; 174 } 175 176 .per_coupons { 177 font-size: 1.2rem; 178 font-weight: bold; 179 text-align: center; 180 margin-top: 1rem; 181 } 182 183 .button_area { 184 width: 4.5rem; 185 position: absolute; 186 right: 3px; 187 bottom: 3px; 188 } 189 190 &.hasImg { 191 192 .img_area { 193 width: 5.5rem; 194 height: 5.5rem; 195 background-color: #000; 196 float: left; 197 display: inline-block; 198 } 199 200 .coupon_text_area { 201 margin-left: 0.5rem; 202 display: inline-block; 203 width: calc(100% - (5.5rem + 1rem)); 204 205 .coupon_title { 206 height: 1.2rem; 207 } 208 209 .coupon_detail { 210 margin: 0.5rem 0 0 0; 211 line-height: 1.2rem; 212 font-weight: 200; 213 height: 3rem; 214 font-size: 0.8rem; 215 } 216 .deadline_area { 217 text-align: left; 218 margin: 0; 219 220 p.large { 221 font-size: 2rem; 222 font-weight: 500; 223 } 224 } 225 } 226 } 227 } 228 } 229} 230

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

hammer.jsを使うと上下左右のスワイプ情報が取得できるので下スワイプのときにKei344さんのコードが実行されるようにしたらいいかと思います。
http://masarufuruya.hatenadiary.jp/entry/2018/01/24/150147

投稿2018/07/11 15:35

keisukeh

総合スコア657

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yzmw131321

2018/07/12 01:50

ありがとうございます。 提示して頂いたhammer.jsは jqueryで動くんですよね? vue.jsとは共存できないようなので、スワイプイベントの取得はvueのチュートリアルに従ってやろうと思います。 それに対して各要素に、transformするclassを付与すれば良いという事ですよね。
keisukeh

2018/07/12 02:01

hammer.jsはjQueryに依存していませんよ。
keisukeh

2018/07/12 02:03

考え方的には下スワイプを検知した後jsなりcssなりでアニメーションさせればいいと思います。
guest

0

こういうことをしたいのでしょうか。

HTML

1<input type="radio" name="on" checked> 2<input type="radio" name="on"> 3<input type="radio" name="on"> 4<div>1</div> 5<div>2</div> 6<div>3</div>

CSS

1div { 2 width: 90vw; 3 height: 60vh; 4 position: relative; 5 margin: 0 5vw; 6 transition: all 1s; 7} 8div:nth-of-type(1) { 9 background-color: #a55; 10 transform: translateY(-4vw) scale(.9); 11} 12div:nth-of-type(2) { 13 background-color: #5a5; 14 transform: translateY(-65vh) scale(.95); 15} 16div:nth-of-type(3) { 17 background-color: #55a; 18 transform: translateY(-120vh); 19} 20 21input { 22 margin-bottom: 3vw; 23} 24 25input:nth-of-type(2):checked ~ div:nth-of-type(1) { 26 transform: translateY(-3vw) scale(.95); 27} 28input:nth-of-type(2):checked ~ div:nth-of-type(2) { 29 transform: translateY(-60vh) scale(1); 30} 31input:nth-of-type(2):checked ~ div:nth-of-type(3) { 32 transform: translateY(-60vh); 33} 34 35input:nth-of-type(3):checked ~ div:nth-of-type(1) { 36 transform: translateY(0) scale(1); 37} 38input:nth-of-type(3):checked ~ div:nth-of-type(2) { 39 transform: translateY(0) scale(1); 40} 41input:nth-of-type(3):checked ~ div:nth-of-type(3) { 42 transform: translateY(0); 43} 44```**動くサンプル:**[https://jsfiddle.net/buLdg1hf/](https://jsfiddle.net/buLdg1hf/)

投稿2018/07/11 08:47

kei344

総合スコア69407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yzmw131321

2018/07/11 08:56

動作は似ています。 inputではなく、手前の物をドラッグした時に他の2枚も連動して動かせたいです
kei344

2018/07/11 09:00

「タッチのとき」にクラスを追加するように書き換えれば近い動きは出来ると思いますよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問