小程序新闻网站详情页

准备工作:

1、在微信公众号平台,申请小程序账号,获取appid
2、下载并安装微信开发者工具

3、做不同分辨率设备的自适应:单位使用rpx
IPhone6下 1px=1rpx=0.5pt
使用rpx,小程序会自动在不同分辨率下进行转换

首先是项目的入口页面

welcome.wxml

<view class="container">
    image ="avatar" src="/images/avatar/1.png"></imagetext ="motto">Hello,七月</text="journey-container" bindtap="onTap">
        ="journey">开启小程序之旅view>
>

welcome.wxss

.container{
    display: flex;
    flex-direction:column;
    align-items: center;
    background-color:#b3d4db;
}

.avatar{
    width:200rpx;
    height:
    margin-top:160rpx;
}

.motto{100rpx;
    font-size:32rpx;
    font-weight: bold;
}

.journey-container{ 200rpx;
    border: 1px solid #405f80; 80rpx;
    border-radius: 5px;
    text-align:center;
}

.journey{22rpx; bold;
    line-height:80rpx;
    color: #405f80;
}

page{ 100%;#b3d4db;
}

welcome.js

Page({
    onTap: function (event) {
        // wx.navigateTo({
             url:"../posts/post"
         });
        
        wx.switchTab({
            url: "../posts/post"
        });
      
    },onReachBottom:(event){
      console.log('asfasdfa')
    }
})

welcome.json(主要是设置最上面的导航栏的颜色)

{
    "navigationBarBackgroundColor": "#b3d4db"
}

接下来是新闻列表页

这里是把循环的每条新闻的结构独立出来,到post-item文件夹中

post-item-template.wxml

template name="postItem"="post-container">
       ="post-author-date">
           ="post-author"="{{avatar}}">
                ="post-date">{{date}}="post-title">{{title}}>
            ="post-image"="{{imgSrc}}"="post-content">{{content}}
            ="post-like">
                    ="post-like-image" 
                    src="/images/icon/chat.png"="post-like-font">{{collection}}>

                    ="/images/icon/view.png">{{reading}}template>

post-item-template.wxss

.post-container{flex;20rpx;
    margin-bottom:40rpx;
    margin-left: 0rpx;#fff;
    border-bottom: 1px solid #ededed;
    border-top:
    padding-bottom: 5px;
}

.post-author-date{10rpx; 20rpx; 10px;
}

.post-author{60rpx;
    vertical-align: middle;
}

.post-date{ 20px;

.post-image{100%;340rpx;
    margin:auto 0; 15px;
}26rpx;
.post-title{34rpx; 600;#333; 10px;
.post-content{#666;28rpx;
    letter-spacing:2rpx; 40rpx;
}
.post-like{13px; 16px;

.post-like-image{16px;
    margin-right: 8px;middle;
}

.post-like-font{middle; 20px;
}

post.wxml

import src="post-item/post-item-template.wxml" />
<!--<import src="/pages/posts/post-item/post-item-template.wxml" />-->
swiper catchtap="onSwiperTap" vertical="{{false}}" indicator-dots="true" autoplay interval="5000"swiper-itemid="7"="/images/wx.png" data-postId="3"="/images/vr.png"="4"="/images/iqiyi.png"="5"swiperblock wx:for="{{postList}}" wx:for-item="item" wx:for-index="idx"//template-->
        ="onPostTap"="{{item.postId}}">
             is="postItem" data="{{...item}}"/>
        block>

post.wxss

@import "post-item/post-item-template.wxss";

 swiper{
     width:
     height:600rpx;
 }
 /*less sass*/
 swiper image{600rpx;
 }

post.js

var postsData = require('../../data/posts-data.js')

Page({
  data: {
    小程序总是会读取data对象来做数据绑定,这个动作我们称为动作A
     而这个动作A的执行,是在onLoad函数执行之后发生的
  },onLoad:  () {

     this.data.postList = postsData.postList
    this.setData({
       postList:postsData.postList
      });
  },1)">(event){
    console.log('asdfasdfasdf')
  },onPostTap:  (event) {
    var postId = event.currentTarget.dataset.postid;
     console.log("on post id is" + postId);
    wx.navigateTo({
      url: "post-detail/post-detail?id=" + postId
    })
  },onSwiperTap:  target 和currentTarget
     target指的是当前点击的组件 和currentTarget 指的是事件捕获的组件
     target这里指的是image,而currentTarget指的是swiper
     event.target.dataset.postid;
    wx.navigateTo({
      url: "post-detail/post-detail?id=" + postId
    })
  }
})

post.json

{
   "navigationBarTitleText":"文与字"
}

然后是新闻详情页

post-detail.wxml

先静后动,先样式再数据>
  ="head-image"="{{isPlayingMusic?postData.music.coverImg:postData.headImgSrc}}"="onMusicTap" class="audio"="{{isPlayingMusic? '/images/music/music-stop.png': '/images/music/music-start.png'}}"="author-date"="{{postData.avatar}}"="author">{{postData.author}}="const-text">发表于="date">{{postData.dateTime}}="title">{{postData.title}}="tool"="circle-img">
      wx:if="{{collected}}" catchtap="onColletionTap"  src="/images/icon/collection.png"wx:else catchtap="/images/icon/collection-anti.png"="onShareTap"  class="share-img"="/images/icon/share.png"="horizon"="detail">{{postData.detail}}>

post-detail.wxss

.container {
  display:
  flex-direction: column;
}

.head-image {
  width:
  height: 460rpx;
}

.hide{
  opacity: 0;
}

.audio { 102rpx; 110rpx;
  position: absolute;
  left: 50%;
  margin-left: -51rpx;
  top: 180rpx; 0.6;
}

.author-date { row; 30rpx;
  margin-top: 20rpx;
}

.avatar { 64rpx;
  vertical-align:

.author {
  font-size:
  font-weight: 300; middle;
  color: #666;
}

.const-text { 24rpx; #999;

.date { #999;
}

.title { 40rpx; 36rpx; 700;
  letter-spacing: 2px; #4b556c;
}

.tool {

.circle-img {
  float: right;
  margin-right:

.circle-img Image { 90rpx; 90rpx;
}

.share-img { 30rpx;
}

.horizon { 660rpx; 1px;
  background-color: #e5e5e5; relative; 46rpx;
  margin: 0 auto;
  z-index: -99;
}

.detail { #666;
  line-height: 44rpx; 2px;
}

post-detail.js

var postsData = require('../../../data/posts-data.js')
var app = getApp();
Page({
    data: {
        isPlayingMusic: false
    },1)"> (option) {
         option.id;
        this.data.currentPostId = postId;
        var postData = postsData.postList[postId];
        .setData({
            postData: postData
        })

        var postsCollected = wx.getStorageSync('posts_collected')
        if (postsCollected) {
            var postCollected = postsCollected[postId]
             (postCollected){
              .setData({
                collected: postCollected
              })
            }
        }
        else {
            var postsCollected = {};
            postsCollected[postId] = ;
            wx.setStorageSync('posts_collected',postsCollected);
        }

        if (app.globalData.g_isPlayingMusic && app.globalData.g_currentMusicPostId
            === postId) {
            .setData({
                isPlayingMusic: true
            })
        }
        .setMusicMonitor();
    },setMusicMonitor:  () {
        点击播放图标和总控开关都会触发这个函数
        var that = ;
        wx.onBackgroundAudioPlay( (event) {
            var pages = getCurrentPages();
            var currentPage = pages[pages.length - 1];
            if (currentPage.data.currentPostId === that.data.currentPostId) {
                 打开多个post-detail页面后,每个页面不会关闭,只会隐藏。通过页面栈拿到到
                 当前页面的postid,只处理当前页面的音乐播放。
                if (app.globalData.g_currentMusicPostId == that.data.currentPostId) {
                     播放当前页面音乐才改变图标
                    that.setData({
                        isPlayingMusic: 
                    })
                }
                 if(app.globalData.g_currentMusicPostId == that.data.currentPostId )
                 app.globalData.g_currentMusicPostId = that.data.currentPostId;
            }
            app.globalData.g_isPlayingMusic = ;

        });
        wx.onBackgroundAudioPause( () {
             that.data.currentPostId) {
                    that.setData({
                        isPlayingMusic: 
                    })
                }
            }
            app.globalData.g_isPlayingMusic = ;
             app.globalData.g_currentMusicPostId = null;
        });
        wx.onBackgroundAudioStop( () {
            that.setData({
                isPlayingMusic: 
            })
            app.globalData.g_isPlayingMusic =         });
    },onColletionTap:  this.getPostsCollectedSyc();
        .getPostsCollectedAsy();
    },getPostsCollectedAsy: ;
        wx.getStorage({
            key: "posts_collected" (res) {
                 res.data;
                 postsCollected[that.data.currentPostId];
                 收藏变成未收藏,未收藏变成收藏
                postCollected = !postCollected;
                postsCollected[that.data.currentPostId] = postCollected;
                that.showToast(postsCollected,postCollected);
            }
        })
    },getPostsCollectedSyc: );
        var postCollected = postsCollected[.data.currentPostId];
         收藏变成未收藏,未收藏变成收藏
        postCollected = !postCollected;
        postsCollected[this.data.currentPostId] = postCollected;
        .showToast(postsCollected,postCollected);
    },showModal:  (postsCollected,postCollected) {
        ;
        wx.showModal({
            title: "收藏" (res.confirm) {
                    wx.setStorageSync('posts_collected' 更新数据绑定变量,从而实现切换图片
                    that.setData({
                        collected: postCollected
                    })
                }
            }
        })
    },showToast:  更新文章是否的缓存值
        wx.setStorageSync('posts_collected' 更新数据绑定变量,从而实现切换图片
        .setData({
            collected: postCollected
        })
        wx.showToast({
            title: postCollected ? "收藏成功" : "取消成功""success"
        })
    },onShareTap: var itemList = [
            "分享给微信好友"
        ];
        wx.showActionSheet({
            itemList: itemList,itemColor: "#405f80" res.cancel 用户是不是点击了取消按钮
                 res.tapIndex 数组元素的序号,从0开始
                wx.showModal({
                    title: "用户 " + itemList[res.tapIndex],content: "用户是否取消?" + res.cancel + "现在无法实现分享功能,什么时候能支持呢"
                })
            }
        })
    },onMusicTap: var currentPostId = .data.currentPostId;
         postsData.postList[currentPostId];
        var isPlayingMusic = .data.isPlayingMusic;
         (isPlayingMusic) {
            wx.pauseBackgroundAudio();
            
            })
             app.globalData.g_currentMusicPostId = null;
            app.globalData.g_isPlayingMusic = ;
        }
         {
            wx.playBackgroundAudio({
                dataUrl: postData.music.url,title: postData.music.title,coverImgUrl: postData.music.coverImg,})
            
            })
            app.globalData.g_currentMusicPostId = .data.currentPostId;
            app.globalData.g_isPlayingMusic = ;
        }
    },
    * 定义页面分享函数
    */
    onShareAppMessage: return {
            title: '离思五首·其四''/pages/posts/post-detail/post-detail?id=0'
        }
    }

})

post-detail.json

{
    "navigationBarTitleText":"阅读"
}

贴一下模拟的新闻数据posts-data.js

var local_database = [
    {
        date: "Sep 18 2016""http://music.163.com/song/media/outer/url?id=142604.mp3"
        }
    },{
        title: "比利·林恩的中场故事""一 “李安是一位绝不会重复自己的导演,本片将极富原创性”李安众所瞩目的新片《比利林恩漫长的中场休息》,正式更名《半场无战事》。预告片首次曝光后,被视作是明年奥斯卡种子选手。该片根据同名畅销书改编。原著小说荣获美国国家图书奖。也被BBC评为21世纪最伟大的12本英文小说之一。影片讲述一位19岁德州男孩的比利·林恩入伍参加伊战,在一次交火中他大难不死,意外与战友成为大众的关注焦点,并被塑造成英雄。之后他们返回国内,在橄榄球赛中场休息时授勋。这名战争英雄却面临前所未有的心灵煎熬……李安为什么选中这部电影来拍?因为李安想要挑战前所未有的技术难题:以120帧每秒的速度、4K、3D技术全面结合,来掀起一场电影视觉革命。什么意思?所谓“电影是24格每秒的谎言”,其中的24格,就是帧数。""/images/post/bl.png""http://music.163.com/song/media/outer/url?id=108220.mp3"按住alt + shift + F 可以格式化代码样式
        title: "当我们在谈论经济学时,我们在谈论什么?""http://music.163.com/song/media/outer/url?id=27538254.mp3""这两天闲来无事,也安装了 “微信折叠”的开发工具来玩一下。以下是一些小道消息及使用体验,过两天我会写一篇文章以开发者的角度来详细评价微信小程序:微信小程序不能开发游戏类、直播类功能,小程序每个人关注的上限是20个(还不确定,不过我相信这是真的,这次公布的API里并没有视频组件。微信太大,苹果要有所顾忌,但是微信也要做出相应的让步)微信目前有没有同苹果商谈好,还是个未知数,毕竟会对AppStore有一定的冲击。抛弃了大量的javascript组件后,这个生态体系变得相当的封闭,微信解释肯定是:为了更好的性能提升。那么我们拭目以待。小程序的入口是微信里的三级菜单,就是在“Tab栏发现里的游戏下面加入一个“小程序”。反正,这一栏里的购物和游戏我是从来没点进去过的。以腾讯的尿性,小程序同服务号一样,其关系链及重要功能的开放程度会因“人”而异。对,优质的接口只会开放给腾讯的儿子们(滴滴呀、京东呀)""http://music.163.com/song/media/outer/url?id=108119.mp3""/images/post/vr.png""http://music.163.com/song/media/outer/url?id=188204.mp3""爱奇艺和创维分别作为国内领先的在线视频品牌和家电品牌。双方一直锐意创新,为用户提供优质的服务体验和产品体验。据悉,爱奇艺与创维将展开从资本到VIP会员服务等各方面的深入合作。籍由此次合作,爱奇艺将战略投资创维旗下拥有高端互联网电视品牌的酷开公司。从下一财年开始,创维旗下互联网电视将通过银河互联网电视集成播控平台,预置VIP会员服务及相关内容。这种捆绑终端与VIP内容的全新销售模式,将大幅提升互联网电视终端用户的体验,给予用户更多优质内容的选择。""http://music.163.com/song/media/outer/url?id=152428.mp3" {
    postList: local_database
}

最后是全局相关配置

app.json

{
  "pages": [
    "pages/welcome/welcome"
  ],"window": {
    "navigationBarBackgroundColor": "#405f80"
  },"tabBar": {
    "borderStyle": "white": [
      {
        "pagePath": "pages/posts/post"
      },{
        "pagePath": "pages/posts/post"
      }
    ]
  }
}

app.wxss

text{
    font-family: MicroSoft Yahei;

input{ MicroSoft YaHei;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


概述 消息能力是小程序能力中的重要组成,我们为开发者提供了订阅消息能力,以便实现服务的闭环和更优的体验。 订阅消息推送位置:服务通知 订阅消息下发条件:用户自主订阅 订阅消息卡片跳转能力:点击查看详情可提爱转至该小程序的页面 消息类型 一次性订阅消息 一次性订阅消息用于解决用户使用小程序后,后续服务
判断H5页面环境在微信中还是小程序中 用小程序提供的wx.miniProgram.getEnv可以获取环境参数 &lt;script type=&quot;text/javascript&quot; src=&quot;https://res.wx.qq.com/open/js/jweixin-1.
wx.reLaunch和wx.navigateTo,wx.navigateTo的区别 2019-03-23 11:18:05 wx.navigateTo 用于保留当前页面、跳转到应用内的某个页面,使用 wx.navigateBack可以返回到原页面。对于页面不是特别多的小程序,通常推荐使用 wx.n
微信小程序如何从数组里取值_微信小程序 传值取值的几种方法总结 小程序里常见的取值有以下几种,一个完整的项目写下来,用到的概率几乎是100%。 列表index下标取值 页面传值 form表单取值 1. 列表index下标取值 实现方式是:data-index=&quot;{{index}}&quot
H5项目接入微信授权登录,通过 UA 区分微信还是普通浏览器: let&#160;ua&#160;=&#160;navigator.userAgent.toLowerCase(); let&#160;isWeixin&#160;=&#160;ua.indexOf(&#39;micromessenge
微信小程序获取data-xx=&quot;&quot;属性的值,自定义属性设置和获取(data-) 微信小程序&lt;view class=&quot;details-btn&quot; data-taskId=&quot;111&quot; bindtap=&#39;taskdetails&#39
小程序报错:TypeError: Cannot read property ‘addEventListener‘ of undefined 解决办法 将调试基础库由2.16.0(或者当前的) -&gt; 2.14.1 解决问题
H5跳转微信小程序-成功案例(VUE)(踩坑无数) TuoMei 已于 2022-07-29 09:52:22 修改 准备工作 根据官方提供的资料需准备以下几点: 1、已认证的服务号 2、绑定JS接口安全域名 (在微信公众平台设置) 3、IP白名单 (在微信公众平台设置) 4、将小程序和H5公众号进
微信小程序 页面跳转和数据传递实例详解 这篇文章主要介绍了微信小程序 页面跳转和数据传递实例详解的相关资料,这里附有实例代码帮助到家学习理解,需要的朋友可以参考下 微信小程序 页面跳转和数据传递 1.先导 在Android中,我们Activity和Fragment都有栈的概念在里面,微信小程序页面也
情景1.拉取公司代码演示: 因为github有墙,这里我们以gitee(码云)为例作为演示 (其实就是国产github,也非常好用~) 步骤一:打开Git界面 先在一个空文件夹右击Git Bash Here,打开git界面 步骤二:输入克隆远程仓库指令 别人复制的链接在这里获取 拿到别人赋值的链接自
如何开发微信小程序? 作为一名10多年一直从事互联网平台开发的从业者,我来回答下这个问题吧。 微信小程序开发流程总体可以归纳为4个步骤, 老张带您捋一捋整个环节,小白用户可以收藏了。 好了废话不多说,开始! 一、开发前小程序需要准备的资料 我们在开发微信小程序前,需要准备下相关资料。这个资料主要是后
原生小程序开发优化方案 为了更好的制定优化方案,我们 有必要先了解下小程序的底层架构、以及与普通网页开发的差异 小程序最终渲染载体与当下一些热门的技术 Flutter、React Native等不同,依然是浏览器内核,而不是原生客户端。 而对于传统的网页来说,UI 渲染和 JS 脚本是在同一个线程中
1,不要下两倍尺寸的图片, 小程序本身自己就会对元素缩小两倍,设计图片的一杯就已经很清晰了。 2,图片压缩,(主要是压缩静态资源,ps 可以压缩,然后有一些在线压缩工具,保持600-800kb 的静态) 3,通用的代码组件化 4,是在工程量太大可以分包,分包现在最大支持20m(一般都不会去分包的)
文章浏览阅读189次。人工智能研究实验室OpenAI在2022年11月30日发布了自然语言生成模型ChatGPT,上线两个月就已经超过一亿用户,成为了人工智能界当之无愧的超级大网红。ChatGPT凭借着自身强大的拟人化及时应答能力迅速破圈,引起了各行各业的热烈讨论。简单来说ChatGPT就是可以基于用户文本输入自动生成回答的人工智能聊天机器人。那肯定会有人说这不就是Siri嘛,虽然都是交互机器人但是两者的差别可老大了。那么ChatGPT在人机交互时为什么会有这么出色的表现?它到底会不会取代搜索引擎?90%的人真的会因为ChatG
文章浏览阅读193次。8. 导航和路由管理:掌握小程序的导航方式,如使用wx.navigateTo跳转页面、使用wx.redirect重定向页面等,学会实现页面之间的跳转和传参。1. 小程序的基本概念和架构:了解小程序的定义、特点以及与传统APP的区别,掌握小程序的运行环境、组件和API等基本概念。10. 支付功能:学习小程序的支付方式,如微信支付、支付宝支付等,了解支付流程和注意事项,学会实现小程序的支付功能。9. 用户授权和登录:了解小程序的用户授权机制,如获取用户信息、调用微信API等,学会实现用户的登录和注册功能。_微信小程序开发知识点总结
文章浏览阅读4.8k次,点赞7次,收藏18次。一、准备工作1. 安装微信开发者工具,并登录微信小程序账号;2. 准备斗地主游戏的图片资源;3. 准备斗地主游戏的音效资源;二、创建小程序1. 打开微信开发者工具,点击“新建小程序”,输入小程序名称,选择小程序的项目目录,点击“创建”;2. 在小程序的项目目录中,新建文件夹“images”,将准备好的斗地主游戏的图片资源放入“images”文件夹中;3. 在小程序的项目目录中,新建文件夹“sounds”,将准备好的斗地主游戏的音效资源放入“sounds”文件夹中;三、编写代码1. 在小程_扑克牌微信小程序代码
文章浏览阅读3.9k次,点赞3次,收藏7次。一、准备工作:1. 安装微信开发者工具,创建小程序项目;2. 准备游戏角色图片;3. 准备游戏背景音乐;二、实现步骤:1. 创建游戏页面,添加游戏角色图片,添加游戏背景音乐;2. 创建游戏角色类,定义游戏角色属性,如角色名称、角色图片、角色能力等;3. 创建游戏类,定义游戏属性,如游戏人数、游戏角色、游戏规则等;4. 创建游戏控制类,定义游戏流程,如游戏开始、游戏结束、游戏角色分配等;5. 创建游戏界面,实现游戏流程,如游戏开始、游戏结束、游戏角色分配等;6. 创建游戏结果页面,显示游戏_微信小程序游戏代码
文章浏览阅读1.7k次。1. 创建小程序项目:使用微信开发者工具创建一个小程序项目,并在项目中添加一个页面,用于模拟聊天。 2. 定义数据结构:定义一个数据结构,用于存储聊天记录,包括发送者、接收者、消息内容等信息。 3. 实现聊天功能:实现聊天功能,包括发送消息、接收消息、显示消息等功能。 4. 实现界面:使用微信小程序的界面框架,实现聊天界面,包括聊天记录列表、输入框等。代码示例:// 定义数据结构var chatData = { sender: '', receiver: '', message: '' };_制作聊天对话小程序代码
文章浏览阅读2.1k次。1、创建小程序项目:使用微信开发者工具,新建一个小程序项目,输入项目名称,选择项目目录,点击“创建”按钮,即可创建小程序项目。2、添加页面:在小程序项目中,可以添加多个页面,每个页面都有自己的页面文件,比如首页、分类页、购物车页、我的页面等。3、添加组件:在小程序项目中,可以添加多个组件,比如商品列表组件、购物车组件、订单组件等,用于在页面中显示商品信息、购物车信息、订单信息等。4、添加接口:在小程序项目中,可以添加多个接口,用于获取商品信息、购物车信息、订单信息等,以便在页面中显示。5、_微信开发者工具做一个我的商城