View.Mobile.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946
  1. <template>
  2. <div class="header" @touchmove.prevent>
  3. <div class="left" v-show="player.showWidgets" :class="{ show: showMusic }">
  4. <div class="music" @click.stop="onMusicClick">
  5. <img :src="require(`@/assets/images/icon/${showMusicPlaying ? 'music_on@2x' : 'music_off@2x'}.png`)" alt="" />
  6. </div>
  7. </div>
  8. <div class="title" :class="{ up: player.showDescription, drak: mode != 'panorama', empty: !description }"
  9. @click="onShowDescription" v-show="player.showWidgets">
  10. <div>
  11. <span>
  12. {{ metadata.title }}
  13. </span>
  14. <i class="iconfont icon-pull-down"></i>
  15. </div>
  16. </div>
  17. <div class="right" :class="{ more: player.showMore }" v-show="player.showWidgets" @click="onShowMore">
  18. <img :src="require(`@/assets/images/icon/${player.lang}.png`)" alt="" />
  19. <keep-alive>
  20. <transition appear name="custom-classes-transition" enter-active-class="animated fadeInUp short faster"
  21. leave-active-class="animated fadeOutDown short faster">
  22. <div v-if="player.showMore">
  23. <ul>
  24. <li @click.stop="onMenuClick('zh_CN')">
  25. <img :src="require(`@/assets/images/icon/zh_CN.png`)" alt="" />
  26. <span>简体中文</span>
  27. </li>
  28. <li @click.stop="onMenuClick('zh_HK')">
  29. <img :src="require(`@/assets/images/icon/zh_HK.png`)" alt="" />
  30. <span>繁体中文</span>
  31. </li>
  32. <li @click.stop="onMenuClick('en')">
  33. <img :src="require(`@/assets/images/icon/en.png`)" alt="" />
  34. <span>English</span>
  35. </li>
  36. </ul>
  37. </div>
  38. </transition>
  39. </keep-alive>
  40. </div>
  41. <transition appear name="custom-classes-transition" enter-active-class="animated fadeInUp short faster"
  42. leave-active-class="animated fadeOutDown short faster">
  43. <div class="content" :class="{ drak: mode != 'panorama' }" v-if="player.showDescription"
  44. @click="onShowDescription">
  45. <div>
  46. <div v-html="description"></div>
  47. </div>
  48. </div>
  49. </transition>
  50. <teleport to="body">
  51. <template v-if="isApp">
  52. <transition appear name="custom-classes-transition" enter-active-class="animated fadeInUp short faster"
  53. leave-active-class="animated fadeOutDown short faster">
  54. <div class="app-share" v-if="showShare">
  55. <ul :class="{ flex: getLocale() == 'zh' }">
  56. <li @click="onShare('weixin')">
  57. <ui-icon type="_wechat"></ui-icon>
  58. <div>{{ $t("share.wechat") }}</div>
  59. </li>
  60. <li @click="onShare('weixinFriend')">
  61. <ui-icon type="_friend"></ui-icon>
  62. <div>{{ $t("share.friends") }}</div>
  63. </li>
  64. <li @click="onShare('qq')">
  65. <ui-icon type="_qq"></ui-icon>
  66. <div>{{ $t("share.qq") }}</div>
  67. </li>
  68. <li v-if="getLocale() != 'zh'" @click="onShare('faceBook')">
  69. <ui-icon type="icon_share_facebook"></ui-icon>
  70. <div>{{ $t("share.facebook") }}</div>
  71. </li>
  72. <li v-if="getLocale() != 'zh'" @click="onShare('whatsApp')">
  73. <ui-icon type="icon_share_whatsapp"></ui-icon>
  74. <div>{{ $t("share.whatsApp") }}</div>
  75. </li>
  76. <li @click="onShare('copy')">
  77. <ui-icon type="link1"></ui-icon>
  78. <div>{{ $t("share.copyLink") }}</div>
  79. </li>
  80. </ul>
  81. <div @click="showShare = false">{{ $t("common.cancel") }}</div>
  82. </div>
  83. </transition>
  84. </template>
  85. </teleport>
  86. <div class="url-share" v-show="showCopy">
  87. <div>
  88. <div class="tips">
  89. <h4>{{ $t("share.shareLinkTips") }}</h4>
  90. <i class="iconfont iconshow_cancel" @click="showCopy = false"></i>
  91. </div>
  92. <div class="url">{{ copyLink }}</div>
  93. <div class="btns">
  94. <ui-button class="cancel" @click="showCopy = false">{{ $t("common.cancel") }}</ui-button>
  95. <ui-button class="primary" :data-clipboard-text="copyLink" ref="copy$">{{ $t("share.fastCopy") }}</ui-button>
  96. </div>
  97. </div>
  98. </div>
  99. </div>
  100. <div class="rules-btn" v-if="showRules">
  101. <ui-button type="cancel" @click="cancelRules">取消</ui-button>
  102. <ui-button type="primary" :class="{ disabled: !next }" @click="confirmRules">确定起点({{ rulesIndex }}/2)</ui-button>
  103. </div>
  104. </template>
  105. <script setup>
  106. import ClipboardJS from "clipboard";
  107. import browser from "@/utils/browser";
  108. import { useStore } from "vuex";
  109. import { Dialog } from "@/global_components/";
  110. import { IsApp, MessageToApp, NotchHeight } from "@/utils/platform";
  111. import { useMusicPlayer } from "@/utils/sound";
  112. import { onMounted, watch, computed, ref, nextTick } from "vue";
  113. import { useApp, getApp } from "@/app";
  114. import i18n, { getLocale, setI18nLanguage, useI18n, loadLocaleMessages } from "@/i18n";
  115. const store = useStore();
  116. const { t } = useI18n({ useScope: "global" });
  117. let getUrl = (href, queryArr) => {
  118. queryArr.forEach((item) => {
  119. if (!browser.hasURLParam(item.key)) {
  120. let ttt = href.split("index.html?");
  121. href = `${ttt[0]}index.html?${item.key}=${item.val}&${ttt[1]}`;
  122. } else {
  123. href = browser.replaceQueryString(href, item.key, item.val);
  124. }
  125. });
  126. return href;
  127. };
  128. let share_url = browser.getURLParam("share_url");
  129. if (share_url) {
  130. share_url = decodeURIComponent(share_url);
  131. } else {
  132. share_url = location.href.split("#")[0];
  133. }
  134. const deploy = ref(process.env.VUE_APP_DEPLOY);
  135. const musicPlayer = useMusicPlayer();
  136. const loadingLogoFile = computed(() => store.getters["scene/loadingLogoFile"]);
  137. const metadata = computed(() => store.getters["scene/metadata"]);
  138. const controls = computed(() => {
  139. return metadata.value.controls;
  140. });
  141. const showMusicPlaying = ref(false);
  142. const showMusic = computed(() => store.getters["scene/metadata"].music);
  143. const player = computed(() => store.getters["player"]);
  144. const flying = computed(() => store.getters["flying"]);
  145. const copy$ = ref(null);
  146. const copyLink = computed(() => {
  147. return share_url.replace("&app", "");
  148. });
  149. const isApp = ref(IsApp);
  150. const showCopy = ref(false);
  151. const showShare = ref(false);
  152. const isMusicPlaying = ref(false);
  153. const mode = computed(() => store.getters["mode"]);
  154. const description = computed(() => metadata.value.description);
  155. watch(
  156. () => showCopy.value,
  157. (val, old) => {
  158. store.commit("SetPlayerOptions", {
  159. showMap: !showCopy.value,
  160. showToolbar: !showCopy.value,
  161. });
  162. },
  163. {
  164. deep: true,
  165. }
  166. );
  167. watch(
  168. () => showShare.value,
  169. (val, old) => {
  170. store.commit("SetPlayerOptions", {
  171. showMap: !showShare.value,
  172. showToolbar: !showShare.value,
  173. });
  174. },
  175. {
  176. deep: true,
  177. }
  178. );
  179. onMounted(() => {
  180. useApp().then((app) => {
  181. app.TagManager.on("tagManager.markTagPos", (res) => {
  182. next.value = true;
  183. });
  184. });
  185. new ClipboardJS(copy$.value.$el).on("success", function (e) {
  186. e.clearSelection();
  187. showCopy.value = false;
  188. Dialog.toast({ content: t("toast.copySuccess"), type: "success" });
  189. });
  190. nextTick(() => {
  191. document.querySelector(".player").addEventListener("touchstart", () => {
  192. if (player.value.showMore) {
  193. store.commit("SetPlayerOptions", {
  194. showMore: false,
  195. showMap: true,
  196. showToolbar: true,
  197. });
  198. } else if (player.value.showDescription) {
  199. store.commit("SetPlayerOptions", {
  200. showDescription: false,
  201. showMap: true,
  202. showToolbar: true,
  203. });
  204. }
  205. });
  206. window.Back = () => {
  207. onBack();
  208. };
  209. musicPlayer.on("play", () => (showMusicPlaying.value = true));
  210. musicPlayer.on("pause", () => (showMusicPlaying.value = false));
  211. });
  212. });
  213. const onListen = () => {
  214. // this.$bus.on('orientation', () => {
  215. if (NotchHeight) {
  216. this.$el.style.top = NotchHeight + "px";
  217. }
  218. // 发送返回按钮信息
  219. const rect = document.querySelector(".back").getBoundingClientRect();
  220. const data = {
  221. BackBtnInfo: {
  222. left: rect.left,
  223. top: rect.top,
  224. radius: rect.width / 2,
  225. },
  226. };
  227. if (browser.detectAndroid()) {
  228. MessageToApp(JSON.stringify(data));
  229. } else {
  230. MessageToApp(data);
  231. }
  232. // })
  233. };
  234. const onBack = () => {
  235. // player.value.showVR && store.commit('showVR')
  236. if (player.value.showVR) {
  237. MessageToApp("VRMode0");
  238. store.commit("showVR");
  239. }
  240. };
  241. const onShowMore = () => {
  242. let show = !player.value.showMore;
  243. store.commit("SetPlayerOptions", {
  244. showMore: show,
  245. showMap: show == false,
  246. showToolbar: show == false,
  247. showDescription: false,
  248. });
  249. };
  250. const onShowDescription = () => {
  251. let show = !player.value.showDescription;
  252. store.commit("SetPlayerOptions", {
  253. showMore: false,
  254. showMap: show == false,
  255. showToolbar: show == false,
  256. showDescription: show,
  257. });
  258. };
  259. const onMusicClick = () => {
  260. showMusicPlaying.value ? musicPlayer.pause() : musicPlayer.play();
  261. };
  262. const onMenuClick = (name) => {
  263. store.commit("SetPlayerOptions", {
  264. showMore: false,
  265. showDescription: false,
  266. showMap: true,
  267. showToolbar: true,
  268. });
  269. nextTick(() => {
  270. loadLocaleMessages(i18n, name).then(() => {
  271. setI18nLanguage(i18n, name);
  272. store.commit("SetPlayerOptions", {
  273. lang: name,
  274. });
  275. let tmp = getUrl(window.location.href, [
  276. {
  277. key: "lang",
  278. val: name,
  279. },
  280. ]);
  281. console.log(tmp);
  282. history.replaceState(null, null, tmp);
  283. setTimeout(() => {
  284. window.location.reload()
  285. }, 0);
  286. });
  287. });
  288. };
  289. const onShare = (name) => {
  290. if (name == "copy") {
  291. showShare.value = false;
  292. nextTick(() => {
  293. showCopy.value = true;
  294. });
  295. } else {
  296. MessageToApp(`Share-${name}`);
  297. showCopy.value = false;
  298. showShare.value = false;
  299. }
  300. };
  301. const onChangeMode = () => {
  302. store.commit("setMode", "panorama");
  303. };
  304. const rulesIndex = ref(1);
  305. // const emits = defineEmits(['close'])
  306. const confirmRules = () => {
  307. next.value = false;
  308. getApp().TagManager.confirmMeasure(rulesIndex.value);
  309. if (rulesIndex.value < 2) {
  310. Dialog.toast({
  311. content: "起点确定完毕,请定位终点",
  312. });
  313. rulesIndex.value++;
  314. } else {
  315. cancelRules();
  316. }
  317. };
  318. const showRules = ref(false);
  319. const cancelRules = () => {
  320. showRules.value = false;
  321. rulesIndex.value = 1;
  322. getApp().TagManager.cancelMeasure();
  323. store.commit("toggleUi");
  324. };
  325. const next = ref(false);
  326. </script>
  327. <style lang="scss" scoped>
  328. .disable {
  329. opacity: 1;
  330. }
  331. .rules-btn {
  332. background: rgba(0, 0, 0, 0.8);
  333. position: fixed;
  334. height: 1.3333rem;
  335. width: 100%;
  336. bottom: 0;
  337. left: 0;
  338. display: flex;
  339. align-items: center;
  340. justify-content: center;
  341. .ui-button {
  342. width: 40%;
  343. height: 1.0667rem;
  344. &.cancel {
  345. margin-right: 10px;
  346. }
  347. }
  348. }
  349. .header {
  350. position: absolute;
  351. top: 0.3rem;
  352. left: 0;
  353. height: 1.15789rem;
  354. width: 100%;
  355. z-index: 101;
  356. color: #fff;
  357. display: flex;
  358. align-items: center;
  359. text-shadow: 0px 0px 4px rgba(0, 0, 0, 0.4);
  360. &.app {
  361. top: 1rem;
  362. }
  363. .left {
  364. width: 1.28rem;
  365. height: 100%;
  366. display: flex;
  367. align-items: center;
  368. justify-content: flex-end;
  369. pointer-events: none;
  370. &.show {
  371. visibility: visible;
  372. pointer-events: auto;
  373. .music {
  374. visibility: visible;
  375. pointer-events: auto;
  376. }
  377. }
  378. .music {
  379. width: 0.50rem;
  380. height: 0.50rem;
  381. display: flex;
  382. align-items: center;
  383. justify-content: center;
  384. visibility: hidden;
  385. position: relative;
  386. >img {
  387. width: 100%;
  388. height: auto;
  389. position: static;
  390. }
  391. }
  392. }
  393. .right {
  394. position: relative;
  395. width: 1.28rem;
  396. height: 100%;
  397. padding-right: 15px;
  398. display: flex;
  399. align-items: center;
  400. justify-content: flex-end;
  401. z-index: 11;
  402. opacity: 0;
  403. pointer-events: none;
  404. >i {
  405. font-size: 0.6rem;
  406. }
  407. >img {
  408. width: 20px;
  409. }
  410. >div {
  411. position: absolute;
  412. display: flex;
  413. flex-direction: column;
  414. right: 10px;
  415. top: 1.3rem;
  416. padding: 4px 0.42105rem;
  417. background-color: rgba(0, 0, 0, 0.5);
  418. border-radius: 5px;
  419. &::after {
  420. content: "";
  421. position: absolute;
  422. top: -5px;
  423. right: 0.3rem;
  424. width: 0;
  425. height: 0;
  426. border-width: 0 5px 5px;
  427. border-style: solid;
  428. border-color: transparent transparent rgba(0, 0, 0, 0.5);
  429. }
  430. &.flex {
  431. li {
  432. span {
  433. flex: 1;
  434. width: auto;
  435. // min-width: 2.8rem;
  436. }
  437. }
  438. }
  439. li {
  440. position: relative;
  441. display: flex;
  442. align-items: center;
  443. justify-content: center;
  444. // margin-top: 0.3rem;
  445. font-size: 0;
  446. // height: .5333rem;
  447. padding: 0.1333rem 0 0.2667rem;
  448. >img {
  449. width: 22px;
  450. margin-right: 6px;
  451. }
  452. i {
  453. // position: absolute;
  454. // left: 0;
  455. // top: 0;
  456. // font-size: 0.45rem;
  457. font-size: 0.3733rem;
  458. margin-right: 0.4rem;
  459. }
  460. b {
  461. position: absolute;
  462. left: 0.32rem;
  463. top: 0.33rem;
  464. width: 7px;
  465. height: 7px;
  466. border-radius: 50%;
  467. background-color: #00c2c4;
  468. i {
  469. color: #fff;
  470. font-size: 12px;
  471. transform: scale(0.3, 0.3);
  472. top: -4px;
  473. left: -3px;
  474. position: absolute;
  475. }
  476. }
  477. span {
  478. width: 1.89474rem;
  479. white-space: nowrap;
  480. text-align: left;
  481. // padding-bottom: 0.3rem;
  482. // margin-left: 0.75rem;
  483. font-size: 0.3733rem;
  484. // text-indent: 0.2rem;
  485. // padding-right: 0.2rem;
  486. }
  487. }
  488. .home {
  489. border-top: solid 1px rgba(255, 255, 255, 0.4);
  490. a {
  491. width: 1.89474rem;
  492. margin-top: 0.3rem;
  493. margin-bottom: 0.1rem;
  494. margin-left: auto;
  495. margin-right: auto;
  496. display: block;
  497. text-decoration: none;
  498. overflow: hidden;
  499. img {
  500. width: 100%;
  501. outline: none;
  502. border: none;
  503. }
  504. }
  505. }
  506. }
  507. }
  508. .title {
  509. display: flex;
  510. flex: 1;
  511. width: 100%;
  512. height: 100%;
  513. font-size: 0.42105rem;
  514. letter-spacing: 1px;
  515. align-items: center;
  516. justify-content: center;
  517. >div {
  518. display: flex;
  519. transition: background 0.3s ease, min-width 0.3s ease, border-radius 0.3s ease;
  520. align-items: center;
  521. justify-content: center;
  522. padding-right: 12px;
  523. padding-left: 12px;
  524. white-space: nowrap;
  525. position: absolute;
  526. height: 100%;
  527. min-width: 100%;
  528. overflow: visible;
  529. pointer-events: none;
  530. background: linear-gradient(90deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.15) 50%, rgba(0, 0, 0, 0) 100%);
  531. }
  532. span {
  533. display: inline-block;
  534. position: relative;
  535. white-space: nowrap;
  536. overflow: hidden;
  537. text-overflow: ellipsis;
  538. max-width: 7rem;
  539. }
  540. i {
  541. transition: all 0.3s;
  542. position: absolute;
  543. left: 50%;
  544. bottom: 0;
  545. font-size: 0.3rem;
  546. transform: translateX(-50%);
  547. margin-bottom: 0.07rem;
  548. }
  549. &.up {
  550. i {
  551. transform: translateX(-50%) rotate(180deg);
  552. }
  553. >div {
  554. min-width: 0;
  555. //position: static;
  556. flex-shrink: 0;
  557. background-color: rgba(0, 0, 0, 0.5);
  558. border-radius: 1.15789rem;
  559. }
  560. &.drak {
  561. >div {
  562. background-color: rgba(0, 0, 0, 0.8);
  563. }
  564. }
  565. }
  566. &.empty {
  567. i {
  568. display: none;
  569. }
  570. }
  571. }
  572. .content {
  573. position: absolute;
  574. top: 1.6rem;
  575. left: 0.92105rem;
  576. right: 0.92105rem;
  577. padding: 10px;
  578. background: rgba(0, 0, 0, 0.5);
  579. border-radius: 5px;
  580. font-size: 0.36842rem;
  581. text-align: center;
  582. &.drak {
  583. background: rgba(0, 0, 0, 0.8);
  584. }
  585. >div {
  586. display: inline-block;
  587. text-align: left;
  588. letter-spacing: 1px;
  589. word-break: break-all;
  590. white-space: normal;
  591. line-height: 1.5;
  592. // h4 {
  593. // margin: 0;
  594. // padding: 0;
  595. // margin-bottom: 0.28rem;
  596. // font-size: 0.43rem;
  597. // padding-left: 0.18789rem;
  598. // width: 100%;
  599. // position: relative;
  600. // &::before {
  601. // content: "";
  602. // position: absolute;
  603. // left: 0;
  604. // top: 50%;
  605. // height: 80%;
  606. // transform: translateY(-50%);
  607. // width: 2px;
  608. // background-color: var(--editor-main-color);
  609. // }
  610. // }
  611. :deep(p) {
  612. word-break: break-word;
  613. margin: 8px 0;
  614. font-size: 16px;
  615. }
  616. :deep(a) {
  617. // color: var(--editor-main-color);
  618. color: #fff;
  619. font-size: 16px;
  620. text-decoration: none;
  621. }
  622. }
  623. // &::after {
  624. // content: "";
  625. // position: absolute;
  626. // top: -6px;
  627. // left: 50%;
  628. // margin-left: -3px;
  629. // width: 0;
  630. // height: 0;
  631. // border-width: 0 7px 6px;
  632. // border-style: solid;
  633. // border-color: transparent transparent rgba(0, 0, 0, 0.5);
  634. // }
  635. }
  636. .url-share {
  637. position: fixed;
  638. top: 0;
  639. left: 0;
  640. right: 0;
  641. bottom: 0;
  642. background-color: rgba(0, 0, 0, 0.1);
  643. >div {
  644. position: absolute;
  645. left: 0.6rem;
  646. right: 0.6rem;
  647. top: 50vh;
  648. transform: translateY(-50%);
  649. border-radius: 4px;
  650. background-color: rgba(0, 0, 0, 0.5);
  651. padding: 0.31579rem;
  652. font-size: 0.36842rem;
  653. .tips {
  654. display: flex;
  655. align-items: center;
  656. justify-content: space-between;
  657. h4 {
  658. margin: 0;
  659. font-size: 0.42105rem;
  660. }
  661. i {
  662. font-size: 0.6rem;
  663. }
  664. }
  665. .url {
  666. display: -webkit-box;
  667. color: #fff;
  668. text-align: center;
  669. padding: 0.26316rem;
  670. width: 100%;
  671. height: 1.8rem;
  672. margin: 0.7rem 0rem;
  673. border-radius: 0.07rem;
  674. line-height: 1.99;
  675. font-size: 0.36842rem;
  676. background-color: rgba(0, 0, 0, 0.35);
  677. overflow: hidden;
  678. text-overflow: ellipsis;
  679. word-break: break-all;
  680. word-wrap: break-word;
  681. -webkit-line-clamp: 2; //在第几行加省略号
  682. -webkit-box-orient: vertical;
  683. }
  684. .btns {
  685. display: flex;
  686. justify-content: space-between;
  687. button {
  688. font-size: 0.36842rem;
  689. width: 47%;
  690. height: 1.05263rem;
  691. border-radius: 1.05263rem;
  692. &.submit {
  693. background: #00c2c4;
  694. }
  695. }
  696. }
  697. }
  698. }
  699. }
  700. @media (orientation: landscape) {
  701. .header {
  702. top: 0.2rem;
  703. height: 0.7rem;
  704. &.app {
  705. top: 0.2rem;
  706. }
  707. .left {
  708. .back-pano {
  709. i {
  710. font-size: 0.5rem;
  711. }
  712. }
  713. }
  714. .right {
  715. >i {
  716. font-size: 0.5rem;
  717. }
  718. >div {
  719. right: 10px;
  720. top: 0.75rem;
  721. padding: 4px 0.2rem;
  722. &::after {
  723. right: 0.23rem;
  724. }
  725. li {
  726. margin-top: 0.15rem;
  727. i {
  728. font-size: 0.3rem;
  729. }
  730. b {
  731. left: 0.2rem;
  732. top: 0.15rem;
  733. }
  734. span {
  735. padding-bottom: 0.15rem;
  736. margin-left: 0.5rem;
  737. font-size: 0.25rem;
  738. }
  739. }
  740. .home {
  741. a {
  742. margin-top: 0.15rem;
  743. margin-bottom: 0rem;
  744. width: 1.4rem;
  745. }
  746. }
  747. }
  748. }
  749. .title {
  750. font-size: 0.3rem;
  751. }
  752. .content {
  753. top: 1rem;
  754. left: 2rem;
  755. right: 2rem;
  756. padding: 10px;
  757. >div {
  758. max-height: 3rem;
  759. font-size: 0.25rem;
  760. line-height: 1.5;
  761. }
  762. }
  763. }
  764. }
  765. // ipad 横屏
  766. @media only screen and (min-device-width: 768px) and (orientation: landscape) {
  767. .header {
  768. height: 0.8rem;
  769. .title {
  770. i {
  771. margin-bottom: 0;
  772. }
  773. }
  774. }
  775. }
  776. .app-share {
  777. position: fixed;
  778. left: 0;
  779. bottom: 0;
  780. width: 100%;
  781. background-color: #fff;
  782. color: var(--editor-main-color);
  783. text-shadow: none;
  784. border-radius: 0.146667rem 0.146667rem 0px 0px;
  785. z-index: 1000;
  786. i {
  787. // font-size: 2rem;
  788. font-size: 1rem;
  789. margin: 0.666667rem 0 0.106667rem;
  790. display: inline-block;
  791. }
  792. ul {
  793. // display: flex;
  794. // justify-content: space-around;
  795. overflow: hidden;
  796. div {
  797. text-align: center;
  798. // margin-top: -0.3rem;
  799. font-size: 0.34rem;
  800. }
  801. li {
  802. width: 33.3%;
  803. float: left;
  804. // padding-bottom: 0.5rem;
  805. overflow: hidden;
  806. text-align: center;
  807. // i{
  808. // font-size: 2rem;
  809. // }
  810. }
  811. &.flex {
  812. display: flex;
  813. li {
  814. float: none;
  815. }
  816. }
  817. }
  818. >div {
  819. height: 1.293333rem;
  820. font-size: 16px;
  821. text-align: center;
  822. // padding: 0.5rem;
  823. border-top: solid 1px #eeeeee;
  824. margin-top: 0.466667rem;
  825. line-height: 1.293333rem;
  826. }
  827. }
  828. </style>
  829. <style lang="scss">
  830. .animated.short {
  831. &.faster {
  832. animation-duration: 0.3s;
  833. }
  834. @keyframes fadeInUp {
  835. 0% {
  836. opacity: 0;
  837. transform: translate3d(0, 1rem, 0);
  838. }
  839. to {
  840. opacity: 1;
  841. transform: translateZ(0);
  842. }
  843. }
  844. @keyframes fadeOutDown {
  845. 0% {
  846. opacity: 1;
  847. }
  848. to {
  849. opacity: 0;
  850. transform: translate3d(0, 1rem, 0);
  851. }
  852. }
  853. }
  854. </style>